EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 处理工具,它通过简单的 API 设计和高效的内存管理机制,使得开发者能够快速处理 Excel 文件。相比传统的 Apache POI,EasyExcel 在读取大文件时更加高效且占用更少的内存。
本文将从以下几个方面对 EasyExcel 进行讲解:
.xls
和 .xlsx
格式的文件读写。首先,创建一个标准的 Maven 项目,并在 pom.xml
中引入 EasyExcel 的依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version> <!-- 请根据实际需求选择版本 -->
</dependency>
确保使用的 JDK 版本为 8 或更高版本,因为 EasyExcel 依赖于部分 Java 8 的特性。
使用注解定义 Excel 表头与实体类字段的映射关系。
import com.alibaba.excel.annotation.ExcelProperty;
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
// Getter 和 Setter 方法
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Double getDoubleData() {
return doubleData;
}
public void setDoubleData(Double doubleData) {
this.doubleData = doubleData;
}
}
以下代码展示了如何将数据写入到 Excel 文件中。
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ExcelWriteDemo {
public static void main(String[] args) {
// 设置输出文件路径
String fileName = "demo.xlsx";
// 准备写入的数据
List<DemoData> data = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DemoData demoData = new DemoData();
demoData.setString("字符串" + i);
demoData.setDate(new Date());
demoData.setDoubleData(0.56);
data.add(demoData);
}
// 写入 Excel 文件
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data);
}
}
运行上述代码后,将在项目根目录生成一个名为 demo.xlsx
的文件。
在读取过程中,可以通过监听器逐行处理数据。
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
public class DemoDataListener extends AnalysisEventListener<DemoData> {
private List<DemoData> dataList = new ArrayList<>();
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println("解析到一条数据: " + data);
dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("所有数据解析完成!");
}
public List<DemoData> getDataList() {
return dataList;
}
}
以下代码展示了如何从 Excel 文件中读取数据。
import com.alibaba.excel.EasyExcel;
public class ExcelReadDemo {
public static void main(String[] args) {
String fileName = "demo.xlsx";
DemoDataListener listener = new DemoDataListener();
EasyExcel.read(fileName, DemoData.class, listener).sheet().doRead();
System.out.println("读取到的数据: " + listener.getDataList());
}
}
如果需要对某些字段进行特殊格式化(如日期格式化),可以通过自定义转换器实现。
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.metadata.property.ExcelFieldFormatProperty;
import com.alibaba.excel.metadata.property.ExcelHeadProperty;
import com.alibaba.excel.support.write.WriteHandler;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeConverter implements Converter<LocalDateTime> {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public Class<?> supportJavaTypeKey() {
return LocalDateTime.class;
}
@Override
public WriteCellData<?> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
return new WriteCellData<>(value.format(FORMATTER));
}
}
对于大规模数据处理场景,可以结合线程池实现异步读取或写入。