alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
31.65k stars 7.46k forks source link

同一sheet写入多个table,分别为table设置header并设置relativeHeadRowIndex属性后,第一个表头与内容之间也会出现偏移 #2655

Open fluffycatkin opened 1 year ago

fluffycatkin commented 1 year ago

同一sheet写入多个table,分别为table设置header并设置relativeHeadRowIndex属性后,第一个表头与内容之间也会出现偏移

代码为提供的测试代码的基础上修改


@Test
    public void tableWrite() {
        String fileName = TestFileUtil.getPath() + "tableWrite" + System.currentTimeMillis() + ".xlsx";
        // 方法1 这里直接写多个table的案例了,如果只有一个 也可以直一行代码搞定,参照其他案
        // 这里 需要指定写用哪个class去写
        try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
            // 把sheet设置为不需要头 不然会输出sheet的头 这样看起来第一个table 就有2个头了
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build();
            // 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
            WriteTable writeTable0 = EasyExcel.writerTable(0).relativeHeadRowIndex(3).needHead(Boolean.TRUE).head(this.head()).build();
            WriteTable writeTable1 = EasyExcel.writerTable(1).relativeHeadRowIndex(3).needHead(Boolean.TRUE).head(this.head()).build();
            // 第一次写入会创建头
            excelWriter.write(data(), writeSheet, writeTable0);
            // 第二次写如也会创建头,然后在第一次的后面写入数据
            excelWriter.write(data(), writeSheet, writeTable1);
        }
    }
Ramelon commented 6 months ago

1705543306982 复现bug如上所示,代码如下,第一个WriteTable 设置relativeHeadRowIndex的时候内容也会浮动

    WriteTable writeTable0 = EasyExcel.writerTable(1)
            .head(head(MediaTypeEnum.BROADCAST.getType()))
            .registerWriteHandler(new SimpleColumnWidthStyleStrategy(20))
            .registerWriteHandler(new CustomSheetWriteHandler(title,analysisContent))
            .useDefaultStyle(true).relativeHeadRowIndex(2)
            .needHead(Boolean.TRUE).build();

    WriteTable writeTable1 = EasyExcel.writerTable(2)
            .head(head(MediaTypeEnum.TELEVISION.getType()))
            .relativeHeadRowIndex(1)
            .needHead(Boolean.TRUE).build();

    WriteTable writeTable2 = EasyExcel.writerTable(3)
            .head(head(MediaTypeEnum.BLUE_MEDIA.getType()))
            .needHead(Boolean.TRUE)
            .relativeHeadRowIndex(1)
            .build();

    WriteTable writeTable3 = EasyExcel.writerTable(4)
            .head(head(MediaTypeEnum.LEARN_POWER_COUNTRY.getType()))
            .relativeHeadRowIndex(1)
            .needHead(Boolean.TRUE).build();

    WriteTable writeTable4 = EasyExcel.writerTable(5)
            .head(head(MediaTypeEnum.NEWSPAPER.getType()))
            .relativeHeadRowIndex(1)
            .needHead(Boolean.TRUE)
            .build();

    ExcelWriter excelWriter = EasyExcel.write(fileName).build();
    WriteSheet sheet = EasyExcel.writerSheet(0, "报表数据").build();

    excelWriter.write(getTableDataLists(broadcastList), sheet, writeTable0);
    excelWriter.write(getTableDataLists(televisionList), sheet, writeTable1);
    excelWriter.write(getTableDataLists(excludeLearn), sheet, writeTable2);
    excelWriter.write(getTableDataLists(containLearn), sheet, writeTable3);
    excelWriter.write(getTableDataLists(newsPaperList), sheet, writeTable4);
    //完成
    excelWriter.finish();