我正在將大量數(shù)據(jù)寫(xiě)入 Excel 工作表。我正在使用 XSSFWorkbook 創(chuàng)建 excel。對(duì)于 20,000 行,excel 寫(xiě)入很好。但是當(dāng)我嘗試寫(xiě)入超過(guò)100萬(wàn)的數(shù)據(jù)時(shí),excel表超過(guò)3個(gè)小時(shí)都沒(méi)有出來(lái)。當(dāng)我分析時(shí)jstack,我發(fā)現(xiàn)有一個(gè)正在創(chuàng)建的鎖XSSFCell cell = row.createCell( colNum );cell.setCellValue( value );為單元格設(shè)置值,以下是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)我們?cè)撊绾翁幚怼U?qǐng)幫我解決這個(gè)問(wèn)題。
1 回答

幕布斯7119047
TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
SXSSFWorkbook 可能是一個(gè)很好的解決方案(上面的評(píng)論)-如果您想使用 XSSFWorkbook,您可以使用 XSSFFactory 來(lái)提供更適合您需要的 SharedStringsTable(請(qǐng)參閱您的堆棧跟蹤,它是導(dǎo)致鎖定的 SharedStringsTable)
將 XSSFFactory 實(shí)例作為輸入的XSSFWorkbook 構(gòu)造函數(shù)
創(chuàng)建自定義 SharedStringsTable 的自定義 XSSFFactory 示例。這個(gè)文件使用共享字符串?dāng)?shù)據(jù)的臨時(shí)文件,但您可以修改它以將數(shù)據(jù)保存在 HashMap 中。
添加回答
舉報(bào)
0/150
提交
取消