XSSFCell在处理大量数据时设置值时导致锁定

时间:2018-09-07 17:40:58

标签: java excel apache-poi xssf

我正在将大量数据写入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)

我们该如何处理。 请帮助我解决此问题。

1 个答案:

答案 0 :(得分:0)

SXSSFWorkbook可能是一个很好的解决方案(上面的评论)-如果您想使用XSSFWorkbook,则可以使用XSSFFactory,该XSSFFactory提供的SharedStringsTable更适合您的需求(请参阅您的堆栈跟踪,这是导致锁定的SharedStringsTable)< / p>

XSSFWorkbook Constructor,它将XSSFFactory实例作为输入

Custom XSSFFactory example,用于创建自定义的SharedStringsTable。这个使用临时文件存储共享字符串数据,但是您可以对其进行修改以将数据保留在HashMap中。