EasyExcel导入Excel文档
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
创建导入实体
1.注解属性可以使用index,也可以使用value,正确对应excel每列,但是不建议一起使用。
2.实体上面不要加@Accessors(chain = true)这个注解,会和EasyExcel产生冲突
@Data
public class User{
@ExcelProperty(index = 0)
private String id;
@ExcelProperty(index = 1)
private String name;
@ExcelProperty(index = 2)
private String sex;
}
编写监听器
public class ExcelListener extends AnalysisEventListener {
/**
* 每隔5条存储数据库,实际使用中可以合理设置数量,然后清理list ,方便内存回收
*/
private static final int BATCH_COUNT = 5;
List<Object> list = new ArrayList<Object>();
/**
* 这个每一条数据解析都会来调用
* @param data
* @param context
*/
@Override
public void invoke(Object data, AnalysisContext context) {
System.out.println("解析到一条数据:" + JSON.toJSONString(data));
list.add(data);
System.out.println("集合长度------->" + list.size());
// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
if (list.size() >= BATCH_COUNT) {
getList();
// 存储完成清理 list
list.clear();
}
}
/**
* 所有数据解析完成了 都会来调用
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
getList();
System.out.println("所有数据解析完成!");
}
/**
* 加上存储数据库
* 可以调用dao层的方法进行保存数据
*/
public List<Object> getList() {
System.out.println(list.size() + "条数据,开始存储数据库!");
//demoDAO.save(list);
System.out.println("存储数据库成功!" + list);
return list;
}
}
使用
注意事项:
1.首先监听这个类不归spring管理,所以每次都需要先创建监听对象
2.读的时候headRowNumber()的值是我们的标题包括列名占用了多少列
3.readSheet,是指Excel的sheet页,默认是0,。也可以写sheet页的名称
4.最后调用finish方法关闭,读的时候会创建临时文件,不关闭的话磁盘会崩。
public void importUser(@RequestParam("file") MultipartFile file) throws Exception {
ExcelListener listener = new ExcelListener();
ExcelReader excelReader = EasyExcel.read(file.getInputStream(), User.class, listener).headRowNumber(2).build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
excelReader.finish();
}
枚举转换器
1.数据库存储的性别字段可能是0、1,可以通过下面得转换器进行转换
2.在实体类属性的@ExcelProperty注解上加入converter属性,例: @ExcelProperty(value = “性别”, index = 0, converter = SexConverter.class)
3.也可以通过匹配枚举的办法进行转换
public class SexConverter implements Converter<Integer>{
@Override
public Class supportJavaTypeKey() {
return Integer.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
if("男".equals(cellData.getStringValue())){
return 1;
}else{
return 0;
}
}
@Override
public CellData convertToExcelData(Integer integer, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
if(integer == 1){
return new CellData("男");
}else {
return new CellData("女");
}
}
}