当前位置: 首页 > article >正文

EasyExcel动态拆分非固定列Excel表格

使用EasyExcel动态拆分非固定列Excel表格

在Excel数据解析场景中,​动态列结构拆分是典型挑战(如供应链系统中不同品类的属性字段差异较大)。传统基于POJO映射的方案无法应对列数量不固定的场景。本方案采用EasyExcel的动态模型解析和Map数据承载技术,实现按指定列(如"部门")拆分时自动保留原始列结构,支持以下特性:

  • 无需预定义Java实体类
  • 自动继承原始表格所有列头
  • 拆分后文件保留完整数据格式

无实体动态读取表格

继承 AnalysisEventListener 创建一个自定义监听器,用于处理 Excel 文件的解析和数据拆分。在监听器中,可以重写 invokeHeadMap 方法来获取表头信息,重写 invoke 方法来处理每一行数据。

@Data
public class CustomExcelListener extends AnalysisEventListener<Map<Integer, String>> {
    private Map<Integer, String> headerMap; // 表头信息
    private final Map<String, List<Map<String, String>>> dataMap = new LinkedHashMap<>(); // 拆分后的数据,此处使用LinkedHashMap保持插入顺序
    private int specifiedColumnIndex = 0;指定某一列拆分表格,可使用列索引/列名

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        this.headerMap = headMap;
        // 根据表头初始化 dataMap
        for (Map.Entry<Integer, String> entry : headMap.entrySet()) {
            dataMap.put(entry, new ArrayList<>());
        }
    }

    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        // 获取指定列的值
    	String specifiedColumnValue = data.get(specifiedColumnIndex);
    	// 如果指定列的值为空,设置一个默认值
    	if (specifiedColumnValue == null) {
        	specifiedColumnValue = "默认分类";
    	}
    	// 将整行数据存储到对应的分类中
    	dataMap.computeIfAbsent(specifiedColumnValue, k -> new ArrayList<>()).add(new HashMap<>(data));
   	}

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 可进行数据校验或数据处理
        // 对于拆分后的数据处理可以在doAfterAllAnalysed()中,也可以通过listener.getDataMap()获取数据后自行处理。
    }
}

解析 Excel 文件

在解析 Excel 文件时,使用 EasyExcel 的 read 方法,并将自定义的监听器传递进去。

File targetFile = new File("/yourFile/file.xls"); // 读取的文件
int specifiedColumnIndex = 0:// 可传入指定列索引,用以拆分excel表格
CustomExcelListener listener = new CustomExcelListener("可传入指定列索引,用以拆分excel表格");
ExcelReader excelReader = EasyExcel.read(targetFile)
            .sheet(0)
            .registerReadListener(listener )
            .doRead();
listener.getDataMap();// 可获取拆分后的表数据

通过 specifiedColumnIndex 变量来指定用于拆分表格的列索引。在实际应用中,这个索引值可能需要根据具体情况动态确定。

总结

通过上述方案,可高效应对供应链、电商等场景中非固定列结构的Excel拆分需求,具体性能优化需自行添加。实际应用中建议结合具体业务场景选择拆分策略(如按时间/地区等多列组合拆分)。


http://www.kler.cn/a/589543.html

相关文章:

  • ZVA-Z90,罗德与施瓦茨毫米波变换器
  • 边缘端设备开发流程全解
  • uniapp-x web 开发警告提示以及解决方法
  • Rust + WebAssembly 开发环境搭建指南
  • 蓝桥杯 第五天 2021 国赛 第 5 题 最小权值
  • 使用BLSTM自动评估句子级构音障碍的可理解性
  • ssh命令
  • QVariant:Qt中万能类型的使用与理解
  • python中多重继承和泛型 作为模板让子类实现具体业务逻辑
  • Linux错误(2)程序触发SIGBUS信号分析
  • 基于Springboot+Typst的PDF生成方案,适用于报告打印/标签打印/二维码打印等
  • 开源文档管理系统 Paperless-ngx
  • 【后端开发面试题】每日 3 题(十三)
  • 利用golang embed特性嵌入前端资源问题解决
  • 【经验分享】SpringBoot集成WebSocket开发-03 使用WebSocketSession为每个对话存储独立信息
  • Vue3中正确解析RefImpl对象
  • Hyperlane:轻量、高效、安全的 Rust Web 框架新选择
  • Java 大视界 -- Java 大数据机器学习模型的对抗攻击与防御技术研究(137)
  • 为什么手机上用 mA 和 mAh 来表示功耗和能耗?
  • java学习总结:JSP、Servlet