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

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

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


温温酱
浏览 304回答 1
1回答

幕布斯7119047

SXSSFWorkbook 可能是一个很好的解决方案(上面的评论)-如果您想使用 XSSFWorkbook,您可以使用 XSSFFactory 来提供更适合您需要的 SharedStringsTable(请参阅您的堆栈跟踪,它是导致锁定的 SharedStringsTable)将 XSSFFactory 实例作为输入的XSSFWorkbook 构造函数创建自定义 SharedStringsTable 的自定义 XSSFFactory 示例。这个文件使用共享字符串数据的临时文件,但您可以修改它以将数据保存在 HashMap 中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java