作为一名程序员,在日常的工作中,Excel 文件的导入和导出是一个非常常见的需求,尤其是在涉及到数据处理和分析时。如财务报表数据录入,月度、季度的销售收据导出等等。今天我们就来分享一个强大的Excel处理库——EasyExcel。
1. EasyExcel简介
EasyExcel 是阿里巴巴开源的一个基于 Java 的简单、快速、小巧的 Excel 处理库。它旨在简化 Excel 文件的读写操作,提高开发效率,减少内存消耗。与传统的 Apache POI 相比,EasyExcel 在处理大文件时性能更优,更适合企业级应用。
主要特点
- 轻量级:
EasyExcel 的核心依赖非常小,不包含任何第三方依赖,使得项目更加轻量。 - 高性能:
使用 SAX 解析方式读取 Excel,大大减少了内存占用,适合处理大文件。
写操作时,采用流式写法,避免一次性加载大量数据到内存中。 - 易用性:
提供了丰富的注解和简洁的 API,使得开发者可以快速上手。
支持自定义样式和数据转换器,满足各种复杂需求。 - 支持多种格式:
支持读写 .xls、 .xlsx和.csv 格式的 Excel 文件。
2. 核心方法
1. read(InputStream inputStream, Class head, ReadListener readListener)方法
- 作用:从给定的输入流(InputStream)中读取 Excel 数据,并根据指定的表头对应的类(Class head)来解析数据,同时通过注册的读取监听器(ReadListener)来处理读取过程中的各种事件和对读取到的数据进行进一步操作。
ReadListener是一个接口,定义了一系列方法。
public interface ReadListener<T> extends Listener {
// 该方法会在 EasyExcel 每成功读取并解析完一行数据后被调用
void invoke(T var1, AnalysisContext var2);
// 当 EasyExcel 完成对整个 Excel 文件(或指定工作表)的所有行数据的读取和解析后,这个方法会被调用。
void doAfterAllAnalysed(AnalysisContext var1);
default void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
}
}
2. dealRecord(CSVRecord record, int rowIndex)方法
- 作用:处理从 CSV 文件中读取到的一行记录(由CSVRecord表示)。它会遍历这行记录中的每个单元格数据,根据数据的情况(是否为空等)进行相应的处理和封装,最终将处理好的这行数据相关信息设置到与 CSV 读取上下文(csvReadContext)相关的各个对象中,以便后续在整个 CSV 文件读取流程中进行进一步的分析、处理或存储等操作。
ReadCellData readCellData;
for(Boolean autoTrim = this.csvReadContext.currentReadHolder().globalConfiguration().getAutoTrim(); cellIterator.hasNext(); cellMap.put(columnIndex++, readCellData)) {
String cellString = (String)cellIterator.next();
readCellData = new ReadCellData();
readCellData.setRowIndex(rowIndex);
readCellData.setColumnIndex(columnIndex