Apache POI-3.14版本 导出出现 The maximum column width for an individual cell is 255 characters解决方案。

java.lang.IllegalArgumentException: The maximum column width for an individual cell is 255 characters.
org.apache.poi.xssf.usermodel.XSSFSheet.setColumnWidth(XSSFSheet.java:2386)
com.lemon.web.XExcelServlet.attach(XExcelServlet.java:69)
com.lemon.web.XExcelServlet.writeExcel(XExcelServlet.java:171)
com.lemon.web.XExcelServlet.doGet(XExcelServlet.java:149)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:404)
org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:136)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)


报错原因:因为使用setColumnWidth()设置的宽度大于Excel的单元格大小,Excel单元格的最大宽度为255超过这个数会出错。

问题代码:当newWidth的长度大于65000会导致报错

/**
 * 自动调整列宽
 *
 * @param sheet
 * @param columnNumber
 */
private static void autoSizeColumns(Sheet sheet, int columnNumber) {
   sheet.setColumnWidth(0, 1600);
    for (int i = 1; i < columnNumber; i++) {
        int orgWidth = sheet.getColumnWidth(i);
        sheet.autoSizeColumn(i, true);
        // 当newWidth的长度大于65000会导致报错
        int newWidth = (int) (sheet.getColumnWidth(i) + 100);
        if (newWidth > orgWidth) {
            sheet.setColumnWidth(i, newWidth);
        } else {
            sheet.setColumnWidth(i, orgWidth);
        }
    }
}

解决方案: 限制列宽宽度或者注释掉设置宽度的代码。

/**
 * 自动调整列宽
 *
 * @param sheet
 * @param columnNumber
 */
private static void autoSizeColumns(Sheet sheet, int columnNumber) {
    sheet.setColumnWidth(0, 1600);
    for (int i = 1; i < columnNumber; i++) {
        int orgWidth = sheet.getColumnWidth(i);
        sheet.autoSizeColumn(i, true);
        int newWidth = (int) (sheet.getColumnWidth(i) + 100);
        // 当获取的列宽大于15000 进行修改
        if (newWidth > 15000) { 
        // sheet.setColumnWidth(i, 15000);可以根据自己想要的列宽进行修改,测试过最大设置65000正常使用 
            sheet.setColumnWidth(i, 15000);
        } else if (newWidth > orgWidth) {
            sheet.setColumnWidth(i, newWidth);
        } else {
            sheet.setColumnWidth(i, orgWidth);
        }
    }
}

EXCEL列高度的单位是磅,Apache POI的行高度单位是缇(twip)

Excel的行高度和宽度单位是不一样的。
Excel列宽的单位是磅,Apache POI的行高度单位是缇(twip):
1英寸 = 72磅 = 25.4毫米 = 1440缇
1磅 = 0.353毫米 = 20缇
POI中的行高 = Excel的行高度*20
Excel的行高度 = POI中的行高度/20

POI中的宽度算法

Double 宽度 = (字符个数 * (字符宽度 -1) + 5) / (字符宽度 -1) * 256;
例子:
width = ([numChars*7+5]/7*256)/256 = 8;这给了7.29。
width = ([{可见字符数}*{最大数字宽度}+{5像素填充}]/{最大数字宽度}*256)/256

ApachePOI API文档

https://poi.apache/apidocs/dev/org/apache/poi/ss/usermodel/Sheet.html#getColumnWidth-int-

方法解释: void setColumnWidth(int columnIndex,int width)

方法解释: int getColumnWidth(int columnIndex)

更多推荐

ApachePOI-3.14版本 导出出现 The maximum column width for an individual cell is 255 cha