alibaba / easyexcel

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

使用填充excel功能时,填充完成后excel打开出现错误 #2555

Open hnxiaoyuan opened 2 years ago

hnxiaoyuan commented 2 years ago

触发场景描述 使用项目中已有的测试demo进行模版测试list填充(master分支)

com.alibaba.easyexcel.test.demo.fill.FillTest#listFill

使用项目的demo代码测试可以触发Bug


public class FillTest {
  //省略其他代码
 // ......
 /**
     * 填充列表
     *
     * @since 2.1.1
     */
    @Test
    public void listFill() {
        // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
        // 填充list 的时候还要注意 模板中{.} 多了个点 表示list
        String templateFileName = TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "list.xlsx";
       String fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
        // ...... 省略无关代码

        // 方案3 分多次 填充 会使用文件缓存(省内存)
        fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
        try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            //这里新增一个循环填充
            for (int i = 0; i < 100; i++) {
                excelWriter.fill(data1(), writeSheet);
                excelWriter.fill(data1(), writeSheet);
            }
        }
    }
 //新增data1()
  private List<Map<String,String>> data1(){
        Map<String, String> data1 = new HashMap<>();
        data1.put("name", "张三三");
        data1.put("number", "001");
        data1.put("date", "2022-06-20");
        //只放date
        Map<String, String> data2 = new HashMap<>();
        data2.put("date", "2022-06-20");
        List<Map<String,String>> list = new ArrayList<>();
        list.add(data1);
        list.add(data2);
        return list;
    }

提示的异常或者没有达到的效果 填充过程未出现异常,但填充完后excel无法打开,出现错误,如下图:

easyexcel_bug反馈

另外:发现2.2.11不会有此问题

Qzki commented 1 year ago

我这边测试是发现分多次 fill 的情况下,数据到 100 多行就会在 MS Excel 中打开报错,选择自动修复会丢失部分单元格数据,但是 macOS 预览和 Numbers 打开都没问题

zhuangjiaju commented 1 year ago

这个是个 bug ,我后面想办法修复,你map 都要 put(key,null)

ZhangXincun commented 1 year ago

这个是个 bug ,我后面想办法修复,你map 都要 put(key,null)

@zhuangjiaju 我也遇到同样的问题了,您说的map 都要 put(key,null)指的是什么意思? 我的需求有点不太一样,我的是多列 这个例子里面的data2,data3的数据样式。而且模板也是用easyexcel生成的临时模板。请问我该怎么处理数据? 我的data也是一个for循环从一个List里面取的,循环里面根据index分别取的data{index} 我每次fill的时候,尝试将data(index)当前index之外的数据都设置为null,表格正常,但是出现了错行。 我的代码: 模板内容{data1.attriName} {data1.code} {data2.attriName} {data2.code} ........其余模板列模板类似如图(我测试的时候列数较多,超过4组data以上肯定有问题): image

不知道为啥,我代码贴上去没法格式化。 换句话说,您自己的例子,compositeFill函数,模板里面多加几组data,数据量整到到100以上。就很容易发现问题

try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(template).build()){ WriteSheet writeSheet = EasyExcel.writerSheet(0).build(); for (int index=0;index<ruleAttrs.size();index++) { excelWriter.fill(new FillWrapper(StrUtil.format("data{}", index), data1(index) ), writeSheet); } private List<Map<String,String>> data1(int i){ List<Map<String,String>> list = new ArrayList<>(); for (int ss=0;ss<100*i;ss++){ Map<String, String> data1 = new HashMap<>(); data1.put("attriName", String.valueOf(ss)); data1.put("code", String.valueOf(ss)); list.add(data1); } return list; }

ZhangXincun commented 1 year ago

我懂了,每一行的map有值的填值,没值的填null。 这样麻烦了一些,但是问题解决了,希望尽快解决该问题。

Aceysx commented 1 year ago

hi,请问有后续嘛?这个bug修复了嘛?

liuzhenggang commented 6 months ago

版本3.3.4问题还存在