导读:Excel文件填充是许多企业和个人日常工作中必不可少的一项任务。对于一次性需要生成大量Excel文件的场景,手动填充显然是非常浪费时间且容易出错的。这时,使用Java EasyExcel这个工具可以帮助我们快速、准确地填充Excel文件,提高工作效率与准确度。本篇文章将会介绍Java EasyExcel的使用方法、函数的详细说明以及具体实现的步骤等内容,以帮助大家更好地运用Excel文件填充技能。
1. EasyExcel简介
EasyExcel 是一个基于POI封装的 Java 读写Excel的开源项目,性能较快,支持Java对象到Excel文件的写操作,提供多种读取 Excel 的方式,使用简单便捷,具有快速读写、低内存占用的特点。
1.1 EasyExcel 的主要特点
1. 易于使用:提供了大量的API,能够高效地读取和输出Excel文件。
2. 快速读写:采用内存映射技术,避免OOM问题,并且使用低级别的POI API,具有高性能读写Excel的特点。
3. POI封装:采用POI作为Excel操作底层,封装POI对Excel文件的底层操作,使得使用者无需了解过多POI的API。
4. 对象映射:可直接将Java对象输出到Excel文件中,简单易用,提高代码效率。
5. 数据监听:可监听Excel文件的数据,并通过回调函数进行处理,适合大数据量或者复杂数据结构的读取。
6. 支持多种文件格式:除了 Excel 格式,还能够支持 CSV、XML、ODS 等格式的读写操作。
1.2 导入EasyExcel依赖包
首先,我们需要在项目中导入 EasyExcel 的依赖包,在 Maven 项目中导入以下代码:
```
```
2. Java EasyExcel API
2.1 EasyExcel 核心API
EasyExcel的核心API是EasyExcelFactory
类,使用它可以很方便地实现Excel文件的读写,主要提供以下几个方法:
read():读取 Excel 文件中的数据。
write():向 Excel 文件中写入数据。
readAll():读取 Excel 文件所有 Sheet 中的数据。
writeAll():向 Excel 文件中所有 Sheet 写入数据。
接下来,我们将会对这些方法进行具体的讲解。
2.2 Excel 读取操作
EasyExcel 提供了大量的注解,可以方便地配置 Excel 中的数据与Java对象的映射关系。下面我们详细介绍 Excel 读取操作的API:
2.2.1 Excel读取单个Sheet(默认读第一个Sheet)
如下是读取单个 Sheet 的示例代码:
```
@ExcelSheet
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
}
public class DemoDataListener extends AnalysisEventListener
public void invoke(DemoData data, AnalysisContext context) { }
public void doAfterAllAnalysed(AnalysisContext context) { }
}
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
```
其中,DemoData
类用来存储读取后的 Excel 数据,DemoDataListener
类用来处理读取过程中对数据的逻辑操作。示例代码中,使用 @ExcelSheet
注解标记 DemoData
类,指明该类对应 Excel 中的一个 Sheet。在构造读取器时,使用 EasyExcel.read()
方法传入 fileName
、DemoData.class
和 DemoDataListener
,完成 Sheet 内容的读取操作。其中,sheet()
方法默认选用第 1 个 Sheet,如需指定 Sheet 可使用 sheet(sheetNo)
。
2.2.2 Excel读取多个Sheet
如下是读取多个 Sheet 的示例代码:
```
EasyExcel.read(fileName, DemoData.class, new DemoDataListener())
.sheet(0)
.sheet(1)
.doRead();
```
上述代码中,sheet()
方法用于指定需要读取的 Sheet,参数 sheetNo
表示 Sheet 的编号,从 0 开始。多个 Sheet 可使用多个 sheet()
方法进行指定,然后通过 doRead()
方法进行读取操作。
2.2.3 使用注解定义Excel文件数据类型
EasyExcel 支持使用注解直接将Excel文件中的数据读入到Java对象中,使用起来非常简洁易懂。下面是一个示例代码:
```
@Data
public class UploadData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("邮箱")
private String email;
@ExcelIgnore
private String ignore;
}
@ColumnWidth(20)
@HeadStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 11)
@ContentStyle(fillPatternType = FillPatternType.SOLID_FOREGROUND, fillForegroundColor = 22, wrapped = true)
public class UploadDataListener extends AnalysisEventListener
private List
public void invoke(UploadData data, AnalysisContext context) {
list.add(data);
}
public void doAfterAllAnalysed(AnalysisContext context) {
// 业务逻辑处理
}
}
EasyExcel.read(file.getInputStream(),UploadData.class,new UploadDataListener()).sheet().doRead();
```
上述代码中,@ExcelProperty
注解用于声明Java类的属性与Excel中每列的关系。
2.3 Excel 写入操作
Excel 写入操作采用了类似于监听器(Listener)的设计模式,结合 ExcelWriteContext 对象控制 Excel 写入的各个环节,具有较高的灵活度,写出的 Excel 文件格式、样式与数据处理逻辑也相对容易掌控。
2.3.1 Excel 写入单个Sheet
EasyExcel提供了write()
、 writeList()
以及 writeMap()
函数用于完成 Excel 中内容的写入。以下是一个写入单个 Sheet 的示例代码:
```
@Data
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
}
public static void main(String[] args) throws IOException {
String fileName = "test.xlsx";
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}
private static List
List
for (int i = 0; i < 5; i++) {
DemoData item = new DemoData();
item.setString("字符串" + i);
item.setDate(new Date());
item.setDoubleData(Double.valueOf(i));
list.add(item);
}
return list;
}
```
其中,通过 EasyExcel.write()
方法构造一个写入器 ExcelWriter
。接下来,通过 ExcelWriter.sheet()
方法指定需要写入的 Sheet 名称。通过 ExcelWriter.doWrite()
方法实现 Excel 数据(List 集合)的写入操作。
2.3.2 Excel 写入多个Sheet
EasyExcel 同时也能够支持将多个数据写入不同的 Sheet 中。示例代码如下:
```
@Data
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
}
public static void main(String[] args) throws IOException {
String fileName = "test.xlsx";
// 写法1
ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet sheet1 = EasyExcel.writerSheet(0,"模板1").build();
List
excelWriter.write(data1, sheet1);
WriteSheet sheet2 = EasyExcel.writerSheet(1,"模板2").build();
List
excelWriter.write(data2, sheet2);
excelWriter.finish();
// 写法2
EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new FreezeAndFilterTable()).sheet("模板1").doWrite(data());
EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new FreezeAndFilterTable()).sheet("模板2").doWrite(data());
}
private static List
List
for (int i = 0; i < 5; i++) {
DemoData item = new DemoData();
item.setString("字符串" + i);
item.setDate(new Date());
item.setDoubleData(Double.valueOf(i));
list.add(item);
}
return list;
}
```
上述代码中,使用 ExcelWriter
建立写入器,然后通过sheet重载方法指定需要写入的Sheet。通过 ExcelWriter.doWrite()
方法实现 Excel 数据的写入操作。
2.3.3 Excel 导出时的样式处理
除了数据之外,EasyExcel 还能对 Excel 文件进行样式处理。如下代码示例展示了如何为 Excel 写入过程设置不同的样式:
```
public static void main(String[] args) throws IOException {
String fileName = "test.xlsx";
// 定义样式配置项
List
styles.add(new WriteCellStyle().setHeadCellStyle(new WriteCellStyle().setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()).setFillPatternType(FillPatternType.SOLID_FOREGROUND))
.setContentCellStyle(new WriteCellStyle().setDataFormat((short) BuiltinFormats.getBuiltinFormat("0.00"))));
styles.add(new WriteCellData().setRowIndex(1).setCellStyle(new WriteCellStyle().setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()).setFillPatternType(FillPatternType.SOLID_FOREGROUND)));
EasyExcel.write(fileName, DemoData.class).registerWriteHandler(new FreezeAndFilterTable()).sheet("模板").doWrite(data()).setWriteCellStyle(styles);
}
```
通过 EasyExcel.setWriteCellStyle()
方法设置单元格样式,其中 WriteCellStyle、WriteCellData 是样式配置项,分别代表了样式与单元格位置。上述代码中,第一个样式设置了表头填充和数据格式(保留两位小数),第二个样式设置了第 2 行的填充样式(这个数据只有一行,第 2 行就是表头行)。
3. Excel文件读写实现步骤
上文介绍了 EasyExcel 的核心API,下面来系统地介绍一下 Excel 文件的读写实现步骤:
检查 Excel 文件是否存在,如不存在则进行错误反馈。
构造读取器或写入器。
设置 Excel 样式处理事项、全局信息。
通过 Sheet 的方式进行读写操作,采用“一次读取,多次处理”的方法,增强代码的可读性与稳定性。
数据操作完成之后,关闭读取器或写入器。
4. 总结
本文简单介绍了 EasyExcel 的使用方法,包括 EasyExcel 的特点、核心API、Excel 文件读写实现步骤等内容。EasyExcel的API设计精巧,具有优秀的性能与可扩展性。在实际开发过程中,使用 EasyExcel能够提高开发效率,避免对底层原理的操作。同时,通过代码演示,读者也能够更加便捷地了解 EasyExcel的操作模式。通过反复练习、沉淀,相信 EasyExcel将能够为你的工作提供巨大的帮助。