alibaba / easyexcel

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

填充模板方式写入数据存在问题: 发现"xxx.xlsx"中的部分内容有问题。是否让我们尽量是尝试恢复?如果您信任此工作簿的源,请单击"是" #3988

Open chinleo opened 3 weeks ago

chinleo commented 3 weeks ago

触发场景描述

使用列填充(垂直填充) 的时候发现, 列数据的长度存在超过 102 就会引发这个问题

目前测试需要具备以下的前提条件

  1. 多数据填充
  2. 存在数据量超过 102 条
  3. 超过 102 条数据, 不是在代码中最后一次 fill() 执行的

iShot_2024-09-12_15 44 31

测试模板.xlsx

触发Bug的代码

pom.xml

 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.3</version>
</dependency>
package com.easyexcel.testcase;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import lombok.Value;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ExcelBug {

    public static void main(String[] args) {

        bug();
        normal1();
        normal2();

    }

    /**
     * 只要不是最后一次填充, 只要数据>102 就会出现文件损坏
     */
    private static void bug(){

        File temp = new File("/Users/chinleo/Downloads/测试模板.xlsx");
        File out = new File("/Users/chinleo/Downloads/测试模板out-bug.xlsx");

        WriteSheet targetSheet = EasyExcel.writerSheet().build();
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).forceNewRow(false).build();
        try (ExcelWriter writer = EasyExcel.write(out)
                .withTemplate(temp)
                .build()) {

            writer.fill(new FillWrapper("dataType1", genData("dataType1-", 10)),
                    fillConfig, targetSheet);

            writer.fill(new FillWrapper("dataType2", genData("dataType2-", 150)),
                    fillConfig, targetSheet);
            writer.fill(new FillWrapper("dataType3", genData("dataType3-",  200)),
                    fillConfig, targetSheet);

        }

    }

    private static void  normal1(){

        File temp = new File("/Users/chinleo/Downloads/测试模板.xlsx");
        File out = new File("/Users/chinleo/Downloads/测试模板out-normal1.xlsx");

        WriteSheet targetSheet = EasyExcel.writerSheet().build();
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).forceNewRow(false).build();
        try (ExcelWriter writer = EasyExcel.write(out)
                .withTemplate(temp)
                .build()) {

            writer.fill(new FillWrapper("dataType1", genData("dataType1-", 10)),
                    fillConfig, targetSheet);

            // 当条数<=102时, 正常
            writer.fill(new FillWrapper("dataType2", genData("dataType2-", 102)),
                    fillConfig, targetSheet);
            writer.fill(new FillWrapper("dataType3", genData("dataType3-", 20)),
                    fillConfig, targetSheet);

        }

    }

    private static void normal2(){
        File temp = new File("/Users/chinleo/Downloads/测试模板.xlsx");
        File out = new File("/Users/chinleo/Downloads/测试模板out-normal2.xlsx");

        WriteSheet targetSheet = EasyExcel.writerSheet().build();
        FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).forceNewRow(false).build();
        try (ExcelWriter writer = EasyExcel.write(out)
                .withTemplate(temp)
                .build()) {

            writer.fill(new FillWrapper("dataType1", genData("dataType1-", 10)),
                    fillConfig, targetSheet);

            writer.fill(new FillWrapper("dataType3", genData("dataType3-", 20)),
                    fillConfig, targetSheet);

            // 最后写最长的也正常
            writer.fill(new FillWrapper("dataType2", genData("dataType2-", 200)),
                    fillConfig, targetSheet);
        }

    }

    private static List<Data> genData(String value, int size) {

        List<Data> data = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            data.add(Data.of(value + i));
        }

        return data;
    }

    @Value(staticConstructor = "of")
    static class Data {
        String fullName;
    }
}

提示的异常或者没有达到的效果