文章目录
-
- EasyExcel 简介
- EasyExcel 快速上手
- EasyExcel 实际使用
- 总结
一、EasyExcel 简介
EasyExcel 是阿里巴巴开发的一款基于 Java 的 Excel 读写框架,支持复杂模板导出、读取、多 sheet 等操作,可高效地处理 Excel 文件并进行批量读写,能在 Java 开发中直接操作 Excel 文件,节省时间提高效率。
其主要特点有:
- 支持 Java 对象和 Excel 文件的互相转换;
- 支持读取和写入大量数据;
- 支持多线程读写;
- 支持读取和写入 Excel 各种类型值;
- 支持使用注解指定读写的 Excel 的列和 Sheet 的名称;
二、EasyExcel 快速上手
EasyExcel 的使用相对比较简单,在 Spring Boot 项目中导入该框架的相关依赖后,只需要三行代码即可开始进行 Excel 文件的读写操作。以下是一个实例:
@Service
public class ExcelService {
/**
* 导入数据
*
* @param is 导入的文件输入流
* @param headLineNum 表头行数
*
* @return 返回导入的数据
*/
public List<ExcelData> importExcel(InputStream is, int headLineNum) throws IOException {
return EasyExcel.read(is).head(ExcelData.class).headRowNumber(headLineNum).sheet().doReadSync();
}
/**
* 导出数据
*
* @param response HTTP 响应
* @param data 导出的数据
*/
public void exportExcel(HttpServletResponse response, List<ExcelData> data) throws IOException {
// 设置响应信息
String filename = "文件名.xls";
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
// 写出到输出流
EasyExcel.write(response.getOutputStream(), ExcelData.class).sheet("Sheet1")
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).doWrite(data);
}
}
第一个方法用于导入 Excel 数据,第二个方法用于导出 Excel 数据,其中读取 Excel 数据使用了 EasyExcel.read().head().headRowNumber().sheet().doReadSync()
方法,写入 Excel 数据使用了 EasyExcel.write().sheet().doWrite()
方法。registerWriteHandler()
可以设置写入时单元格样式。
需要注意的是,EasyExcel 依赖于阿里巴巴的 fastjson 序列化框架,在使用前需保证 fastjson 也已引入
三、EasyExcel 实际使用
1. 读取 Excel 文件数据
读取 Excel 文件数据是 EasyExcel 的一个常见功能。其实现步骤大致为:
- 将 Excel 文件转换为输入流;
- 通过 EasyExcel 框架提供的
EasyExcel.read()
方法读取 Excel 文件; - 通过
sheet()
方法指定要读取的 Sheet,可以使用多个 Sheet 链式调用; - 通过
head()
方法指定读取时对应的 Java 类型; - 通过
headRowNumber()
方法指定表头所在行数; - 通过
doReadSync()
方法即可同步读取数据,返回读取的数据集合。
以下是一个读取 Excel 文件的方法实现:
public List<MyData> readExcelFile(InputStream inputStream) throws IOException {
List<MyData> dataList = EasyExcel.read(inputStream)
.head(MyData.class)
.sheet()
.headRowNumber(1)
.doReadSync();
return dataList;
}
2. 将数据写入 Excel 文件
将数据写入 Excel 文件也是 EasyExcel 的一项常见功能。其实现步骤大致为:
- 准备要写入的数据集合;
- 创建
ExcelWriter
对象,通过EasyExcel.write()
方法指定输出流和 Java 类型; - 通过
sheet()
方法指定要写入的 Sheet,可以使用多个 Sheet 链式调用; - 通过
doWrite()
方法将数据写入文件中,完成操作。
以下是一个将数据写入 Excel 文件的方法实现:
public void writeExcelFile(List<MyData> dataList, OutputStream outputStream) throws IOException {
ExcelWriter excelWriter = EasyExcel.write(outputStream, MyData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.write(dataList, writeSheet);
excelWriter.finish();
}
3. 处理复杂表格
EasyExcel 不仅可以处理简单的表格,还可以处理复杂的表格,包括导出数据时进行样式设置、动态生成表格头、使用模板导出等,以下是一个使用模板导出数据的示例:
public void exportUsingTemplate(List<Bug> dataList, OutputStream outputStream, String templatePath) throws IOException {
// 加载模板
InputStream inputStream = new BufferedInputStream(new FileInputStream(templatePath));
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 设置表格头
List<List<String>> head = getHeader();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(head, fillConfig, writeSheet);
// 写入数据
FillConfig fillDataConfig = FillConfig.builder().startRow(2).build();
excelWriter.fill(dataList, fillDataConfig, writeSheet);
excelWriter.finish();
outputStream.flush();
}
private List<List<String>> getHeader() {
List<List<String>> head = new ArrayList<>();
for (int i = 0; i <= 14; i++) {
head.add(Collections.singletonList(""));
}
List<String> title = new ArrayList<>();
title.add("Bug id");
title.add("Bug类型");
title.add("Bug状态");
title.add("Bug出现频次");
title.add("Bug严重等级");
title.add("Bug提交日期");
title.add("Bug标题");
title.add("Bug描述");
title.add("Bug解决方法");
title.add("创建人");
title.add("处理人");
title.add("审核人");
head.add(title);
return head;
}
在该方法中,首先使用 EasyExcel.withTemplate()
方法加载模板文件,然后使用 getHeader()
方法生成一个表格头样式,通过 excelWriter.fill()
方法将表格头样式写入到输出流中,最后通过 excelWriter.fill()
方法将数据写入到输出流中,即可完成从模板导出数据的操作。
4. 处理大数据量文件
EasyExcel 能够处理大数据量的 Excel 文件,在写入时可以进行分批次读写操作,从而避免内存溢出等问题。以下是一个分批次处理写入 Excel 数据的方法实现:
public void writeLargeDataToExcel(List<MyData> dataList, OutputStream outputStream, int batchSize) throws IOException {
ExcelWriter excelWriter = null;
try {
excelWriter = EasyExcel.write(outputStream, MyData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
int dataSize = dataList.size();
for (int i = 0; i < dataSize; i += batchSize) {
int fromIndex = i;
int toIndex = Math.min(i + batchSize, dataSize);
List<MyData> subList = dataList.subList(fromIndex, toIndex);
excelWriter.write(subList, writeSheet);
}
} finally {
if (excelWriter != null) {
excelWriter.finish();
}
}
}
在该方法中,使用 EasyExcel.write()
方法创建 ExcelWriter
对象,将要写入的数据分割成多个批次,分别调用 excelWriter.write()
方法将数据写入 Excel 文件中,最终通过 excelWriter.finish()
方法完成操作。
四、总结
EasyExcel 是一个非常简单易用的 Excel 处理框架,可以高效地进行 Excel 文件的读写操作,并支持复杂表格的处理。在实际项目中,我们可以通过 EasyExcel 进行批量导入数据、导出数据、生成报表等操作,从而实现高效的数据管理。同时,EasyExcel 还提供了丰富的 API 接口,可以进行更多自定义的操作。
关于 EasyExcel 的更多详细信息及使用示例,可以参考官方文档: https://www.yuque.com/easyexcel/doc/easyexcel。