java解决poi导出excel使用SXSSF时“Attempting to write a row[?] in the range [0,?]that is already written to disk.”异常

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/

原文地址:https://www.cnblogs.com/BobXie85/p/12362961.html