[alibaba/easyexcel]建议最开始的EasyExcel.write("文件名")就生成真正的excel, 而不仅仅是一个以.xlsl为后缀的文件

2024-02-19 746 views
6
出现的问题:

​ 如果只build 了 ExcelWriter对象后,但经过逻辑判断后没使用该对象真实写出. 会生成一个后缀为.xlsl的文件,此文件并不是真实可用的excle文件,所以打开/使用会报错.

原因:

在EasyExcel.write("文件名").build()中只是简单的new File("文件名")了一下, 并没excel文件生成, 此时的文件其实是不可用的

场景:
 ExcelWriter excelWriter = EasyExcel.write("文件名").build();
 try {
         WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();
         // list为空则直接跳过了真实写出这一步. 源码中做了非空判断, 用户不做该判断反而是更好
        if(list不为空){
             excelWriter.write(data, writeSheet);                  
         }
 } finally {
     excelWriter.finish();
 }
竞品:

hutool生成的是真实excel

public static void main(String[] args) {
    ExcelWriter writer = ExcelUtil.getWriter("文件名");
    writer.close();
 }

poi需要手动创建一个sheet才可以创建一个真实的excel

public static void main(String[] args) {
  Workbook workbook = new XSSFWorkbook();
  workbook.createSheet("Sheet1");
  try {
      FileOutputStream outputStream = new FileOutputStream("文件名");
      workbook.write(outputStream);
      workbook.close();
      outputStream.close();
  } catch (Exception e) {
      e.printStackTrace();
  }
}
结论&力所能及的
  1. 上方库我都在真实库用过, easyExcel早就如雷贯耳, 是最近开始用easyExcel. 我认为该设计会增加出bug的概率(我就出了), 一些认为理所当然的事情,发现并不是这样.
  2. 这种issue应该有过吧(我没找到), 如果不做能烦请解释一下原因吗, 有什么考量
  3. 改动应该挺大, 牵扯到重写表头, 第一个sheet是否是真实的, 追加数据等问题, 如果做的话我愿意出一份力

我看有很多issue都是有该原因产生的 [#3351 ]

回答

8

使用的时候需要遵循文档而不是用自己理解的方式使用。 build()是经典的建造者设计模式,只构造对象而不执行逻辑 这和bug没什么关系,使用时请仔细阅读文档

4

@gongxuanzhang build后, 应该构建出一个真实可用的对象吧(真实的excel文件)? 而不是要等到下方逻辑再去完善该对象吧

9

@lijileiGood 你好,我想问问在finish()之前,为什么excel文件大小都是0,在finish()之前wirte()的数据都在哪呢?

6

@xihuimin 一般来说数据是在程序执行过程中写入, finish()/close()这种操作都是关闭流的操作, 防止内存泄露等问题. 如果你说finish()前都是0, 那可能是数据在内存中, finish()时才写入的, 毕竟easyExcel的口号就是更快/性能更好的的excel类库

sorry, 我没具体研究源码,具体还是请以源码为准