在现代数据处理和分析中,Excel 文件是不可或缺的一部分。然而,手动处理大量数据不仅耗时,而且容易出错。为了提高效率和准确性,许多开发者选择使用自动化工具来处理 Excel 文件。EasyExcel 就是这样一款强大的 Java 库,它能够帮助开发者轻松地读取、写入和操作 Excel 文件。下面将详细介绍 EasyExcel 工具的使用方法,帮助你快速上手并掌握其核心功能。
1. 什么是 EasyExcel?
EasyExcel 是一个基于 Java 的 Excel 操作库,它提供了丰富的 API 来处理 Excel 文件。无论是简单的读写操作,还是复杂的数据处理和格式化,EasyExcel 都能轻松应对。它支持多种 Excel 格式,包括 .xls
和 .xlsx
,并且兼容多种数据源,如数据库、CSV 文件等。EasyExcel 的设计理念是简单易用,性能高效,特别适合处理大文件。
2. 安装与配置
2.1 引入依赖
在使用 EasyExcel 之前,首先需要在你的项目中引入相关的依赖。如果你使用的是 Maven 项目,可以在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
2.2 初始化 EasyExcel
在项目中引入依赖后,你可以通过以下方式初始化 EasyExcel:
import com.alibaba.excel.EasyExcel;
public class EasyExcelExample {
public static void main(String[] args) {
// EasyExcel 初始化
}
}
3. 核心功能
3.1 读取 Excel 文件
EasyExcel 提供了多种方式来读取 Excel 文件,包括基于事件模型的读取和基于注解的读取。事件模型适用于处理大文件,而注解读取则适用于小文件。
3.1.1 准备数据模型
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class ExcelEmpData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("密码")
private String password;
@ExcelProperty("生日")
private Date birthday;
@ExcelProperty("薪资")
private Double salary;
}
3.1.2 准备excel文件
在项目的data目录下准备一份excel文件,文件名称:emp.xlsx
,sheet页名称:员工信息
,文件详情信息如下:
3.1.3 事件模型读取
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.io.File;
public class ExcelReader01 {
public static void main(String[] args) {
String path = System.getProperty("user.dir");
String filePath = path + File.separator + "data" + File.separator + "emp.xlsx";
EasyExcel.read(filePath, ExcelEmpData.class, new AnalysisEventListener<ExcelEmpData>() {
@Override
public void invoke(ExcelEmpData data, AnalysisContext context) {
// 处理每一行数据
System.out.println(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 所有数据解析完成后的操作
System.out.println("All data analysed.");
}
}).sheet("员工信息").doRead();
}
}
3.1.4 注解读取
import com.alibaba.excel.EasyExcel;
import java.io.File;
import java.util.List;
public class ExcelReader02 {
public static void main(String[] args) {
String path = System.getProperty("user.dir");
String filePath = path + File.separator + "data" + File.separator + "emp.xlsx";
List<ExcelEmpData> dataList = EasyExcel.read(filePath)
.head(ExcelEmpData.class)
.sheet()
.doReadSync();
dataList.forEach(data -> {
// 处理每一行数据
System.out.println(data);
});
}
}
3.2 写入 Excel 文件
EasyExcel 提供了简单易用的 API 来生成 Excel 文件。你可以通过 EasyExcel.write
方法来创建 Excel 文件,并设置样式、格式等。
import com.alibaba.excel.EasyExcel;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ExcelWriter01 {
public static void main(String[] args) {
String path = System.getProperty("user.dir");
String filePath = path + File.separator + "data" + File.separator + "emp.xlsx";
List<ExcelEmpData> data = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ExcelEmpData empData = new ExcelEmpData();
empData.setName("员工" + i);
empData.setPassword("pw" + i);
empData.setBirthday(new Date());
empData.setSalary(10000.0 + i * 100.0);
data.add(empData);
}
EasyExcel.write(filePath, ExcelEmpData.class).sheet("员工信息").doWrite(data);
}
}
3.3 数据处理与格式化
EasyExcel 支持对 Excel 数据进行各种处理和格式化操作。你可以通过注解来定义数据的格式、样式等。
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import lombok.Data;
@Data
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private int age;
@ExcelProperty("出生日期")
@DateTimeFormat("yyyy-MM-dd")
private Date birthDate;
}
3.4 自定义样式
EasyExcel 允许你自定义 Excel 文件的样式,包括字体、颜色、边框等。你可以通过 WriteCellStyle
和 HorizontalCellStyleStrategy
来设置样式。
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ExcelStyleExample {
public static void main(String[] args) {
String path = System.getProperty("user.dir");
String filePath = path + File.separator + "data" + File.separator + "emp.xlsx";
List<ExcelEmpData> data = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ExcelEmpData empData = new ExcelEmpData();
empData.setName("员工" + i);
empData.setPassword("pw" + i);
empData.setBirthday(new Date());
empData.setSalary(10000.0 + i * 100.0);
data.add(empData);
}// 获取数据列表
// 设置表头样式
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short) 12);
headWriteFont.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色
headWriteCellStyle.setWriteFont(headWriteFont);
// 设置内容样式
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.RIGHT);
// 创建样式策略
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
EasyExcel.write(filePath, ExcelEmpData.class)
.registerWriteHandler(horizontalCellStyleStrategy) // 注册样式策略
.sheet("员工信息") // 设置工作表名称
.doWrite(data); // 写入数据
}
}
代码说明:
- 设置表头样式:
- 使用
WriteCellStyle
类来定义表头的样式。 - 使用
setFillForegroundColor
方法设置表头的背景颜色,这里我们使用了IndexedColors.GREY_25_PERCENT.getIndex()
来设置灰色背景。 - 使用
WriteFont
类来定义表头的字体样式。 - 使用
setColor
方法设置表头的字体颜色,这里我们使用了IndexedColors.RED.getIndex()
来设置红色字体。
- 使用
- 设置内容样式:
- 使用
WriteCellStyle
类来定义内容的样式。 - 使用
setHorizontalAlignment
方法设置内容的水平对齐方式,这里我们使用了HorizontalAlignment.RIGHT
来设置右对齐。
- 使用
- 创建样式策略:
- 使用
HorizontalCellStyleStrategy
类来创建一个样式策略,将表头样式和内容样式结合起来。
- 使用
4. 高级功能
4.2 自定义模板
EasyExcel 支持使用自定义模板来生成 Excel 文件。你可以通过 EasyExcel.write
方法的 template
参数来指定模板文件。
import com.alibaba.excel.EasyExcel;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class TemplateExample {
public static void main(String[] args) {
String path = System.getProperty("user.dir");
String filePath = path + File.separator + "data" + File.separator + "emp.xlsx";
String templatePath = path + File.separator + "data" + File.separator + "file.xlsx";
List<ExcelEmpData> data = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ExcelEmpData empData = new ExcelEmpData();
empData.setName("员工" + i);
empData.setPassword("pw" + i);
empData.setBirthday(new Date());
empData.setSalary(10000.0 + i * 100.0);
data.add(empData);
}
EasyExcel.write(filePath, ExcelEmpData.class)
.needHead(false) // 设置首行不写入
.withTemplate(templatePath) // 使用模板文件
.sheet("Sheet1") // 设置工作表名称
.doWrite(data); // 写入数据
}
}
4.3 数据校验
EasyExcel 提供了数据校验功能,可以在读取数据时进行校验,确保数据的准确性。
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.io.File;
public class DataValidationExample {
public static void main(String[] args) {
String path = System.getProperty("user.dir");
// String filePath = path + File.separator + "aJavaBasic" + File.separator + "data" + File.separator + "emp.xlsx";
String filePath = path + File.separator + "data" + File.separator + "emp.xlsx";
EasyExcel.read(filePath, ExcelEmpData.class, new AnalysisEventListener<ExcelEmpData>() {
@Override
public void invoke(ExcelEmpData emp, AnalysisContext context) {
if (emp.getSalary() < 10300) {
throw new RuntimeException("Invalid salary: " + emp.getSalary());
}
// 处理每一行数据
System.out.println(emp);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 所有数据解析完成后的操作
System.out.println("All data analysed.");
}
}).sheet().doRead();
}
}
5. 总结
EasyExcel 是一个功能强大且易于使用的 Java 库,适用于各种 Excel 文件的处理需求。无论是简单的读写操作,还是复杂的数据处理和格式化,EasyExcel 都能提供高效的解决方案。通过本文的介绍,你应该已经掌握了 EasyExcel 的基本使用方法,并能够将其应用到实际项目中。