首页 > 代码库 > The maximum number of cell styles was exceeded. You can define up to 4000 styles

The maximum number of cell styles was exceeded. You can define up to 4000 styles

POI操作Excel中,导出的数据不是很大时,则不会有问题,而数据很多或者比较多时,

就会报以下的错误,是由于cell styles太多create造成,故一般可以把cellstyle设置放到循环外面

报错如下:

Caused by: java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
at org.apache.poi.hssf.usermodel.HSSFWorkbook.createCellStyle(HSSFWorkbook.java:1144)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.createCellStyle(HSSFWorkbook.java:88)
at com.trendmicro.util.toExcel.ExcelExporter.addWorkbook(ExcelExporter.java:612)
at com.trendmicro.util.toExcel.ExcelExporter.exportToExcel(ExcelExporter.java:112)
at com.trendmicro.util.toExcel.ReportExporter.exportAutomationReport(ReportExporter.java:190)
at com.trendmicro.view.reports.TestCaseAutomationBean.exportAutoReport(TestCaseAutomationBean.java:856)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:191)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 33 more

-------------示例--------------

错误示例

[java] view plaincopyprint?
 
  1. for (int i = 0; i < 10000; i++) {  
  2.     Row row = sheet.createRow(i);   
  3.     Cell cell = row.createCell((short) 0);   
  4.     CellStyle style = workbook.createCellStyle();  
  5.     Font font = workbook.createFont();   
  6.     font.setBoldweight(Font.BOLDWEIGHT_BOLD);   
  7.     style.setFont(font);   
  8.     cell.setCellStyle(style);  
  9. }  

改正后正确代码

[java] view plaincopyprint?
 
  1. CellStyle style = workbook.createCellStyle();  
  2. Font font = workbook.createFont();  
  3. font.setBoldweight(Font.BOLDWEIGHT_BOLD);  
  4. style.setFont(font);  
  5. for (int i = 0; i < 10000; i++) {   
  6.     Row row = sheet.createRow(i);   
  7.     Cell cell = row.createCell((short) 0);   
  8.     cell.setCellStyle(style);  
  9. }  

 

以上方法原地址:http://blog.csdn.net/hoking_in/article/details/7919530


方法二(不推荐,影响性能):

1.4000最大样式错误

 

java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook错误

 

找到zpoi.jar中org.zkoss.poi.hssf.usermodel.HSSFWorkbook修改createCellStyle函数内的最大样式数量即可。重新打zpoi.jar即可。

 

[java] view plaincopyprint?
 
  1. public HSSFCellStyle createCellStyle()  
  2. {  
  3.     if(workbook.getNumExFormats() == MAX_STYLES) {  
  4.         throw new IllegalStateException("The maximum number of cell styles was exceeded. " +  
  5.                 "You can define up to 4000 styles in a .xls workbook");  
  6.     }  
  7.     ExtendedFormatRecord xfr = workbook.createCellXF();  
  8.     short index = (short) (getNumCellStyles() - 1);  
  9.     HSSFCellStyle style = new HSSFCellStyle(index, xfr, this);  
  10.     workbook.createCellXFExt(index);   
  11.     return style;  
  12. }  

 


IE兼容问题

如果IE系列的浏览器出现了兼容问题(具体就是显示不出报表来),我已知的可能出现的问题有,Excel模板里有数字已字符串形式写入,或者是写日期格式的单元格出现了写入错误。具体的解决如下。

数字形式写入代码

[java] view plaincopyprint?
 
  1. public static Cell writeNumericValue(Sheet sheet, int row, int column,  
  2.         Double value) {  
  3.     Row poiRow = sheet.getRow(row);  
  4.     if (poiRow == null) {  
  5.         poiRow = sheet.createRow(row);  
  6.     }  
  7.     Cell poiCell = poiRow.getCell(column);  
  8.   
  9.     if (poiCell != null) {  
  10.         poiRow.removeCell(poiCell);  
  11.     }  
  12.     poiCell = poiRow.createCell(column);  
  13.     poiCell.setCellType(Cell.CELL_TYPE_NUMERIC);  
  14.     poiCell.setCellValue(value);  
  15.     return poiCell;  
  16. }  


写入日期代码

[java] view plaincopyprint?
 
  1. public static Cell writeDateValue(Workbook book, Sheet sheet, int row,  
  2.         int column, Date value) {  
  3.     Row poiRow = sheet.getRow(row);  
  4.     CreationHelper createHelper = book.getCreationHelper();  
  5.     if (poiRow == null) {  
  6.         poiRow = sheet.createRow(row);  
  7.     }  
  8.     Cell poiCell = poiRow.getCell(column);  
  9.   
  10.     if (poiCell == null) {  
  11.         poiCell = poiRow.createCell(column);  
  12.     }  
  13.   
  14.     CellStyle cellStyle = book.createCellStyle();  
  15.     cellStyle.setDataFormat(createHelper.createDataFormat().getFormat(  
  16.             "yyyy-mm-dd"));  
  17.     if (value != null) {  
  18.         poiCell.setCellValue(value);  
  19.     } else {  
  20.         poiCell.setCellValue(new Date());  
  21.     }  
  22.     poiCell.setCellStyle(cellStyle);  
  23.   
  24.     return poiCell;  
  25. }  


 以上方法原地址:http://realgodo.iteye.com/blog/1105529

 

The maximum number of cell styles was exceeded. You can define up to 4000 styles