我正在写一个巨大的数据到Excel表格。我使用XSSFWorkbook来创建excel。
对于20,000行,excel编写是可以的。但是,当我试图写一个100多万的数据时,excel表格在3个小时内才会出来。当我分析jstack时,我发现有一个锁是在
XSSFCell cell = row.createCell( colNum );
cell.setCellValue( value );将值设置为单元格,
下面是jstacks,
java.lang.Thread.State: RUNNABLE
at org.apache.xmlbeans.impl.store.Saver$TextSaver.resize(Saver.java:1700)
at org.apache.xmlbeans.impl.store.Saver$TextSaver.preEmit(Saver.java:1303)
at org.apache.xmlbeans.impl.store.Saver$TextSaver.emit(Saver.java:1190)
at org.apache.xmlbeans.impl.store.Saver$TextSaver.emitElement(Saver.java:962)
at org.apache.xmlbeans.impl.store.Saver.processElement(Saver.java:476)
at org.apache.xmlbeans.impl.store.Saver.process(Saver.java:307)
at org.apache.xmlbeans.impl.store.Saver$TextSaver.saveToString(Saver.java:1864)
at org.apache.xmlbeans.impl.store.Cursor._xmlText(Cursor.java:546)
at org.apache.xmlbeans.impl.store.Cursor.xmlText(Cursor.java:2436)
**- locked <0x000000076354cdc0> (a org.apache.xmlbeans.impl.store.Locale)**
at org.apache.xmlbeans.impl.values.XmlObjectBase.xmlText(XmlObjectBase.java:1500)
at org.apache.poi.xssf.model.SharedStringsTable.getKey(SharedStringsTable.java:134)
at org.apache.poi.xssf.model.SharedStringsTable.addEntry(SharedStringsTable.java:180)
at org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(XSSFCell.java:350)
at org.apache.poi.xssf.usermodel.XSSFCell.setCellValue(XSSFCell.java:320)我们怎么处理这件事。请帮我解决这个问题。
发布于 2018-10-04 19:47:18
SXSSFWorkbook可能是一个很好的解决方案(上面的注释)--如果您想使用XSSFWorkbook,您可以使用一个提供更适合您需要的SharedStringsTable的XSSFFactory (参见堆栈跟踪,导致锁定的是SharedStringsTable )。
XSSFWorkbook构造器,它以XSSFFactory实例作为输入
创建自定义自定义XSSFFactory示例的SharedStringsTable。这个文件使用一个临时文件来处理共享的字符串数据,但是您可以修改它以将数据保存在HashMap中。
https://stackoverflow.com/questions/52227297
复制相似问题