我正在将大量数据写入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)
我们该如何处理。 请帮助我解决此问题。
答案 0 :(得分:0)
SXSSFWorkbook可能是一个很好的解决方案(上面的评论)-如果您想使用XSSFWorkbook,则可以使用XSSFFactory,该XSSFFactory提供的SharedStringsTable更适合您的需求(请参阅您的堆栈跟踪,这是导致锁定的SharedStringsTable)< / p>
XSSFWorkbook Constructor,它将XSSFFactory实例作为输入
Custom XSSFFactory example,用于创建自定义的SharedStringsTable。这个使用临时文件存储共享字符串数据,但是您可以对其进行修改以将数据保留在HashMap中。