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

easyExcel 读取有合并单元格数据

读取

 EasyExcel.read(new File("C:\\Users\\Lenovo\\Desktop\\fsdownload\\设备图纸.xlsx"),new MergeAwareListener(dataMap -> {for (int i = 0; i < dataMap.size(); i++) {if (i == 0){continue;}//每列的数据Map<Integer, String> map = dataMap.get(i);System.out.println( map);}})).charset(StandardCharsets.UTF_8).excelType(ExcelTypeEnum.XLSX).extraRead(CellExtraTypeEnum.MERGE).sheet(0).headRowNumber(0).doRead();

自定义监听器

// 自定义监听器(处理合并单元格)
static class MergeAwareListener extends AnalysisEventListener<Map<Integer, String>> {private final List<Map<Integer, String>> dataList = new ArrayList<>();private final List<CellExtra> mergeList = new ArrayList<>();private final Consumer<List<Map<Integer, String>>> consumer;public MergeAwareListener(Consumer<List<Map<Integer, String>>> consumer) {this.consumer = consumer;}@Overridepublic void extra(CellExtra extra, AnalysisContext context) {if (extra.getType() == CellExtraTypeEnum.MERGE) {mergeList.add(extra); // 收集合并单元格信息[3,4](@ref)}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 处理合并单元格数据List<Map<Integer, String>> result = fillMergedCells(dataList, mergeList);consumer.accept(result); // 回调处理最终数据}// 填充合并单元格的值private List<Map<Integer, String>> fillMergedCells(List<Map<Integer, String>> data,List<CellExtra> merges) {for (CellExtra merge : merges) {int firstRow = merge.getFirstRowIndex();int lastRow = merge.getLastRowIndex();int firstCol = merge.getFirstColumnIndex();int lastCol = merge.getLastColumnIndex();// 获取合并区域左上角的值[2,3](@ref)String value = data.get(firstRow).get(firstCol);for (int r = firstRow; r <= lastRow; r++) {for (int c = firstCol; c <= lastCol; c++) {Map<Integer, String> row = data.get(r);row.put(c, value); // 覆盖空值}}}return data;}@Overridepublic void invoke(Map<Integer, String> rowData, AnalysisContext context) {dataList.add(rowData); // 缓存每行数据}
}

http://www.dtcms.com/a/318041.html

相关文章:

  • 对接钉钉审批过程记录(C#版本)
  • 高可用改造之构建​​双活冗余的TDengine时序数据处理架构
  • 通过最严时序标准,再登产业图谱榜首,TDengine 时序数据库在可信数据库大会荣获双荣誉
  • AI 软件工程开发 AI 算法 架构与业务
  • Effective C++ 条款25:考虑写出一个不抛异常的swap函数
  • linux 使用docker时开放的端口不受防火墙控制的解决方案
  • 医疗AI中GPU部署的“非对等全节点架构“方案分析(上)
  • AI领域的三箭齐发之夜 - genie3,gpt-oss, Opus 4.1
  • hyper-v常见问题解答(此文会持续更新)
  • DNS 服务器
  • 远程连接----ubuntu ,rocky 等Linux系统,WindTerm_2.7.0
  • 当前主流GPU全景讲解:架构、功能与应用方向
  • 一种简单的3dnr去噪算法介绍
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十九天-投简历第一天-从兴奋到害怕
  • Unity工具—Inspector面板增加Rect Transform组件上下左右移动的工具
  • linux IO介绍
  • Android系统性能分析利器:深入解析Tracing框架
  • Dify+Nginx反向代理:80端口冲突的优雅解决方案
  • ICCV 2025 | 视频生成迈入“多段一致”新时代!TokensGen用“压缩Token”玩转长视频生成
  • Mysql如何迁移数据库数据
  • mysql数据库基础操作
  • 每日任务day0806:小小勇者成长记之收获日
  • 在 Visual Studio Code 中免费使用 Gemini 2.5 Pro API
  • 滴滴招java开发
  • 利用DeepSeek改写并增强测试Duckdb和sqlite的不同插入方法性能
  • 虚幻GAS底层原理解剖四 (TAG)
  • Boosting 知识点整理:调参技巧、可解释性工具与实战案例
  • [Oracle] NVL()函数
  • 【概念学习】深度学习有何不同
  • 220降5V,30mA电流,墙壁开关和调光器应用场景WD5201