easyExcel 读取有合并单元格数据

读取

java 复制代码
 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();

自定义监听器

java 复制代码
// 自定义监听器(处理合并单元格)
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;
    }

    @Override
    public void extra(CellExtra extra, AnalysisContext context) {
        if (extra.getType() == CellExtraTypeEnum.MERGE) {
            mergeList.add(extra); // 收集合并单元格信息[3,4](@ref)
        }
    }

    @Override
    public 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;
    }

    @Override
    public void invoke(Map<Integer, String> rowData, AnalysisContext context) {
        dataList.add(rowData); // 缓存每行数据
    }
}