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
发布评论