当前位置: 首页 > 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.lryc.cn/news/611628.html

相关文章:

  • EasyExcel高效工具类:简化Excel导入导出,支持多Sheet与枚举转换
  • QT----QAxObject在子线程中调用,发现excel指针为空
  • Excel制作尖刀图,直观展示业绩涨跌
  • EXCEL-业绩、目标、达成、同比、环比一图呈现
  • 从“T+1”到“T+0”:基于SQL构建MES到数据仓库的数据采集通道
  • OpenGL VBO:顶点缓冲对象的深度解析
  • 点穴式优化:用DeepSeek精准识别关键节点的产品体验突破法
  • PostgreSQL报错“maximum number of prepared transactions reached”原因及高效解决方案解析
  • 推荐一款优质的开源博客与内容管理系统
  • Mac安装WebStorm
  • C++11实现线程池(2)固定线程池
  • Java Stream API 详解(Java 8+)
  • 云计算一阶段Ⅱ——12. SELinux 加固 Linux 安全
  • 8.6学习总结
  • AI增强的软件测试工具
  • 网站、域名、IP在什么场景下需要备案
  • 动态代理常用的两种方式?
  • OA系统详解:有哪些功能、主流产品怎么选?
  • 自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网
  • 深度解析:AI如何重塑供应链?从被动响应到预测性防御的三大核心实践
  • 希尔排序:高效插入排序的进阶之道
  • 【JS-7-ajax】AJAX技术:现代Web开发的异步通信核心
  • 【Java String】类深度解析:从原理到高效使用技巧
  • 生成网站sitemap.xml地图教程
  • 从代码学习LLM - llama3 PyTorch版
  • GitHub Spark公共预览版上线
  • 利用OJ判题的多语言优雅解耦方法深入体会模板方法模式、策略模式、工厂模式的妙用
  • 本地服务器端部署基于大模型的通用OCR项目——dots.ocr
  • 达梦数据库日常运维命令
  • cdn是什么