我发现从2+版本升到3+版本后出现一个设置合并单元格边框的时候,会报错问题。
[alibaba/easyexcel]我发现从2+版本升到3+版本后出现一个设置合并单元格边框的时候,会报错问题。
回答
2.2.10 升级到 3.0.2出现的该问题; 操作场景: 不创建对象的写入;好像是这一块影响的;但是不知道为啥,2.2.10版本都是好的;
错误信息: Exception in thread "main" java.lang.IllegalArgumentException: Attempting to write a row[0] in the range [0,508] that is already written to disk. at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:131) at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:65) at org.apache.poi.ss.util.CellUtil.getRow(CellUtil.java:135) at org.apache.poi.ss.util.RegionUtil.setBorderTop(RegionUtil.java:193) at com.pabula.newexport.CellStrategy.goBorderOpt(CellStrategy.java:216) at com.pabula.newexport.CellStrategy.lambda$setBorderStyle$0(CellStrategy.java:189) at java.util.HashMap.forEach(HashMap.java:1289) at com.pabula.newexport.CellStrategy.setBorderStyle(CellStrategy.java:188) at com.pabula.newexport.CellStrategy.afterCellDispose(CellStrategy.java:111) at com.alibaba.excel.write.handler.CellWriteHandler.afterCellDispose(CellWriteHandler.java:101) at com.alibaba.excel.write.handler.chain.CellHandlerExecutionChain.afterCellDispose(CellHandlerExecutionChain.java:54) at com.alibaba.excel.write.handler.chain.CellHandlerExecutionChain.afterCellDispose(CellHandlerExecutionChain.java:56) at com.alibaba.excel.util.WriteHandlerUtils.afterCellDispose(WriteHandlerUtils.java:148) at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.doAddBasicTypeToExcel(ExcelWriteAddExecutor.java:138) at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addBasicTypeToExcel(ExcelWriteAddExecutor.java:114) at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addOneRowOfDataToExcel(ExcelWriteAddExecutor.java:78) at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.add(ExcelWriteAddExecutor.java:58) at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:59) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:73) at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:50) at com.pabula.newexport.BuExcel.write(BuExcel.java:97) at com.pabula.newexport.BuExcel.render(BuExcel.java:118) at com.pabula.newexport.myTest.test1ttttttt1(myTest.java:210) at com.pabula.newexport.myTest.main(myTest.java:25)
能不能贴全代码 没法复现
从这里开始;其中的region是收集的需要跨行的列位置的信息;如下 CellRangeAddress region = new CellRangeAddress((int) list.get(0), (int) list.get(1), (int) list.get(2), (int) list.get(3));
紧接着走到了这里;
然后走到了这里,CreateRow(0);
最终走到了这里;抛出了异常;
大佬这种问题如何处理;
原因好像是一批数据已经放入内存,最后合并单元格边框线样式的时候会出现找不到所需要的row,因为那批数据已经被放在内存里,接着就报错了,之前版本都是好好的,这个问题该怎么解决呢?
2个方案
- 设置inmoery=true 这样会很耗内存
- 调用
com.alibaba.excel.write.handler.RowWriteHandler#afterRowDispose(com.alibaba.excel.write.handler.context.RowWriteHandlerContext)
事件 每一行处理完都会回到
2个方案
- 设置inmoery=true 这样会很耗内存
- 调用
com.alibaba.excel.write.handler.RowWriteHandler#afterRowDispose(com.alibaba.excel.write.handler.context.RowWriteHandlerContext)
事件 每一行处理完都会回到
第一种方案:inmoery=true 不能解决原始问题;没有效果。其替代方案是设置writeWorkbookHolder.setWorkbook(new SXSSFWorkbook(-1));这样设置会很消耗内存; 第二种方案:经过调试可行; 多谢指导;
第一种方案:inmoery=true 不能解决原始问题;没有效果。其替代方案是设置writeWorkbookHolder.setWorkbook(new SXSSFWorkbook(-1));这样设置会很消耗内存; 另一种方案:调试产生; 多谢指导;
我也出现同样的问题,我试了你那种方法,也不行啊,到了设置border的时候直接NullPointException了, 请教一下详细代码
第一种方案:inmoery=true 不能解决原始问题;没有效果。其替代方案是设置writeWorkbookHolder.setWorkbook(new SXSSFWorkbook(-1));这样设置会很消耗内存; 另一种方案:调试产生; 多谢指导;
我也出现同样的问题,我试了你那种方法,也不行啊,到了设置border的时候直接NullPointException了, 请教一下详细代码
你好,以上是详细代码,具体实现步骤是先给每个格子设置样式,然后在合并的时候取【合并的第一个格子的CellStyle】做为合并样式;
我用的 easyexcel 3.1.0 版本,加了 inMemory = true 就解决了,代码如下
ExcelWriter excelWriter = EasyExcel.write(exportFile).excelType(typeEnum).inMemory(true)
.withTemplate(resourceAsStream).build()