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); // 缓存每行数据}
}