zoukankan      html  css  js  c++  java
  • 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

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

    错误示例

    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. }  

    改正后正确代码

    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即可。

    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模板里有数字已字符串形式写入,或者是写日期格式的单元格出现了写入错误。具体的解决如下。

    数字形式写入代码

    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. }  


    写入日期代码

    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 Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/exmyth/p/3956963.html
Copyright © 2011-2022 走看看