导入:
下面是从http请求流中读取数据流,其他形式的数据流道理相同;
逻辑代码:
@PostMapping(value = "import", consumes = "multipart/*", headers = "content-type=multipart/form-data")
public String import(MultipartHttpServletRequest request) {
log.info("import批量录入数据开始");
String fileName="";
try {
Map<String, MultipartFile> fileMap = request.getFileMap();
for (Map.Entry<String, MultipartFile> part : fileMap.entrySet()) {
InputStream inputStream = part.getValue().getInputStream();
fileName=part.getValue().getOriginalFilename();
Boolean isExcel = FileUtil.isExcelFile(fileName);//就是判断下扩展名是不是xls、xlsx;
if (!isExcel) {
throw new ValidateException("导入的文件不是excel文件");
}
List<Data> data = new LinkedList<>();
EasyExcel.read(inputStream).head(Data.class).autoTrim(true).registerReadListener(
new AnalysisEventListener<ByteArea>() {
@Override
public void invoke(Data data1, AnalysisContext analysisContext) {
data.add(data1);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("读取文件[{}]成功,一共:{}行......", part.getKey(), data.size());
}
}
).doReadAll();//读取所有的sheet;
importService.import(data);
}
} catch (Exception e) {
log.error("批量录入数据异常", e);
return "批量录入数据异常";
}
return "批量录入数据正常";
}
类的属性注解中的value要和Excel列头的名字相同,保证Excel数据可以映射到对象的属性中:
导出相关常用API
注解ExcelProperty 指定写到第几列,默认根据成员变量排序。value指定写入的名称,默认成员变量的名字。ExcelIgnore 默认所有字段都会写入excel,这个注解会忽略这个字段。DateTimeFormat 日期转换,将Date写到excel会调用这个注解。里面的value参照java.text.SimpleDateFormat。NumberFormat 数字转换,用Number写excel会调用这个注解。里面的value参照java.text.DecimalFormat。
EasyExcel相关参数needHead 监听器是否导出头。useDefaultStyle 写的时候是否是使用默认头。head 与clazz二选一。写入文件的头列表,建议使用class。autoTrim 字符串、表头等数据自动trim。sheetNo 需要写入的编码。默认0。sheetName 需要些的Sheet名称,默认同sheetNo。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Data implements Serializable {
/**
* 区域id
*/
@ExcelProperty("areaCode")
private String areaCode;
/**
* 区域名称
*/
@ExcelProperty("areaName")
private String areaName;
/**
* 父级id
*/
@ExcelProperty("fatherId")
private String fatherId;
/**
* 级别
*/
@ExcelProperty("level")
private Integer level;
}
POM依赖引入:
<properties>
<easyExcel.version>2.2.6</easyExcel.version>
</properties>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyExcel.version}</version>
</dependency>
导出:
下面是导出的核心部分代码,可根据实际场景进行调整代码
ByteArrayOutputStream os = new ByteArrayOutputStream();
ExcelWriter excelWriter = EasyExcel.write(os).build();
WriteSheet writeSheet = EasyExcel.writerSheet("第" + (i - 1) + "部分").build();
excelWriter.write(page.getResult(), writeSheet);
excelWriter.finish();
os.close();
总结
可以看出不管是excel的读取还是写入,都是一个注解加上一行代码完成,可以让我们少些很多解析的代码,极大减少了重复的工作量。当然这两个例子使用了最简单的方式,EasyExcel还支持更多场景,例如读,可以读多个sheet,也可以解析一行数据或者多行数据做一次入库操作;写的话,支持复杂头,指定列写入,重复多次写入,多个sheet写入,根据模板写入等等。更多的例子可以去参考EasyExcel官方文档https://www.yuque.com/easyexcel/doc/easyexcel