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