阿里巴巴EasyExcel导入导出(model版本)
程序员文章站
2024-03-20 17:32:52
...
EasyExcel是由阿里巴巴出品的,基于POIExcel导入导出二次开发的一个拥有较好性能,且有效处理OO异常、HEAP溢出、GC溢出的一款EXCEL导入导出插件,使用起来也十分简便。
官方解释:
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
导入部分由3个部分组成:
1.实体类
(使用自带注解书写后,且继承于EasyExcel的BaseRowModel)
例:
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 项目管理实体类
*
* @author 清风
* @version 1.0
* @date 2019年07月24日
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("project")
//@ExcelTarget("Project")
public class Project extends BaseRowModel {
/**
* 项目编号
*/
@ExcelProperty(value = "项目编号",index = 0)//value为导入或者导出后的标题,index为下标
private String projectCode;
/**
* 项目名称
*/
@ExcelProperty(value = "项目名称",index = 1)
private String value;
/**
* 所属县区
*/
@ExcelProperty(value = "所属县区",index = 2)
private String country;
/**
* 业主单位
*/
@ExcelProperty(value = "业主单位",index = 3)
private String ownerUnit;
/**
* 建设性质
*/
@ExcelProperty(value = "建设性质",index = 4)
private Integer constructionType;
/**
* 起始时间
*/
@DateTimeFormat(pattern = "yyyy-MM")
@ExcelProperty(value = "起始时间",index = 5,format = "yyyy-MM")//format为注解自带的对时间格式进行处理
private Date startTime;
/**
* 终止时间
*/
@DateTimeFormat(pattern = "yyyy-MM")
@ExcelProperty(value = "终止时间",index = 6,format = "yyyy-MM")
private Date endTime;
/**
* 总投资(万元)
*/
@ExcelProperty(value = "总投资",index = 7)
private Double allInvestment;
/**
* 本年计划投资(万元)
*/
@ExcelProperty(value = "本年计划投资",index = 8)
private Double plannedInvestment;
/**
* 本年累计完成投资
*/
@ExcelProperty(value = "本年累计完成投资",index = 9)
private Double plannedInvestmentAll;
/**
* 当前完成百分比
*/
@ExcelProperty(value = "当前完成百分比",index = 10)
private Double currentCompleted;
/**
* 建设内容
*/
@ExcelProperty(value = "建设内容",index = 11)
private String constructionContent;
/**
* 工程形象进度
*/
@ExcelProperty(value = "工程形象进度",index = 12)
private String progress;
}
2.Lisenter监听类
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
/**
* @ClassName ExcelListener
* @Description TODO
* @Author 清风
* @date 2019年07月24日
* @Version 1.0
**/
public class ExcelListener extends AnalysisEventListener {
private List<Object> list = new ArrayList<>();//用来存储对象的List
@Override
public void invoke(Object o, AnalysisContext analysisContext) {
//invoke类为在读写Excel类时可以执行的操作,一般用于直接存储对象至List中,再返回至Controller中用来做其他操作
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//做完所有读写操作后可以执行的方法
}
public List<Object> getData(){
//自己写的方法,用来返回List
}
}
3.Controller(或者方法)
①.导入主体:
ExcelListener listener=new ExcelListener();
ExcelReader reader = new ExcelReader(file.getInputStream(),null,listener);
reader.read(new Sheet(0,1,Project.class));
listener.getData();//获取到Excel数据之后如何操作自行发挥
②.导出主体
String fileName ="项目信息管理.xlsx";
ServletOutputStream out = response.getOutputStream();
response.setContentType("multipart/form-data");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
ExcelWriter writer= new ExcelWriter(out, ExcelTypeEnum.XLSX);
Sheet sheet1 = new Sheet(1, 0,Project.class);
sheet1.setSheetName("在线项目管理");
writer.write(excelList, sheet1);
writer.finish();//完成输出操作并关闭,可以放在finally中
out.flush();
至此完成导入导出(有Model版)!