[alibaba/easyexcel]下拉框数据量超过88条记录,文件无法打开

2024-05-23 492 views
6

触发场景描述 操作系统:mac

版本:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>

excel版本: image

使用EasyExcel的 CustomWriteHandler生成下拉框时,下拉框大数据量会导致execl打开时报错。

业务代码中,如果是正常点的字符串,经测试二三十条数据就无法打开了。下面的例子是88条记录正常打开,但是如果下拉框有89条数据,则excel打开报错。

触发Bug的代码


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.util.CellRangeAddressList;

import java.util.Collections;

/**
 * @author superlee
 * @since 2020-03-06
 */
public class TestEasyExcel {

    public static void main(String[] args) {
        generateExcel("/Users/superlee/test1.xlsx", 88);
        generateExcel("/Users/superlee/test2.xlsx", 89);
    }

    private static void generateExcel(String fileName, int count) {
        String[] array1 = new String[count];
        for (int i = 0; i < count; i++) {
            array1[i] = i + "";
        }
        TestEasyExcel testEasyExcel = new TestEasyExcel();
        EasyExcel
                .write(fileName, Model.class)
                .registerWriteHandler(testEasyExcel.new CustomWriteHandler(array1))
                .sheet("sheet").doWrite(Collections.emptyList());
    }

    class Model {
        @ExcelProperty(value = "第一列", index = 0)
        private String column;

        public String getColumn() {
            return column;
        }

        public void setColumn(String column) {
            this.column = column;
        }
    }

    public class CustomWriteHandler implements SheetWriteHandler {
        private String[] data;

        public CustomWriteHandler(String[] data) {
            this.data = data;
        }

        @Override
        public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

        }

        @Override
        public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
            DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();
            CellRangeAddressList cellRangeAddressList =
                    new CellRangeAddressList(1, 500, 0, 0);
            DataValidationConstraint constraint =
                    helper.createExplicitListConstraint(data);
            DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
            writeSheetHolder.getSheet().addValidationData(dataValidation);
        }
    }
}

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

image

请问有没有解决方案,如何修改,谢谢。

回答

0

有没有直接用软件试过?

1

有没有直接用软件试过?

我自己实现了下拉框,用我的excel是可以打开的。下拉框是用隐藏的sheet页实现的,不知道你说的直接用软件要怎么操作。

3

现在没问题了 对吧?我的意思 直接用软件设置89+ 会不会有问题

1

现在没问题了 对吧?我的意思 直接用软件设置89+ 会不会有问题

这不还是之前遇到的那个Excel的限制吗,下拉框的文本长度不能超过255;

808就是这个问题

https://github.com/alibaba/easyexcel/issues/808#issue-519046041

解决办法也有,就是单独生成一个sheet页,里面取一列存放一个下拉框的所有数据,一行一条数据,然后在原来的第一个sheet页里下拉框的地方用Excel函数取数;

实现的话,主要是在SheetWriteHandler的实现类afterSheetCreate()里面,用这个指定

int TotalRowCount=88; // sheet2里面下拉框对应的一列需要放多少行数据
String enumSheetName = "sheet2"; // 下拉框数据所在的sheet页名称
String[] operationCity; // 下拉框的数据
CellRangeAddressList cellRangeAddressList5 = new CellRangeAddressList(1, TotalRowCount, 5, 5);
String cityEnum = "=" + enumSheetName + "!$A$2:$A$" + (operationCity.length + 1);
DataValidationConstraint constraint2 = helper.createFormulaListConstraint(cityEnum);
DataValidation dataValidation2 = helper.createValidation(constraint2, cellRangeAddressList5);
writeSheetHolder.getSheet().addValidationData(dataValidation2);

下面是之前截的WPS里的错误提示信息: image

8

现在没问题了 对吧?我的意思 直接用软件设置89+ 会不会有问题

还是有问题的,我后面没有用easy-excel实现了,我用的poi自己实现的下拉框

0

不应该啊 easyexcel就是调用poi 的,或者是引入的poi 版本把问题

2

不应该啊 easyexcel就是调用poi 的,或者是引入的poi 版本把问题

这个限制是Excel的,跟poi也没关系啊

7

我也遇到这个问题了 哎

8

same issue