EasyExcel简介
EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。
他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。
EasyExcel解析
easyexcel解析分为纵向表格和横向表格的解析,可参考官方文档内的案例对纵向表格解析:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read
此处主要记录横向表格/无规律表格的解析
1、创建EasyExcelListener继承AnalysisEventListener
@Slf4j
public class EasyExcelListener extends AnalysisEventListener<Object> {
// 创建list集合封装最终的数据
private List<Object> list = new ArrayList<>();
// sheet页索引
private int sheetNo = 0;
@Override
public void invoke(Object o, AnalysisContext analysisContext) {
// 读取excle内容
int currentSheetNo = analysisContext.readSheetHolder().getSheetNo();
if (currentSheetNo != sheetNo) {
// 如果不根据sheet页索引更新状态重新创建list,list会反复添加前面的sheet页对象值
list = new ArrayList<>();
sheetNo = currentSheetNo;
}
list.add(o);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
/**
* 获取表格内容(简单excel读取可用该方法)
*
* @param obj 需要转化的实体
* @param <T>
* @return
*/
public <T> List<T> getList(Class<T> obj) {
JSONArray jsonObj = JSONUtil.parseArray(list);
return JSONUtil.toList(jsonObj, obj);
}
/**
* 将表格转化为map集合(复杂excel读取用此方法)
*
* @return map集合
*/
public List<LinkedHashMap> getListMap() {
JSONArray jsonObj = JSONUtil.parseArray(list);
return JSONUtil.toList(jsonObj, LinkedHashMap.class);
}
}
2、读取excel
inputStream = ftpUtilsIdc2Emos.downloadFile(item.getAbsolutePath());
EasyExcelListener easyExcelListener = new EasyExcelListener();
ExcelReader excelReader = EasyExcelFactory.read(inputStream, easyExcelListener).build();
List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();
Map<Integer, List<LinkedHashMap>> sheetInfos = new HashMap<>(sheets.size());
for (ReadSheet sheet : sheets) {
Integer sheetNo = sheet.getSheetNo();
excelReader.read(sheet);
sheetInfos.put(sheetNo, easyExcelListener.getListMap());
}
//最终数据
List<LinkedHashMap> mapList = sheetInfos.get(0);
!注意事项,以下表格为例
获取的横向表格数据为
[
{"0":"流水号:","1":"流水号测试","5":"备注","6":"备注测试"},
{"0":"申请单位","1":"单位测试","5":"有效时间段","6":"","7":"计划开通时间","8":"2023-12-04"},
......
]
1、第一行数据a~j-1:工单标题测试(级别:特重)不会读取出来,第一行会被当作表头处理,需要用其他方式读取。
2、map内的key为字符串,如获取"申请单位"则为
mapList.get(1).get("0")
其他问题:
1、ExcelReader excelReader = EasyExcelFactory.read(inputStream, easyExcelListener).build();
当执行此行代码对流inputStream进行excel读取操作时,后续inputStream将不可再操作,如需对此inputStream进行操作,如上传至ftp,需要再次给inputStream进行赋值,如
inputStream = ftpUtilsIdc2Emos.downloadFile(item.getAbsolutePath());再次执行