EasyExcel模板引擎的使用方法与案例展示

2025-04发布11次浏览

EasyExcel 是阿里巴巴开源的一款用于处理 Excel 的轻量级框架,其核心思想是通过模板引擎和流式读写的方式,极大提升性能并降低内存占用。本文将详细介绍 EasyExcel 模板引擎的使用方法,并结合实际案例展示其功能。


一、EasyExcel 简介

1.1 核心特点

  • 高性能:支持大文件读写,避免了传统方式加载整个文件到内存中的问题。
  • 易用性:提供了简洁的 API,用户可以通过注解快速定义数据模型。
  • 灵活性:支持自定义样式、复杂表头、合并单元格等功能。

1.2 适用场景

  • 大量数据的导入导出。
  • 需要对 Excel 文件进行复杂格式化处理的场景。
  • 需要与业务逻辑紧密结合的报表生成。

二、EasyExcel 模板引擎的使用方法

2.1 引入依赖

在使用 EasyExcel 之前,需要在项目中引入相关依赖。以下是 Maven 配置示例:

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

2.2 数据模型定义

EasyExcel 支持通过注解定义数据模型。以下是一个简单的数据类示例:

import com.alibaba.excel.annotation.ExcelProperty;

public class DemoData {
    @ExcelProperty("学生姓名")
    private String name;

    @ExcelProperty("学生成绩")
    private Double score;

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

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

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }
}

2.3 写入 Excel 文件

以下是使用 EasyExcel 写入数据的代码示例:

import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;
import java.util.List;

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

        // 准备数据
        List<DemoData> data = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData demoData = new DemoData();
            demoData.setName("学生" + i);
            demoData.setScore(60.0 + i);
            data.add(demoData);
        }

        // 写入文件
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data);
    }
}

2.4 读取 Excel 文件

以下是使用 EasyExcel 读取数据的代码示例:

import com.alibaba.excel.EasyExcel;

import java.util.List;

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

        // 读取文件
        List<DemoData> dataList = EasyExcel.read(fileName)
                .head(DemoData.class)
                .sheet()
                .doReadSync();

        // 打印数据
        dataList.forEach(System.out::println);
    }
}

2.5 自定义模板

EasyExcel 提供了强大的模板功能,可以满足复杂的 Excel 格式需求。例如,自定义表头或样式:

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;

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

        // 定义内容样式
        WriteCellStyle contentStyle = new WriteCellStyle();
        contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);

        // 定义字体
        WriteFont contentFont = new WriteFont();
        contentFont.setFontHeightInPoints((short) 12);
        contentStyle.setWriteFont(contentFont);

        // 写入文件并应用样式
        EasyExcel.write(fileName, DemoData.class)
                .registerWriteHandler(new CellStyleHandler(contentStyle))
                .sheet("自定义样式")
                .doWrite(getData());
    }

    private static List<DemoData> getData() {
        List<DemoData> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setName("学生" + i);
            data.setScore(60.0 + i);
            list.add(data);
        }
        return list;
    }
}

三、案例展示

3.1 学生成绩表生成

假设需要生成一个包含学生信息的成绩表,要求包括姓名、成绩以及排名,并且需要对成绩进行排序。

实现步骤
  1. 数据准备:创建一个包含学生姓名和成绩的数据列表。
  2. 排序逻辑:根据成绩降序排列。
  3. 生成排名:为每个学生分配排名。
  4. 写入 Excel:将处理后的数据写入 Excel 文件。
代码实现
import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

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

        // 准备数据
        List<StudentScore> studentScores = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            StudentScore score = new StudentScore();
            score.setName("学生" + i);
            score.setScore(60.0 + Math.random() * 40); // 随机生成成绩
            studentScores.add(score);
        }

        // 排序
        Collections.sort(studentScores, Comparator.comparingDouble(StudentScore::getScore).reversed());

        // 分配排名
        for (int i = 0; i < studentScores.size(); i++) {
            studentScores.get(i).setRank(i + 1);
        }

        // 写入文件
        EasyExcel.write(fileName, StudentScore.class).sheet("成绩排名").doWrite(studentScores);
    }
}

class StudentScore {
    private String name;
    private Double score;
    private Integer rank;

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

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

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }

    public Integer getRank() {
        return rank;
    }

    public void setRank(Integer rank) {
        this.rank = rank;
    }
}

3.2 合并单元格示例

假设需要生成一个包含多级表头的表格,第一行为总标题,第二行为子标题。

Mermaid 流程图
graph TD
    A[创建数据模型] --> B[定义多级表头]
    B --> C[设置合并单元格规则]
    C --> D[写入 Excel 文件]
代码实现
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;

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

        // 写入文件并应用合并单元格规则
        EasyExcel.write(fileName, DemoData.class)
                .registerWriteHandler(new CustomSheetWriteHandler())
                .sheet("合并单元格")
                .doWrite(getData());
    }

    private static List<DemoData> getData() {
        List<DemoData> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setName("学生" + i);
            data.setScore(60.0 + i);
            list.add(data);
        }
        return list;
    }
}

class CustomSheetWriteHandler implements SheetWriteHandler {
    @Override
    public void beforeSheetCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder) {
    }

    @Override
    public void afterSheetCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder) {
        XSSFSheet sheet = writeSheetHolder.getSheet();
        // 合并第一行的两个单元格
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));
    }
}