使用EasyExcel自动化报表生成过程

2025-04发布6次浏览

EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 处理库,它通过简化 API 设计和优化性能,使得开发者可以更加高效地处理 Excel 文件。本文将详细介绍如何使用 EasyExcel 实现自动化报表生成的过程,包括基础概念、核心功能以及实际操作步骤。


一、EasyExcel 简介

EasyExcel 是一个轻量级的 Excel 操作工具,支持读取和写入 Excel 文件(支持 .xls.xlsx 格式)。与传统的 Apache POI 相比,EasyExcel 在处理大数据量时具有显著的性能优势,因为它采用了 SAX 解析器进行数据读取,从而降低了内存占用。

核心特性

  1. 简单易用:通过注解方式快速定义 Excel 数据模型。
  2. 高性能:适用于大规模数据场景,避免内存溢出问题。
  3. 灵活扩展:支持自定义解析逻辑、数据转换和格式化。

二、准备工作

在开始之前,请确保你的项目环境已配置好以下内容:

  1. 引入依赖
    在 Maven 项目的 pom.xml 中添加 EasyExcel 的依赖:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.0.5</version>
    </dependency>
    
  2. 定义数据模型类
    使用注解定义 Excel 表格中的列与 Java 对象字段的映射关系。例如:

    import com.alibaba.excel.annotation.ExcelProperty;
    import java.util.Date;
    
    public class User {
        @ExcelProperty("姓名")
        private String name;
    
        @ExcelProperty("年龄")
        private Integer age;
    
        @ExcelProperty(value = "出生日期", format = "yyyy-MM-dd")
        private Date birthday;
    
        // Getter 和 Setter 方法
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }
    

三、自动化报表生成流程

1. 写入数据到 Excel

EasyExcel 提供了简单的 API 来将数据写入 Excel 文件。以下是具体步骤:

  • 创建写入器:指定目标文件路径。
  • 设置表头:通过数据模型类自动映射表头。
  • 写入数据:将 List 集合中的数据逐行写入。

示例代码如下:

import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ExcelWriterExample {
    public static void main(String[] args) {
        // 准备数据
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三", 25, new Date()));
        userList.add(new User("李四", 30, new Date()));

        // 写入 Excel 文件
        String fileName = "users.xlsx";
        EasyExcel.write(fileName, User.class).sheet("用户信息").doWrite(userList);

        System.out.println("Excel 文件生成成功!");
    }
}

2. 自定义样式

如果需要对表格进行样式调整,可以通过监听器实现。例如,设置单元格背景色或字体加粗:

import com.alibaba.excel.write.handler.WriteHandler;
import org.apache.poi.ss.usermodel.*;
import java.util.function.Consumer;

public class CustomCellStyleHandler implements WriteHandler {
    @Override
    public void sheet(int sheetNo, Sheet sheet) {
        // 设置整个工作表的样式
    }

    @Override
    public void row(int rowNum, Row row) {
        // 设置每行的样式
        for (Cell cell : row) {
            Workbook workbook = row.getSheet().getWorkbook();
            CellStyle cellStyle = workbook.createCellStyle();
            Font font = workbook.createFont();
            font.setBold(true); // 字体加粗
            cellStyle.setFont(font);
            cell.setCellStyle(cellStyle);
        }
    }
}

调用时传入自定义样式处理器:

EasyExcel.write(fileName, User.class)
         .registerWriteHandler(new CustomCellStyleHandler())
         .sheet("用户信息").doWrite(userList);

3. 大数据量分批写入

对于百万级以上的数据,建议使用分批写入以减少内存消耗。示例如下:

public class BatchExcelWriterExample {
    public static void main(String[] args) {
        String fileName = "large_data.xlsx";

        EasyExcel.write(fileName, User.class)
                .sheet("大数据量")
                .doWrite(data -> {
                    // 模拟分批数据
                    List<User> batchData = new ArrayList<>();
                    for (int i = 0; i < 1000; i++) {
                        batchData.add(new User("用户" + i, i, new Date()));
                    }
                    return batchData;
                });
    }
}

四、报表生成的扩展讨论

  1. 多 Sheet 生成
    如果需要在一个 Excel 文件中生成多个工作表,可以多次调用 sheet() 方法:

    EasyExcel.write(fileName, User.class)
            .sheet("Sheet1").doWrite(list1)
            .sheet("Sheet2").doWrite(list2);
    
  2. 复杂数据结构支持
    EasyExcel 支持嵌套对象、集合等复杂数据结构的解析。例如:

    public class Order {
        @ExcelProperty("订单号")
        private String orderNo;
    
        @ExcelProperty(value = "商品列表", converter = GoodsConverter.class)
        private List<Goods> goodsList;
    }
    
  3. 性能优化建议

    • 使用流式读写代替一次性加载。
    • 尽量减少不必要的样式设置,降低渲染开销。
    • 对于超大数据量,考虑分布式存储和并行处理。

五、总结

通过 EasyExcel,我们可以轻松实现 Excel 报表的自动化生成。无论是小规模数据还是大规模数据场景,EasyExcel 都能提供高效的解决方案。结合自定义样式和分批写入功能,能够满足企业级应用中的多样化需求。