[alibaba/easyexcel]下拉框中文本长度超过255,导致生成的Excel文件不能正常打开,提示”部分内容有问题“

2019-11-07 42 views
9

触发场景描述 下拉框数据,String[]中包含的所有文本长度超过255 触发Bug的代码

/**
* SheetWriteHandler的实现类
*/
public class TemplateSheetWriteHandler implements SheetWriteHandler {

/**
* 下拉框选项1
*/
private String[] theFirst;

// 构造函数
public TemplateSheetWriteHandler(String[] theFirst,String[] theSecond) {
        // 异常数据
        this.theFirst = new String[]{"1:测试01","2:测试02","14:大众","15:123","16:测试33","17:cs","18:车系12","19:测试12","20:shell","21:1","22:2113","23:22222","24:4","25:测试11","26:kw-series","27:kw-series","28:yugu","29:ceshi","30:车系车","31:车系车型","32:3333444","33:yugu","34:车系","35:极光","36:相同车系141","37:HH","38:JJ","39:LL","40:114新增车系","41:114新增车系2edit4","42:444444","43:55555"};
        // 正常数据
        // this.theFirst = new String[]{"1:测试01","15:123","17:cs","20:shell","23:22222","24:4","26:kw-series","27:kw-series","28:yugu","32:3333444","33:yugu","34:车系","35:极光","36:相同车系141","37:HH","40:114新增车系","41:114新增车系2edit4","42:444444","43:55555"};
}

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

}

@Override
public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    LOGGER.info("第{}个Sheet写入成功。", writeSheetHolder.getSheetNo());
    // 区间设置 第一列第一行和第二行的数据。由于第一行是头,所以第一、二行的数据实际上是第二三行
    DataValidationHelper helper = writeSheetHolder.getSheet().getDataValidationHelper();
    // theFirst
    if (ArrayUtils.isNotEmpty(theFirst)) {
    CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 1000, 0, 0);
    DataValidationConstraint constraint = helper.createExplicitListConstraint(theFirst);
    DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
    writeSheetHolder.getSheet().addValidationData(dataValidation);
    }
}

}

提示的异常或者没有达到的效果 文件打开提示”部分内容有问题“ image

回答

6

我试了下,这种情况下wps2019可以打开,不过长度超过248(汉字)情况下下拉无法展开,数据正常展示

9

我试了下,这种情况下wps2019可以打开,不过长度超过248(汉字)情况下下拉无法展开,数据正常展示

在MAC版本的WPS中【1.6.1(2429)】,数据类型增加下拉的时候,这里也是限制长度不能超过255的

WPS报错信息
0

是我测试的时候选项2有六个长度,248+6=254,第255个就无法打开

0

这个暂时先不解决,太小众了。想办法和产品沟通下 减少字段。

3

这个暂时先不解决,太小众了。想办法和产品沟通下 减少字段。

这种需求也不算太小众吧。用户上传的数据,需要给他规定一个范围。 比如要录入一批商品信息,商品所属的类别是来源于现有系统中的。用户每次上传数据使用的模板Excel文件,都需要根据系统中现有的数据来生成,以保证用户每次上传的时候,都能从下拉选项中选择到最新的类别信息;而这种类别数据很容易就超出255的长度限制了

1

这个属于excel的限制?

7

这个暂时先不解决,太小众了。想办法和产品沟通下 减少字段。

这种需求也不算太小众吧。用户上传的数据,需要给他规定一个范围。 比如要录入一批商品信息,商品所属的类别是来源于现有系统中的。用户每次上传数据使用的模板Excel文件,都需要根据系统中现有的数据来生成,以保证用户每次上传的时候,都能从下拉选项中选择到最新的类别信息;而这种类别数据很容易就超出255的长度限制了

这样解决: public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { String[] array = new String[]{"1","2","3","4","5"}; CellRangeAddressList regions = new CellRangeAddressList(1, 3000, 4, 4); genearteOtherSheet(writeWorkbookHolder.getWorkbook(),array); String formula = "typelist!$A$1:$A$"+array.length; DataValidationHelper dvHelper = writeWorkbookHolder.getWorkbook().getSheet("typelist").getDataValidationHelper(); DataValidationConstraint formulaListConstraint = dvHelper.createFormulaListConstraint(formula); DataValidation columnValidation = dvHelper.createValidation(formulaListConstraint, regions); writeSheetHolder.getSheet().addValidationData(columnValidation); writeWorkbookHolder.getWorkbook().setSheetHidden(writeWorkbookHolder.getWorkbook().getSheetIndex("typelist"), true); } private void genearteOtherSheet(Workbook wb, String[]typeArrays) { // 创建下拉列表值存储工作表 Sheet sheet = wb.createSheet("typelist"); // 循环往该sheet中设置添加下拉列表的值 for (int i = 0; i < typeArrays.length; i++) { Row row = sheet.createRow(i); Cell cell = row.createCell((int)0); cell.setCellValue(typeArrays[i]); } }

7

这个需求应该不算小众,多语言场景下很容易超出

1

这个需求应该不算小众,多语言场景下很容易超出

这个是excel的限制,用序列代替

0

使用公式添加额外列之后若需要使用其他handler可能导致设置无效/设置错误了