1.背景
目前接手的项目中涉及到很多数据的处理,对文件的导入导出操作非常多,EasyExcel很方便的提供了多种操作excel文件的api。
2.基本使用
2.1 注解
@ExcelProperty 用于匹配excel和实体类的匹配
@ExcelIgnore 默认所有字段都会和excel去匹配,加了这个注解会忽略该字段
@ExcelIgnoreUnannotated 默认不加ExcelProperty 的注解的都会参与读写,加了不会参与读写
2.2 excel导出操作
设置web导出操作的导出头
public OutputStream getExportResponseStream(HttpServletResponse response, String fileName,Byte excelType) throws
IOException {
response.setContentType("application/octet-stream");
if (ExcelSuffixType.XLSX.getCode().equals(excelType)) {
String allFileName = fileName + ExcelSuffixType.XLSX.getDesc();
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(allFileName, ENCODE));
} else if (ExcelSuffixType.XLS.getCode().equals(excelType)){
String allFileName = fileName + ExcelSuffixType.XLS.getDesc();
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(allFileName, ENCODE));
}
return response.getOutputStream();
}
基本导出操作
@Test
public void simpleWrite() {
// 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
// 写法1 JDK8+
// since: 3.0.0-beta1
String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class)
.sheet("模板")
.doWrite(() -> {
// 分页查询数据
return data();
});
// 写法2
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
// 如果这里想使用03 则 传入excelType参数即可
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
// 写法3
fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写
try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet);
}
}
导出操作中通过ExcelWriter可以设置密码
public <T> OutputStream exportSheet(OutputStream out, String userCode,String fileName,Boolean encryption, ExcelTypeEnum type, List<T>
data, Class c, int sheetNum, String sheetName) {
ExcelWriter writer = new ExcelWriterBuilder().head(c).password(password).file(out).excelType(type).build();
WriteSheet sheet = new WriteSheet();
sheet.setSheetName(sheetName);
sheet.setSheetNo(sheetNum);
writer.write(data, sheet);
writer.finish();
return out;
}
2.3 excel导入操作
目前接手的项目之前读取数据很混乱有用POI有HuTool等进行导入全部解析成List<List>,对导入操作基本上就是解析数据,校验数据,导入数据。
基本导入
try {
EasyExcel.read(file.getInputStream(),Record.class, new ReadListener<Record>() {
@Override
public void invoke(Recorddata, AnalysisContext context) {
// 对每一条数据的操作
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 对所有数据解析完后回调
}
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
当出现异常时执行
}
}).sheet().doRead();
catch (IOException e) {
// 异常处理
}