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/