1

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

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

4

1 回答 1

0

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

将 XSSFFactory 实例作为输入的XSSFWorkbook 构造函数

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

于 2018-10-04T19:47:18.587 回答