首页 > 其他分享 >easy读取excel数据,包含合并数据

easy读取excel数据,包含合并数据

时间:2023-09-27 12:00:23浏览次数:35  
标签:读取 dataList excel void List private int easy public

实例数据

 1.监听器:

@Slf4j
public class CustomAnalysisEventListener<T> extends AnalysisEventListener<T> {
private int headRowNum;
public CustomAnalysisEventListener(int headRowNum) {
this.headRowNum = headRowNum;
}
private List<T> list = new ArrayList<>();
private List<CellExtra> cellExtraList = new ArrayList<>();
@Override
public void invoke(T excelData, AnalysisContext analysisContext) {
// log.info(" data -> {}", excelData);
list.add(excelData);
}
@Override
public void extra(CellExtra extra, AnalysisContext context) {
CellExtraTypeEnum type = extra.getType();
switch (type) {
case MERGE: {
if (extra.getRowIndex() >= headRowNum) {
cellExtraList.add(extra);
}
break;
}
default:{
}
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
public List<T> getList() {
return list;
}
public List<CellExtra> getCellExtraList() {
return cellExtraList;
}
}


2.
@Slf4j
public class ExcelListener extends AnalysisEventListener {

/**
* 可以通过实例获取该值
*/
private List<Object> dataList = new ArrayList<>();

@Override
public void invoke(Object object, AnalysisContext context) {
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
dataList.add(object);
handleBusinessLogic();
/*
//如数据过大,可以进行定量分批处理
if(dataList.size()>=200){
handleBusinessLogic();
dataList.clear();
}
*/
}

@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//非必要语句,查看导入的数据
log.info("导入的数据条数为: " + dataList.size());
}

/**
* 根据业务自行实现该方法,例如将解析好的dataList存储到数据库中
*/
private void handleBusinessLogic() {
// TODO
}

public List<Object> getDataList() {
return dataList;
}

public void setDataList(List<Object> dataList) {
this.dataList = dataList;
}
}

3.
@Slf4j
@Component
public class ExcelRead {
private static final int HEAD_ROW_NUM = 1;
public static <T> List<T> list(MultipartFile file, Class<T> tClass) throws IOException {
List<T> excelDataList;
CustomAnalysisEventListener listener = new CustomAnalysisEventListener(HEAD_ROW_NUM);
EasyExcel.read(file.getInputStream(), tClass, listener).extraRead(CellExtraTypeEnum.MERGE).sheet().doRead();
excelDataList = listener.getList();
List<CellExtra> cellExtraList = listener.getCellExtraList();
if (cellExtraList != null && cellExtraList.size() > 0) {
mergeExcelData(excelDataList, cellExtraList, HEAD_ROW_NUM);
}
return excelDataList;
}
private static <T> void mergeExcelData(List<T> excelDataList, List<CellExtra> cellExtraList, int headRowNum) {
cellExtraList.forEach(cellExtra -> {
int firstRowIndex = cellExtra.getFirstRowIndex() - headRowNum;
int lastRowIndex = cellExtra.getLastRowIndex() - headRowNum;
int firstColumnIndex = cellExtra.getFirstColumnIndex();
int lastColumnIndex = cellExtra.getLastColumnIndex();
//获取初始值
Object initValue = getInitValueFromList(firstRowIndex, firstColumnIndex, excelDataList);
//设置值
for (int i = firstRowIndex; i <= lastRowIndex; i++) {
for (int j = firstColumnIndex; j <= lastColumnIndex; j++) {
setInitValueToList(initValue, i, j, excelDataList);
}
}
});
}
private static <T> void setInitValueToList(Object filedValue, Integer rowIndex, Integer columnIndex, List<T> data) {
Object object = data.get(rowIndex);
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(true);
ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
if (annotation != null) {
if (annotation.index() == columnIndex) {
try {
field.set(object, filedValue);
break;
} catch (IllegalAccessException e) {
log.error("设置合并单元格的值异常:{}", e.getMessage());
}
}
}
}
}
private static <T> Object getInitValueFromList(Integer firstRowIndex, Integer firstColumnIndex, List<T> data) {
Object filedValue = null;
Object object = data.get(firstRowIndex);
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(true);
ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
if (annotation != null) {
if (annotation.index() == firstColumnIndex) {
try {
filedValue = field.get(object);
break;
} catch (IllegalAccessException e) {
log.error("设置合并单元格的初始值异常:{}", e.getMessage());
}
}
}
}
return filedValue;
}
}

4.调用示例
list = ExcelRead.list(file, OilStationImportDTO.class);
5.实体类

 

标签:读取,dataList,excel,void,List,private,int,easy,public
From: https://www.cnblogs.com/zhuoneng/p/17732380.html

相关文章

  • 视频融合/监控汇聚平台EasyCVR助力AI算法智能防溺水,实现水域监管
    防溺水已经成为青少年安全教育的重要内容,同时也是社会各界共同承担的安全管理责任。特别是在夏季,随着天气逐渐转热,溺水事故也进入了危险期、易发期和高发期。传统的预防和管理方法主要通过日常宣传演讲和人工巡逻来提醒人们溺水的危害,但存在一些问题:1)缺乏有效的安全预警设施:当人......
  • 使用EasyExcel 导入数据,失败原因数据导出
    引言在日常开发过程中,Excel导入是非常常见的场景,而且也有很多开源的项目是针对Excel的读写的,如Apache的poi,最近用的比较好的还是阿里的EasyExcel开源工具。平时我们只是简单的读取文件并写入数据库持久化即可,但是前段时间,产品搞了个需求,需要将导入失败的数据及原因写入Excel......
  • 监控汇聚平台EasyCVR中视频监控系统原理分析
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 带您了解视频监控/视频汇聚系统EasyCVR的五大职能
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 安防视频监控平台EasyCVR测温光纤管道泄漏监测方案
    很多管道关系着社会的正常运转,如煤气管道、天然气管道、输油管道、供水管道等,由于使用环境影响加上使用时间不断增长,机械施工或人为破坏等因素都能使管道出现损伤、泄漏等事故,容易造成严重的影响,如能及时发现可预防大的损失发生。 对于地埋管道的监测,存在以下限制和问题:首先,地......
  • 视频融合平台EasyCVR如何使用视频监控系统搭建电商货物可视化追溯解决方案
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 视频监控\安防视频监控平台EasyCVR的远程控制有什么意义?
    EasyCVR国标视频融合云平台采用端-边-云一体化架构,具备海量视频接入、汇聚与管理、处理及分发等视频能力。该平台部署简单轻量,功能灵活多样。在视频能力方面,它可以实时视频直播、语音对讲、录像回放、云存储等,以实现动火作业现场的在线监测和作业安全预警。此外,还能进行报警联动和......
  • 视频监控/监控汇聚平台EasyCVR助力档案库房可视化管理的应用方案
    档案作为一种特殊的留存记录,具有珍贵的历史价值和文化遗产意义。它是人类活动真实的见证,记录了辉煌时刻和普通人的生活轨迹,对社会发展和经济建设起着举足轻重的作用。如今随着市场经济的不断发展和人类文明的飞速推进,档案的价值更加凸显,档案的储存和管理也备受关注。提升档案数字......
  • 视频融合平台EasyCVR接入华为ivs3800平台提示400报错的原因及解决方法
    青犀视频平台的开源EasyDarwin视频监控解决方案EasyCVR在复杂网络环境中表现出色。它能够将分散的各类视频资源集中管理,实现统一汇聚和整合。EasyCVR支持多种画面窗口播放模式,包括1、4、9、16个画面窗口,同时可以播放多路视频流,并且支持视频定时轮播功能。此外,EasyCVR还兼容多种播......
  • 国标GB28181视频平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?
    EasyCVR是一款安防监控、云存储和磁盘阵列存储的视频汇聚平台,具有强大的可拓展性、灵活的视频能力和轻快的部署特点。它支持主流标准协议,如GB28181、RTSP/Onvif、RTMP等,还能够接入厂家私有协议和SDK,包括海康Ehome、海大宇等设备的SDK。EasyCVR能够将视频流以RTSP、RTMP、FLV、HLS......