运行 大数据时 XSSFCell 在设置值时导致锁定

XSSFCell causing lock while setting value when running with huge data

我正在向 Excel sheet 写入大量数据。我正在使用 XSSFWorkbook 进行 excel 创建。

对于 20,000 行,excel 写入没问题。但是当我尝试写入超过 100 万的数据时,excel sheet 超过 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)

我们该如何处理。 请帮我解决这个问题。

SXSSFWorkbook 可能是一个很好的解决方案(上面的评论)——如果你想使用 XSSFWorkbook,你可以使用 XSSFFactory,它提供更适合你需要的 SharedStringsTable(查看你的堆栈跟踪,它是导致锁定的 SharedStringsTable )

XSSFWorkbook Constructor 将 XSSFFactory 实例作为输入

Custom XSSFFactory example 创建自定义 SharedStringsTable。这个使用临时文件来存储共享字符串数据,但您可以修改它以将数据保存在 HashMap 中。