简介
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
准备
引入maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
开始使用
1、创建Excel对应的实体类对象,DemoData
public class DemoData implements Serializable{
/**
* @ExcelProperty({"主标题","编码"})
* 可以通过 @ExcelProperty 实现多行表头的读写(如:主标题为一级表头,编码为二级表头)
*/
@ExcelProperty({"编码"})
private Integer id;
@ExcelProperty({ "手机号"})
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
2、创建读取Excel的回调监听器,DemoDataListener
public class DemoDataListener extends AnalysisEventListener<DemoData> {
/**
* 每隔5条存储数据库,然后清理list,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<DemoData> list = new ArrayList<DemoData>();
/**
* 自定义service,也可以是dao,处理读取到的excel数据
*/
private DemoDataService demoDataService;
// 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
public DemoDataListener(DemoDataService demoDataService){
this.demoDataService = demoDataService;
}
// 这个每一条数据解析都会来调用
@Override
public void invoke(DemoData demoData, AnalysisContext analysisContext) {
list.add(demoData);
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条放在内存,容易oom
if(list.size() >= BATCH_COUNT){
saveData();
list.clear();
}
}
// 存储到数据库
private void saveData(){
log.info("{}条数据,开始存储数据库",list.size());
demoDataService.save(list);
log.info("存储数据成功");
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//这里也要保存数据,确保最后遗留的数据也存储到数据库
saveData();
log.info("所有数据解析完成");
}
}
读Excel-单个sheet
/**
* 1、创建Excel对应的实体类对象,DemoData
* 2、创建读取Excel的回调监听器,DemoDataListener
*/
public void read(){
String fileName = filePath + "demo.xlsx";//文件路径
EasyExcel.read(fileName, DemoData.class, new DemoDataListener(demoDataService)).sheet().doRead();
}
读Excel-多个sheet
/**
* 1、创建Excel对应的实体类对象,DemoData
* 2、创建读取Excel的回调监听器,DemoDataListener
*/
public void repeatRaad(){
String fileName = filePath + "demo.xlsx";//文件路径
// 读取部分sheet
ExcelReader excelReader = null;
try {
excelReader = EasyExcel.read(fileName).build();
ReadSheet readSheet1 =
EasyExcel.readSheet(0).head(DemoData.class)
.registerReadListener(new DemoDataListener(demoDataService)).build();
ReadSheet readSheet2 =
EasyExcel.readSheet(1).head(DemoData.class)
.registerReadListener(new DemoDataListener(demoDataService)).build();
excelReader.read(readSheet1, readSheet2);
}finally {
if (excelReader != null){
excelReader.finish();
}
}
}
写Excel
public void write(){
String fileName = filePath + "demo.xlsx";//文件路径
List<DemoData> list = demoDataService.select();
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);
}
从数据库导出Excel,文件下载
public void download(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
String fileName = URLEncoder.encode("demo", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
List<DemoData> list = demoDataService.select();
EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);
}
最后
通过 EaseExcel 可以优雅的对Excel进行读写操作,方便快捷,简单好用。本文只是介绍了最简单的读写方法,详情使用方法请参考EasyExcel使用说明, github地址:https://github.com/alibaba/easyexcel