easyExcel官网:读Excel | Easy Excel
本文的前提是了解easyExcel的基本使用,如果不了解可以去官网,官方文档可以帮助你快速入门
众所周知,easyExcel在继承或实现组件类时,是规定了泛型的,如此就代表一个监听器也许对应的是一个实体类。
但要是想所有类都是用一个方法来导入呢,就需要将泛型抹掉。
将AnalysisEventListener的泛型抹掉,使用Object类型的list来缓存数据
注:这里只是最简单的实现,可以参考官方文档中每100行存一次数据库,不然excel文件过大的情况下容易导致OOM
示例数据
实体类:DemoData.java
@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
}
监听器:CommonExcelListener.java
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Slf4j
@Getter
public class CommonExcelListener extends AnalysisEventListener {
//缓存解析后的数据
List<Object> dataList = ListUtils.newArrayList();
@Override
public void invoke(Object o, AnalysisContext analysisContext) {
//当前读取的excel行数,加1是为了对其文件的行数
Integer rowIndex = analysisContext.readRowHolder().getRowIndex() + 1;
//将数据添加到缓存list中
dataList.add(o);
log.info("解析第{}行数据: %{}", rowIndex, JSON.toJSONString(o));
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
log.info("所有数据解析完成!");
}
}
读取Excel数据的代码如下
public interface ExcelService {
public List<?> readExcel(MultipartFile mFile, Class<?> clazz);
}
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.util.StringUtils;
import com.mjh.entity.dto.ExcelAnalyzeResDTO;
import com.mjh.service.ExcelCheck;
import com.mjh.service.ExcelService;
import com.mjh.util.CommonExcelListener;
import com.mjh.util.ExcelListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class ExcelServiceImpl implements ExcelService {
@Override
public List<?> readExcel(MultipartFile mFile, Class<?> clazz, ExcelCheck check) {
if (mFile != null && !mFile.isEmpty()) {
try {
//获取文件流
InputStream inputStream = mFile.getInputStream();
CommonExcelListener readListener = new CommonExcelListener();
//读取数据
EasyExcel.read(inputStream, clazz, readListener).sheet().doRead();
//取出数据
List<Object> dataList = readListener.getDataList();
return dataList;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return ListUtils.newArrayList();
}
}
使用
@RestController
@Slf4j
public class ExcelController {
@Resource
private ExcelService excelService;
@RequestMapping("/excel")
public String excel(MultipartFile mFile) {
List<DemoData> objects = (List<DemoData>) excelService.readExcel(mFile, DemoData.class);
return "success";
}
}