SXSSFWorkbook workbook = new SXSSFWorkbook();// 創建一個Excel文件 Sheet sheet = workbook.createSheet(filename);// 創建一個Excel的Sheet ...... row = sheet.getRow(parDepRowIdx); if (row == null) { row = sheet.createRow(parDepRowIdx); }
row在前面已經create過,但在這里get到的值為null(不知道什么原因),再次使用create時報錯“Attempting to write a row[?] in the range [0,?]that is already written to disk”。
報錯原因:當前要創建的行小於等於最近已經創建的行時,就會拋出異常。SXSSFWorkbook其本身實現方式在於,不斷的將一定行數的表格寫入臨時文檔,最終將所有的臨時文檔合並起來,這種方式中保證了內存的占用數理想,並且導出的效率也比較理想。在這種實現中,如果一個行已經寫入臨時文檔了,就不能再修改了,因此在源代碼中直接限制了重復創建並寫同一欄,並在此拋出異常。
解決方法:
使用XSSFWorkbook替代SXSSFWorkbook,,然后直接用getRow獲取行
XSSFWorkbook workbook = new XSSFWorkbook();// 創建一個Excel文件 Sheet sheet = workbook.createSheet(filename);// 創建一個Excel的Sheet
轉相關文章:https://www.dazhuanlan.com/2019/12/05/5de8b4f10760f/