MrLee580 2023-11-05 16:28 采纳率: 42.9%
浏览 61
已结题

Java使用EasyExcel 解析复杂Excel 寻找表头以及合并单元格取值结果集用List<Map<String,String>>封装

Java使用EasyExcel 解析复杂Excel 寻找表头以及合并单元格取值结果集用List<Map<String,String>>封装。类似于下面表格。
小计那行可以不需要;也可以要。

img

解析结果如下:
年级:一年级
班级:三班
分组一:1
分组二:2
分组三:3
证书:有
证书编号:Z00123

年级:一年级
班级:三班
分组一:3
分组二:2
分组三:1
证书:有
证书编号:Z00121

年级:一年级
班级:三班
分组一:2
分组二:3
分组三:4
证书:有
证书编号:Z00124

年级:一年级
班级:三班
分组一:1
分组二:2
分组三:3
证书:无
证书编号:Z00125

遇到:小计的行 可以不要,也可以封装如下:
年级:""
班级:''''
分组一:''''
分组二:小计
分组三:4
证书:''''
证书编号:''''

  • 写回答

17条回答 默认 最新

  • 社区专家-Monster-XH 2023-11-05 16:29
    关注
    获得0.45元问题酬金

    基于Monster 组和AIGC的调写:若有帮助,还望采纳~~:

    • 可以按照下面的步骤进行:
    1. 读取Excel文件:
      使用EasyExcel的读取方法,设定好Excel文件的路径。

    2. 定义数据模型:
      由于你想要的结果是一个List<Map<String, String>>,可能不需要定义一个固定的JavaBean,但是需要定义一个监听器来处理读取的数据。

    3. 处理合并单元格:
      EasyExcel支持读取合并单元格的信息,但是需要自定义事件监听器来处理。

    4. 提取数据:
      在读取的时候,根据行和列的索引提取出你需要的数据,忽略不需要的行(如“小计”),除非也需要被封装。

    5. 封装数据:
      在自定义监听器中,每读取一行数据,就将其封装到Map中,然后将这个Map添加到List中。

    6. 关闭资源:
      读取完毕后,确保释放资源,如关闭文件流等。

    具体到你的表格,这里是一个简化版的代码逻辑,用于指导如何实现你的需求:

    // 使用EasyExcel读取文件
    EasyExcel.read(fileName, new ReadListener<ReadRow>() {
        // 每读取一行数据时,都会调用这个方法
        @Override
        public void invoke(ReadRow data, AnalysisContext context) {
            // 创建Map来存储数据
            Map<String, String> dataMap = new HashMap<>();
    
            // 将需要的数据填入map
            dataMap.put("年级", "一年级");
            dataMap.put("班级", "三班");
            // ... 根据实际情况提取和填入其他数据
    
            // 如果当前行是“小计”,可以选择忽略或特殊处理
            if (isSummaryRow(data)) {
                // 如果不需要小计,则直接返回
                return;
                // 如果需要小计,可以这样处理:
                // dataMap.put("分组二", "小计");
                // 其他字段可以根据需要放入空字符串或相应的值
            }
    
            // 将map添加到List中
            dataList.add(dataMap);
        }
    
        // 所有数据解析完成了都会来调用
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // 可以在这里处理一些收尾工作,比如关闭资源
        }
    
        // 根据内容判断是否是“小计”行
        private boolean isSummaryRow(ReadRow data) {
            // 这里根据实际情况来编写判断逻辑
            return "小计".equals(data.getSomeField());
        }
    })
    .sheet() // 如果有多个sheet,也可以指定读取的sheet,这里假设只读取第一个
    .doRead();
    

    这里ReadRow是假设的一个类,你可能需要根据实际的列映射创建这样一个类,或者直接使用Map处理,取决于EasyExcel的版本和功能。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月13日
  • 创建了问题 11月5日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址