[alibaba/easyexcel]关于写单个sheet中多个table和写多个sheet含有单个table的问题

2024-06-20 776 views
4

您好,我在使用easyexcel写excel的时候,发现有以下的问题: 1、向单个sheet中连续调用 writer.write1(),写入数据时,可以实现追加行到sheet中 2、向多个sheet中分别连续调用 writer.write1(),写入数据时,最终的结果是,每个sheet中的写入的数据的效果和向sheet中写入多个table一样。

效果截图如下: image image 使用的代码如下: writer.write1(data, sheet1);//我是连续的调用write1方法

实际上,我发现您在源码中是判断了WriteContext.currentSheetParam和传入的sheet是否指向的同一个sheet,然后执行initCurrentSheet(sheet),重新初始化了表头。但是由于每次记录的都是上一个sheet,那么我循环写入同一个sheet时,就会误判成一个新的sheet,然后就导致重新初始化了表头。。。。

我暂时的解决方案是,在调用writer.write1()之前,先通过反射的方式设置了currentSheetParam和currentSheet。

希望您可以在源码 中兼容这种方式的写操作。

回答

9

哥们,我也发现这个问题。 如果将 输出流关闭再打开的话。 就不能在到后方追加新的sheet页了,代码会重复覆盖之前的sheet页。即使要写入的excel有足够的sheet页 页不行,请问你的解决方法,我可以看下你的解决代码么。

4

通过反射,自行解决了这块的问题,代码如下,仅供参考 /**

  • EasyExcel 源码有bug https://github.com/alibaba/easyexcel/issues/199
  • 所以此方法内做处理,防止出现上述问题
  • @param excelWriter
  • @param sheet */ private static void setCurrentSheet(ExcelWriter excelWriter, Sheet sheet) { Class excelWriterClazz = excelWriter.getClass(); try { Field excelBuilderField = excelWriterClazz.getDeclaredField("excelBuilder"); excelBuilderField.setAccessible(true); ExcelBuilderImpl excelBuilder = (ExcelBuilderImpl) excelBuilderField.get(excelWriter);

        Class<?> excelBuilderClazz = excelBuilder.getClass();
        Field contextField = excelBuilderClazz.getDeclaredField("context");
        contextField.setAccessible(true);
        WriteContext writeContext = (WriteContext) contextField.get(excelBuilder);
    
        if (writeContext.getCurrentSheetParam() == null) {
            return;
        } else {
            org.apache.poi.ss.usermodel.Sheet currentSheet = writeContext.getWorkbook().getSheetAt(sheet.getSheetNo() - 1);//此处如果获取报错,说明为easyexcel还未生成sheet,只需try catch住就可以
            if(currentSheet != null){
                writeContext.setCurrentSheet(currentSheet);
                if (writeContext.getCurrentSheetParam() != sheet) {
                    writeContext.setCurrentSheetParam(sheet);
                }
            }
    
        }
    } catch (Exception e) {
        log.info("名为【"+sheet.getSheetName()+"】的sheet页未初始化,无需设置,easyExcel内部将设置" +sheet.getSheetNo());
    }

    }