[alibaba/easyexcel]二次写入的问题

2024-05-24 886 views
7

首页示例的写入代码

// 方法3 如果写到不同的sheet 不同的对象 fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx"; // 这里 指定文件 excelWriter = EasyExcel.write(fileName).build(); // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面 for (int i = 0; i < 5; i++) { // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变 writeSheet = EasyExcel.writerSheet(i, "模板").head(DemoData.class).build(); // 分页去数据库查询数据 这里可以去数据库查询每一页的数据 List<DemoData> data = data(); excelWriter.write(data, writeSheet); } /// 千万别忘记finish 会帮忙关闭流 excelWriter.finish();

上面的代码 在使用的时候发现一个问题 ,第二次写入的时候 把 第一次写入的数据覆盖了 可以追加写入么? 比如第一次写入的是1-5个sheet 第二次想写入6-10 个sheet ,同时 1-5的还保留

实际使用中 第二次写入后 覆盖了 1-5的sheet

回答

3

是这样的,一次导出保持excelWriter不finish,在中间做逻辑,可以解决大部分情况

    @Test
    public void firstWrite() {
        String firstfileName = "D://1.xlsx";
        //这里 指定文件
        ExcelWriter excelWriter = EasyExcel.write(firstfileName).build();
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        for (int i = 0; i < 5; i++) {
            // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
            WriteSheet writeSheet = EasyExcel.writerSheet(i).head(DemoData.class).build();
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            List<DemoData> data = data();
            excelWriter.write(data, writeSheet);
        }
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        for (int i = 0; i < 5; i++) {
            // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
            WriteSheet writeSheet = EasyExcel.writerSheet(i).head(DemoData.class).build();
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            List<DemoData> data = data();
            excelWriter.write(data, writeSheet);
        }
        // / 千万别忘记finish 会帮忙关闭流
        excelWriter.finish();
    }

输出结果: image

如果是需要二次不同时写入的话,需要以第一个为excel为模板,进行二次写入

    @Test
    public void secondWrite() {
        String firstfileName = "D://1.xlsx";
        //这里 指定文件
        ExcelWriter excelWriter = EasyExcel.write(firstfileName).build();
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        for (int i = 0; i < 5; i++) {
            // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
            WriteSheet writeSheet = EasyExcel.writerSheet(i).head(DemoData.class).build();
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            List<DemoData> data = data();
            excelWriter.write(data, writeSheet);
        }
        // / 千万别忘记finish 会帮忙关闭流
        excelWriter.finish();
        //这里 指定文件
        excelWriter = EasyExcel.write("D://2.xlsx").withTemplate(firstfileName).build();
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        for (int i = 0; i < 5; i++) {
            // 每次都要创建writeSheet 这里注意必须指定sheetNo。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
            WriteSheet writeSheet = EasyExcel.writerSheet(i).head(DemoData.class).build();
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            List<DemoData> data = data();
            excelWriter.write(data, writeSheet);
        }
        // / 千万别忘记finish 会帮忙关闭流
        excelWriter.finish();
    }

输出结果:

image 为了截图方便没有放在不同sheet里面,是支持不同sheet页的 这种情况下应该可以解决剩下的问题,至于第一次导入的文件,则可以在全部导出完成后删除,或者清理掉,或者进行第三次导出 第二次导入也可以选择不需要标题,这样数据就会和之前的衔接上

6

writerSheet 的参数 代表写到第几个sheet。指定的不同就可以。

1

get! 非常感谢

3

不需要文件的话可以通过流输出到内存里面,但是内存占用会高一点,需要权衡一下