背景
公司最近有需求,客户会一次性上传一个含有多个sheet页的excel。
公司用的是easyExcel,左思右想下 自己手写了个工具类。
公共处理excel解析代码
/**
*
* @param filePath excel文件路径
* @param sheetNo sheet位置 从0开始
* @param startRowNo 开始读取的行号 从0开始
* @param headRow 表头行号 从1开始
* @param readRow 读取行数,-1表示读取所有行
* @param clazz
* @return
* @param <T>
*/
public static <T> List<T> readExcelToList(String filePath, int sheetNo, int startRowNo, int headRow, int readRow, Class<T> clazz) {
List<T> resultList = new ArrayList<>();
EasyExcel.read(filePath, clazz, new AnalysisEventListener<T>() {
@Override
public void invoke(T data, AnalysisContext context) {
//当前行号
Integer currentRowNo = context.readRowHolder().getRowIndex();
//判断当前行号是否在读取范围内
if (currentRowNo >= startRowNo) {
//如果读取所有,或者 当前行没有达到行数限制 则解析数据
if (readRow == -1 || currentRowNo < startRowNo + readRow) {
resultList.add(data);
}
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("excel数据解析完成,sheetName:{},sheetNo:{}",context.readSheetHolder().getSheetName(),context.readSheetHolder().getSheetNo());
}
}).sheet(sheetNo).headRowNumber(headRow).doRead();
return resultList;
}
上面这段代码不难看懂,其实就是泛型封装了一下。大家都可以直接调用这个方法获取到自己解析后的excel里面的数据。
业务代码用法
List<FyndiqlVerificationVo> fyndiqEconomyInvoices = ExcelUtils.readExcelToList("C:\\Users\\admin\\Downloads\\fyndiq3.1-3.31到账核销数据.xlsx", 0, 2, 1, -1, FyndiqlVerificationVo.class);
这个是我本地测试用的main方法。大家可以把这个filepath换成自己服务器的excel路径
效果展示
最后的list就是自己想要的数据。
场景二:
有的小伙伴不是这种从服务器取出来的路径 那也可以直接通过前端的媒体流来获取。
这个场景跟我的业务场景不太一样,我自己也写了一份,但是没有测试。
@PostMapping(value = "/upload")
public Result<?> upload(@RequestParam("file") MultipartFile file) {
List<AliexpressAccountTransfer> list = EasyExcel.read(file.getInputStream(), AliexpressAccountTransfer.class, null).sheet().doReadSync();
return Result.ok("上传成功");
}
这种就可以按照文件的流来读取。大家可以按照自己的需要改装一下我的这个工具类。