当前位置: 首页 > news >正文

使用easyexcel实现单元格样式设置和下拉框设置

1.单元格样式设置

1.1实体类

public class DemoData {

    @ExcelProperty("PK")
    private String name;

    @ExcelProperty("年龄")
    private int age;

    // 必须提供无参构造方法
    public DemoData() {}

    public DemoData(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
// 省略 getter/setter
}

1.2启动类

public class ExcelExporter {
    public static void main(String[] args) {
        String fileName = "D:\\idea代码\\demo1\\src\\main\\resources\\example3.xlsx";

        List<com.example.demo1.com.liyingjie.mapper.ExcelExporter.DemoData> dataList = new ArrayList<>();
        dataList.add(new com.example.demo1.com.liyingjie.mapper.ExcelExporter.DemoData("姓名", 20));
        dataList.add(new com.example.demo1.com.liyingjie.mapper.ExcelExporter.DemoData("姓名", 30));
        EasyExcel.write(fileName, DemoData.class)
                .registerWriteHandler(new HeaderBackgroundColorHandler())
                .sheet("Sheet1")
                .doWrite(dataList);
    }
}

1.3自定义拦截器

public class HeaderBackgroundColorHandler implements CellWriteHandler {

    private  Set<String> targetHeaders;  // 目标表头集合
    private  String targetHeader1="PK";
    private  String targetHeader2="主";
    
    @Override
    public void afterCellDispose(CellWriteHandlerContext context) {
        boolean isHead = context.getHead() != null && context.getHead();
        // 处理表头行
        if (isHead) {
            String headerValue = context.getFirstCellData().getStringValue();
            if (headerValue.trim().contains(targetHeader1) || headerValue.trim().contains(targetHeader2)) {
                // 获取或创建样式
                WriteCellStyle writeCellStyle = context.getFirstCellData().getOrCreateStyle();
                // 设置背景色
                writeCellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
                writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
                // 设置字体样式
                WriteFont writeFont = new WriteFont();
                writeFont.setBold(true);  // 加粗
                writeFont.setColor(IndexedColors.BLACK.getIndex());  // 字体颜色
                writeCellStyle.setWriteFont(writeFont);
            }
        }

    }

}

2 下拉框设置

2.1实体类

public class Employee {
    @ExcelProperty("姓名")
    private String name;
    // 姓名
    @ExcelProperty("部门")
    private String department; // 部门
    @ExcelProperty("职位")
    private String position; // 职位

    // 无参构造函数
    public Employee() {
    }

    // 全参构造函数
    public Employee(String name, String department, String position) {
        this.name = name;
        this.department = department;
        this.position = position;
    }

    // Getter和Setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    // toString方法
    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", department='" + department + '\'' +
                ", position='" + position + '\'' +
                '}';
    }
}
public class Department {
    @ExcelProperty(value = "部门")
 private String departmentName; // 部门名称

    @ExcelProperty(value = "职位")
    private String position; // 职位

    // 无参构造函数
    public Department() {
    }

    // 全参构造函数
    public Department(String departmentName, String position) {
        this.departmentName = departmentName;
        this.position = position;
    }

    // Getter和Setter方法
    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    // toString方法
    @Override
    public String toString() {
        return "Department{" +
                "departmentName='" + departmentName + '\'' +
                ", position='" + position + '\'' +
                '}';
    }
}

2.2自定义拦截器

public class DynamicDropDownHandler implements SheetWriteHandler {
    // 字典数据格式: Map<表头名称, Map<Key, Value>> 
    private final Map<String, Map<Integer, String>> dictDataMap;
    // 新增:传入的表头数据
    private final List<List<String>> listHead;

    public DynamicDropDownHandler(Map<String, Map<Integer, String>> dictDataMap, List<List<String>> listHead) {
        this.dictDataMap = dictDataMap;
        this.listHead = listHead;
    }

    @Override
    public void afterSheetCreate(SheetWriteHandlerContext context) {
        Sheet sheet = context.getWriteSheetHolder().getSheet();
        DataValidationHelper helper = sheet.getDataValidationHelper();

        // 1. 直接使用传入的表头数据,跳过映射逻辑
        Map<String, Integer> headerMap = new HashMap<>();
        for (int i = 0; i < listHead.size(); i++) {
            List<String> headers = listHead.get(i);
            if (!headers.isEmpty()) {
                headerMap.put(headers.get(0), i); // 取每个 List<String> 的第一个元素作为表头名称
            }
        }

        // 2. 遍历字典数据,设置下拉框
        for (Map.Entry<String, Map<Integer, String>> entry : dictDataMap.entrySet()) {
            String headerName = entry.getKey();
            Map<?, ?> optionsMap = entry.getValue();

            // 如果当前 Sheet 存在该表头,则设置下拉框
            if (headerMap.containsKey(headerName)) {
                // 提取下拉选项(假设使用 Map 的 Value 作为选项)
                List<String> options = new ArrayList<>();
                for (Object value : optionsMap.values()) {
                    options.add(value.toString());
                }

                // 设置下拉框
                setDropDownForColumn(sheet, helper, headerMap.get(headerName), options);
            } else {
                System.out.println("未找到匹配的表头: " + headerName);
            }
        }
    }

    /**
     * 为指定列设置下拉框
     */
    private void setDropDownForColumn(Sheet sheet,
                                 DataValidationHelper helper,
                                 int columnIndex,
                                 List<String> options) {
        if (options.isEmpty()) return;

        // 设置应用范围(从第二行开始,默认设置100行)
        int lastRow = 100; // 默认设置100行
        CellRangeAddressList range = new CellRangeAddressList(1, lastRow, columnIndex, columnIndex);

        // 创建数据验证约束
        DataValidationConstraint constraint = helper.createExplicitListConstraint(
            options.toArray(new String[0])
        );

        // 创建并应用验证
        DataValidation validation = helper.createValidation(constraint, range);
        validation.setSuppressDropDownArrow(true);
        sheet.addValidationData(validation);
    }
}

2.3启动类

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

        // 定义字典数据格式: Map<表头名称, Map<Key, Value>>
        Map<String, Map<Integer, String>> dictData = new LinkedHashMap<>();

// 部门下拉选项(Key 可忽略)
        Map<Integer, String> departmentOptions = new HashMap<>();
        departmentOptions.put(1, "技术部");
        departmentOptions.put(2, "市场部");
        departmentOptions.put(3, "财务部");
        dictData.put("部门", departmentOptions);

// 职位下拉选项
        Map<Integer, String> positionOptions = new HashMap<>();
        positionOptions.put(1, "开发工程师");
        positionOptions.put(2, "销售经理");
        positionOptions.put(3, "会计");
        dictData.put("职位", positionOptions);

        Employee employee1 = new Employee("张三", "技术部", "开发工程师");
        Employee employee2 = new Employee("李四", "市场部", "销售经理");
        ArrayList<Employee> list = new ArrayList<>();
        list.add(employee1);
        list.add(employee2);

        ArrayList<Department> list1 = new ArrayList<>();
        Department department = new Department("技术部", "技术经理");
        Department department1=  new Department("技术部", "技术经理");
        list1.add(department);
        list1.add(department1);

        List<List<String>> listHead = new ArrayList<>();

listHead.add(new ArrayList<String>() {{
    add("姓名");
}});
listHead.add(new ArrayList<String>() {{
    add("部门");
}});
listHead.add(new ArrayList<String>() {{
    add("职位");
}});


        // 写入 Excel
        String fileName = "D:\\idea代码\\demo1\\src\\main\\resources\\output24.xlsx";
        ExcelWriter build = EasyExcel.write(fileName)
               .build();// 注册处理器
       WriteSheet dic = EasyExcel.writerSheet("字典项页").head(Department.class).build();
       build.write(list1, dic);

        WriteSheet data = EasyExcel.writerSheet("数据页").head(listHead)
                .registerWriteHandler(new DynamicDropDownHandler(dictData,listHead)).build();// 写入数据

        build.write(list, data);
        build.finish();

    }
}

相关文章:

  • CSS中z-index使用详情
  • 游戏服务器分区的分布式部署
  • 万字长文详解嵌入式电机软件开发
  • Dubbo请求调用本地服务
  • 批量压缩与优化 Excel 文档,减少 Excel 文档大小
  • Figma介绍(基于云的协作式界面设计工具,主要用于UI/UX设计、原型制作和团队协作)
  • 焊接机器人与线激光视觉系统搭配的详细教程
  • Android 中临时文件存放路径选择
  • java泛型通配符?及上下界(extends,super)保证安全性、灵活性、可读性
  • GitHub Copilot 登录失败问题
  • 作业9 (2023-05-05 数组的定义和初始化)
  • 【C++】类和对象
  • leetcode51.N 皇后 回溯算法求解 + 效率优化
  • Idea运行项目报错:java.lang.OutOfMemoryError: Java heap space 解决方法
  • win32汇编环境,对话框程序中创建托盘示例一
  • SpringBoot请求权限控制——Shiro
  • 实验8 搜索技术
  • 《论分布式系统架构设计及其应用》架构师论文
  • C#中通过Response.Headers设置自定义参数
  • 【设计模式】原型模式
  • 中国社科院国际合作局副局长廖凡调任世界经济与政治研究所所长
  • 华住集团:第一季度盈利8.94亿元,同比增长超三成
  • 上海普陀:探索1岁以下托育服务的保育内容、人员配备等关键要素
  • 国家发改委:系统谋划7方面53项配套举措,推动民营经济促进法落地见效
  • 美国失去最后一个AAA评级,资产价格怎么走?美股或将触及天花板
  • 淮安市车桥中学党总支书记王习元逝世,终年51岁