EasyExcel


官方文档: https://easyexcel.opensource.alibaba.com/docs/current/

代码示例

Excel限制下拉框文本长度不能超过 255, 新建一个sheet存储下拉框

https://github.com/alibaba/easyexcel/issues/1138

  • 核心逻辑: 使用EXCEL 数据 > 数据校验 > =select04!$A$1:$A$4
  • 同样可以使用公式(不能使用数组) > =IF($B$13=1,select00!$A$1:$A$44,IF($B$13=2,select03!$A$1:$A$10,select04!$A$1:$A$4))
  • 可以使用子串截取的方式从同一个下拉框获取数据 | Excel 省市县联动下拉框
@Slf4j
public class ImportSelectSheetWriteHandler implements SheetWriteHandler {

    /**
     * 自定义的行和列
     * key为下拉框对应的列号, 从0开始计算
     * value存储一个map(其中key为数据库读取的值/value为显示展示的值)
     */
    private final Map<Integer, String[]> customSelect;

    /**
     * 生成下拉框最后行号
     */
    private int lastRow;

    public ImportSelectSheetWriteHandler(Map<Integer, String[]> customSelect) {
        this.customSelect = customSelect;
        this.lastRow = lastRowConfig();
    }

    public ImportSelectSheetWriteHandler lastRow(int lastRow) {
        if (lastRow > 1) {
            this.lastRow = lastRow;
        }
        return this;
    }

    private int lastRowConfig() {
        try {
            String limit = SpringUtils.getBean(SystemConfigHelper.class).getConfigValue("SYS_LIMIT_IMPORT");
            int result = ConvertUtils.toInt(limit, 1000);
            if (result > 1) {
                return result;
            }
        } catch (Exception e) {
            log.error("获取导入上限配置失败!", e);
        }
        return 1000;
    }

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

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        log.info("第{}个Sheet写入成功。", writeSheetHolder.getSheetNo());
        if (customSelect != null && customSelect.size() > 0) {
            for (int key : customSelect.keySet()) {
                CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, lastRow, key, key);

                String sheetName = "select" + writeSheetHolder.getSheetNo() + key;
                String[] select = customSelect.get(key);
                generateOtherSheet(writeWorkbookHolder.getWorkbook(), sheetName, select);

                String formula = sheetName + "!$A$1:$A$" + select.length;
                DataValidationHelper helper = writeWorkbookHolder.getWorkbook().getSheet(sheetName).getDataValidationHelper();
                DataValidationConstraint constraint = helper.createFormulaListConstraint(formula);
                DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
                writeSheetHolder.getSheet().addValidationData(dataValidation);
                writeWorkbookHolder.getWorkbook().setSheetHidden(writeWorkbookHolder.getWorkbook().getSheetIndex(sheetName), true);
            }
        }
    }

    private void generateOtherSheet(Workbook wb, String sheetName, String[] select) {
        // 创建下拉列表值存储工作表
        Sheet sheet = wb.createSheet(sheetName);
        // 循环往该sheet中设置添加下拉列表的值
        int index = 0;
        for (String key : select) {
            Row row = sheet.createRow(index++);
            Cell cellValue = row.createCell(0);
            cellValue.setCellValue(key);
        }
    }
}

构造多页签主子表数据

public class MasterTest {
    public static void main(String[] args) {

        // 方法3 如果写到不同的sheet 不同的对象
        String fileName = "C:\\Users\\JUE\\Desktop\\testData.xlsx";
        ExcelWriter excelWriter = null;
        try {
            // 这里 指定文件
            excelWriter = EasyExcel.write(fileName).build();
            // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
            WriteSheet writeSheet1 = EasyExcel.writerSheet(1, "sheet1").head(headMaster()).build();
            excelWriter.write(dataMaster(), writeSheet1);
            WriteSheet writeSheet2 = EasyExcel.writerSheet(2, "sheet2").head(headSub()).build();
            excelWriter.write(dataSub(), writeSheet2);
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }

    public static List<List<String>> headMaster() {
        List<List<String>> list = ListUtils.newArrayList();
        list.add(ListUtils.newArrayList("编码"));
        list.add(ListUtils.newArrayList("名称"));
        return list;
    }

    public static List<List<String>> headSub() {
        List<List<String>> list = ListUtils.newArrayList();
        list.add(ListUtils.newArrayList("主表编码"));
        list.add(ListUtils.newArrayList("子表编码"));
        list.add(ListUtils.newArrayList("子表名称"));
        return list;
    }

    public static List<List<Object>> dataMaster() {
        List<List<Object>> list = ListUtils.newArrayList();
        for (int i = 0; i < 100; i++) {
            list.add(ListUtils.newArrayList("code" + i, "名称" + i));
        }
        return list;
    }

    public static List<List<Object>> dataSub() {
        List<List<Object>> list = ListUtils.newArrayList();
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                list.add(ListUtils.newArrayList("code" + i, "sub" + j, "子表名称" + j));
            }
        }
        return list;
    }

}

文章作者: 艾茜茜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 艾茜茜 !
  目录