EasyExcel级联下拉

代码

java 复制代码
package com.xc.excel.select;

import com.alibaba.excel.EasyExcel;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EasyExcelCascadingDropdown {
    public static void main(String[] args) throws IOException {
        String fileName = "test.xlsx";

        // 定义国家和城市的级联关系
        Map<String, List<String>> countryCityMap = new HashMap<>();
        countryCityMap.put("中国", Arrays.asList("北京", "上海", "广州"));
        countryCityMap.put("美国", Arrays.asList("纽约", "洛杉矶", "芝加哥"));

        // 生成Excel文件
        Workbook workbook = new XSSFWorkbook();
        Sheet mainSheet = workbook.createSheet("MainSheet");

        // 创建标题行
        Row headerRow = mainSheet.createRow(0);
        headerRow.createCell(0).setCellValue("国家");
        headerRow.createCell(1).setCellValue("城市");

        // 创建国家下拉列表数据验证
        DataValidationHelper helper = mainSheet.getDataValidationHelper();
        DataValidationConstraint countryConstraint = helper.createExplicitListConstraint(countryCityMap.keySet().toArray(new String[0]));
        CellRangeAddressList countryRange = new CellRangeAddressList(1, 100, 0, 0);  // 第一列(国家)
        DataValidation countryValidation = helper.createValidation(countryConstraint, countryRange);
        mainSheet.addValidationData(countryValidation);

        // 设置城市的级联下拉
        for (int i = 1; i < 101; i++) { // B列的下拉列表依赖A列的值
            String formula = "INDIRECT(A" + (i + 1) + ")";
            DataValidationConstraint cityConstraint = helper.createFormulaListConstraint(formula);
            CellRangeAddressList cityRange = new CellRangeAddressList(i, i, 1, 1);  // 第二列(城市)
            DataValidation cityValidation = helper.createValidation(cityConstraint, cityRange);
            mainSheet.addValidationData(cityValidation);
        }

        // 创建DataSheet存放国家和城市映射数据
        Sheet dataSheet = workbook.createSheet("DataSheet");
        int rowIndex = 0;
        for (Map.Entry<String, List<String>> entry : countryCityMap.entrySet()) {
            String country = entry.getKey();
            List<String> cities = entry.getValue();

            // 写入国家和对应城市到DataSheet
            Row countryRow = dataSheet.createRow(rowIndex++);
            countryRow.createCell(0).setCellValue(country);
            for (int i = 0; i < cities.size(); i++) {
                Row cityRow = dataSheet.createRow(rowIndex++);
                cityRow.createCell(0).setCellValue(cities.get(i));
            }

            // 为每个国家创建命名区域
            Name name = workbook.createName();
            name.setNameName(country);
            name.setRefersToFormula("DataSheet!$A$" + (rowIndex - cities.size()) + ":$A$" + (rowIndex - 1));
        }

        // 保存Excel文件
        try (FileOutputStream fileOut = new FileOutputStream(fileName)) {
            workbook.write(fileOut);
        }
        workbook.close();

        System.out.println("Excel文件生成成功: " + fileName);
    }
}

效果

相关推荐
计算机毕设VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
没差c5 小时前
springboot集成flyway
java·spring boot·后端
三水不滴5 小时前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
笨蛋不要掉眼泪5 小时前
Spring Boot集成LangChain4j:与大模型对话的极速入门
java·人工智能·后端·spring·langchain
sheji34168 小时前
【开题答辩全过程】以 基于SpringBoot的疗养院管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
短剑重铸之日9 小时前
《设计模式》第六篇:装饰器模式
java·后端·设计模式·装饰器模式
码界奇点10 小时前
基于Flask与OpenSSL的自签证书管理系统设计与实现
后端·python·flask·毕业设计·飞书·源代码管理
代码匠心11 小时前
从零开始学Flink:状态管理与容错机制
java·大数据·后端·flink·大数据处理
分享牛11 小时前
LangChain4j从入门到精通-11-结构化输出
后端·python·flask
知识即是力量ol12 小时前
在客户端直接上传文件到OSS
java·后端·客户端·阿里云oss·客户端直传