EasyExcel 是阿里巴巴开源的一款用于处理 Excel 的轻量级框架,其核心思想是通过模板引擎和流式读写的方式,极大提升性能并降低内存占用。本文将详细介绍 EasyExcel 模板引擎的使用方法,并结合实际案例展示其功能。
在使用 EasyExcel 之前,需要在项目中引入相关依赖。以下是 Maven 配置示例:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
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;
}
}
以下是使用 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);
}
}
以下是使用 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);
}
}
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;
}
}
假设需要生成一个包含学生信息的成绩表,要求包括姓名、成绩以及排名,并且需要对成绩进行排序。
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;
}
}
假设需要生成一个包含多级表头的表格,第一行为总标题,第二行为子标题。
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));
}
}