基于已有的excel模板,通过easyexcel api向模板中动态写入下拉字典数据

        在项目开发中遇到这样一个需求:原系统中存在数据导入模板,已存在省、市、区县的三级联动,需要在此模板基础上扩展一个“数据标签”字段,而此字段值是动态变化的,也就是需要每次下载模板此字段值都需要从数据表中读取最新的数据写入到此列中,并通过下拉列表形式展示出来,同时此列不允许任意填入,仅允许选择下拉框中的值。

        经研究,最终使用easyexcel实现,通过如下路径实现了上述需求。

 一、项目Maven依赖

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

二、编制EasyExcel工具类

/**
 * 基于Excel模板写入下拉字典数据
 * @param templatePath 模板文件路径
 * @param outputPath   输出文件路径
 * @param dropdownData 下拉字典数据,键为sheet名称,值为下拉数据映射(列索引->下拉选项列表)
 */
public static void writeDropdownData(String templatePath, String outputPath,
                             Map<String, Map<Integer, List<String>>> dropdownData) {
    try (InputStream inputStream = new FileInputStream(templatePath);
        Workbook workbook = new XSSFWorkbook(inputStream);
        OutputStream outputStream = new FileOutputStream(outputPath)) {
       // 处理每个sheet的下拉数据
       for (Map.Entry<String, Map<Integer, List<String>>> sheetEntry : dropdownData.entrySet()) {
          String sheetName = sheetEntry.getKey();
          Sheet sheet = workbook.getSheet(sheetName);
          if (sheet == null) {
             System.out.println("警告: 未找到sheet " + sheetName);
             continue;
          }
          // 处理该sheet下的每个列的下拉数据
          for (Map.Entry<Integer, List<String>> columnEntry : sheetEntry.getValue().entrySet()) {
             int columnIndex = columnEntry.getKey();
             List<String> options = columnEntry.getValue();
             // 添加下拉数据验证
             addDropdownValidation((XSSFSheet) sheet, columnIndex, options);
          }
       }
       // 写入数据
       workbook.write(outputStream);
    } catch (IOException e) {
       e.printStackTrace();
    }
}

/**
 * 为指定列添加下拉数据验证
 *
 * @param sheet       工作表
 * @param columnIndex 列索引
 * @param options     下拉选项列表
 */
private static void addDropdownValidation(XSSFSheet sheet, int columnIndex, List<String> options) {
    // 创建数据验证帮助器
    XSSFDataValidationHelper validationHelper = new XSSFDataValidationHelper(sheet);
    // 创建下拉列表约束
    XSSFDataValidationConstraint constraint =
          (XSSFDataValidationConstraint) validationHelper.createExplicitListConstraint(
                options.toArray(new String[0]));
    // 设置数据验证范围 (这里设置为第2行到第1000行,可以根据实际需求调整)
    CellRangeAddressList addressList = new CellRangeAddressList(1, 20000, columnIndex, columnIndex);
    // 创建数据验证对象
    XSSFDataValidation validation = (XSSFDataValidation) validationHelper.createValidation(
          constraint, addressList);
    // 设置错误提示
    validation.setShowErrorBox(true);
    validation.setSuppressDropDownArrow(true);
    validation.createErrorBox("输入错误", "请从下拉列表中选择值");
    // 将数据验证添加到工作表
    sheet.addValidationData(validation);
}

三、编写测试方法

public static void mainTest(String[] args) {
    // 示例:向模板中添加下拉数据
    String templatePath = "F://opt//old.xlsx";
    String outputPath = "F://opt//new.xlsx";

    // 下拉字典数据
    Map<String, Map<Integer, List<String>>> dropdownData = new HashMap<>();

    // 为第一个sheet(索引0)添加下拉数据
    Map<Integer, List<String>> sheet0Dropdowns = new HashMap<>();
    // 第0列(A列)的下拉选项
    sheet0Dropdowns.put(0, Arrays.asList("选项1", "选项2", "选项3"));
    // 第1列(B列)的下拉选项
    sheet0Dropdowns.put(1, Arrays.asList("男", "女", "其他"));
    dropdownData.put("学历", sheet0Dropdowns);

    // 为第二个sheet(索引1)添加下拉数据
    Map<Integer, List<String>> sheet1Dropdowns = new HashMap<>();
    // 第2列(C列)的下拉选项
    sheet1Dropdowns.put(2, Arrays.asList("高", "中", "低"));
    dropdownData.put("Sheet2", sheet1Dropdowns);

    // 写入下拉数据
    EasyExcelUtil.writeDropdownData(templatePath, outputPath, dropdownData);

    System.out.println("下拉数据写入完成!");
}

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容