JAVA代码优化:Easy Excel(操作Excel文件的开源工具)
Easy Excel官网:
EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com)
https://easyexcel.opensource.alibaba.com/
Easy Excel的特点和优势:
-
简单易用:Easy Excel提供了简洁的API,使用起来非常方便。开发人员可以通过几行代码就能实现Excel文件的读写操作。
-
高性能:Easy Excel采用了基于流的方式进行读写操作,能够处理大规模的Excel文件,并且具有较高的读写性能。
-
多格式支持:Easy Excel支持多种常见的Excel文件格式,包括xls、xlsx等。开发人员可以根据自己的需求选择适合的格式进行读写操作。
-
数据转换:Easy Excel提供了灵活的数据转换功能,可以将Excel文件中的数据转换成Java对象或者将Java对象转换成Excel文件中的数据。
-
样式设置:Easy Excel支持设置Excel文件中单元格的样式,包括字体、颜色、边框等,可以使生成的Excel文件更加美观。
-
导入导出功能:Easy Excel提供了便捷的导入导出功能,可以快速地将Java对象导出为Excel文件,或者将Excel文件中的数据导入到Java对象中进行处理。
前期准备:
Excel表格位置为(d:\\read.xlsx):
导入依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version>
</dependency>
DemoData对象类:
package com.muyuan.review.pojo;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;import java.util.Date;@Getter
@Setter
@EqualsAndHashCode
public class DemoData {//注意名字与表格列名匹配//否则会报错 can not find data format for://字段顺序与表格列顺序一致//注解优先级大于索引@ExcelProperty("数字")private Double doubleData;@ExcelProperty("用户名")private String string;@ExcelProperty("日期")private Date date;
}
简单用法一:
ReadDemo:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.fastjson.JSON;
import com.muyuan.review.pojo.DemoData;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class ReadDemo {public static void main(String[] args) {// 写法1:JDK8+ ,不用额外写一个DemoDataListener// since: 3.0.0-beta1//原: String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";//改: 获取文件路径String fileName = "d:\\read.xlsx";// 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行// 具体需要返回多少行可以在`PageReadListener`的构造函数设置EasyExcel.read(//文件路径fileName,//字体类的字节码DemoData对象DemoData.class,//读取到一条数据的监听器new PageReadListener<DemoData>(dataList -> {for (DemoData demoData : dataList) {log.info("读取到一条数据{}",//格式化转化读到的数据转化为JSON字符串JSON.toJSONString(demoData));}})).sheet().doRead();}
}
结果:
简单用法二(使用监听器):
注意:很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
监听器(ReadDemoListener):
package com.muyuan.review.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.muyuan.review.pojo.DemoData;
import lombok.extern.slf4j.Slf4j;import javax.servlet.ReadListener;
import javax.swing.event.AncestorListener;
import java.io.IOException;/*** @Classname ReadDemoListener* @Description* @Date 2023/12/3 12:17* @Created by 玉满堂*/
// 有个很重要的点 DemoDataListener 不能被spring管理,
// 要每次读取excel都要new,然后里面用到spring可以构造方法传进去
//DemoData读取到每一个对象的泛型
@Slf4j
public class ReadDemoListener extends AnalysisEventListener<DemoData> {@Overridepublic void invoke(DemoData data, AnalysisContext context) {//没读取到一条数据,执行一次System.out.println(JSON.toJSONString(data));}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 读取完所有执行log.info("所有数据解析完成!");}}
ReadDemo:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import com.muyuan.review.listener.ReadDemoListener;
import com.muyuan.review.pojo.DemoData;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class ReadDemo {public static void main(String[] args) {// 写法1:JDK8+ ,不用额外写一个DemoDataListener// since: 3.0.0-beta1//原: String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";//改: 获取文件路径String fileName = "d:\\read.xlsx";EasyExcel.read(//文件路径fileName,//文件字节码对象DemoData.class,//监听器(在解析过程中接收和处理数据)new ReadDemoListener())//指定要读取的Sheet页,默认为第一个Sheet页.sheet()//执行实际的读取和解析操作.doRead();}
}