diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/ReadSheetHolder.java b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/ReadSheetHolder.java index db5c4f73..a545a35e 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/ReadSheetHolder.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/ReadSheetHolder.java @@ -63,7 +63,7 @@ public class ReadSheetHolder extends AbstractReadHolder { private ReadCellData tempCellData; /** * Read the size of the largest head in sheet head data. - * see https://github.com/alibaba/easyexcel/issues/2014 + * @see https://github.com/alibaba/easyexcel/issues/2014 */ private Integer maxNotEmptyDataHeadSize; diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/read/processor/DefaultAnalysisEventProcessor.java b/easyexcel-core/src/main/java/com/alibaba/excel/read/processor/DefaultAnalysisEventProcessor.java index 0d783a7b..0fabae14 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/read/processor/DefaultAnalysisEventProcessor.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/read/processor/DefaultAnalysisEventProcessor.java @@ -1,5 +1,6 @@ package com.alibaba.excel.read.processor; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -91,7 +92,7 @@ public class DefaultAnalysisEventProcessor implements AnalysisEventProcessor { private void dealData(AnalysisContext analysisContext) { ReadRowHolder readRowHolder = analysisContext.readRowHolder(); - Map> cellDataMap = (Map)readRowHolder.getCellMap(); + Map> cellDataMap = (Map) readRowHolder.getCellMap(); readRowHolder.setCurrentRowAnalysisResult(cellDataMap); int rowIndex = readRowHolder.getRowIndex(); int currentHeadRowNumber = analysisContext.readSheetHolder().getHeadRowNumber(); @@ -124,9 +125,13 @@ public class DefaultAnalysisEventProcessor implements AnalysisEventProcessor { // Rule out empty head, and then take the largest column if (MapUtils.isNotEmpty(cellDataMap)) { cellDataMap.entrySet() - .stream() - .filter(entry -> CellDataTypeEnum.EMPTY != entry.getValue().getType()) - .forEach(entry -> analysisContext.readSheetHolder().setMaxNotEmptyDataHeadSize(entry.getKey())); + .stream() + .filter(entry -> CellDataTypeEnum.EMPTY != entry.getValue().getType()) + // 这里的size应该要 +1,不然在 com.alibaba.excel.read.listener.ModelBuildEventListener#buildNoModel() 里面判断head size和数据index的时候会有问题,导致有头但是空cell的数据不会被设置 + // com/alibaba/excel/read/listener/ModelBuildEventListener.java:80 + // fix https://github.com/alibaba/easyexcel/issues/3515 + // fix https://github.com/alibaba/easyexcel/issues/2014 + .forEach(entry -> analysisContext.readSheetHolder().setMaxNotEmptyDataHeadSize(entry.getKey() + 1)); } if (!HeadKindEnum.CLASS.equals(analysisContext.currentReadHolder().excelReadHeadProperty().getHeadKind())) { diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue2014_3515/Issue3515Test.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue2014_3515/Issue3515Test.java new file mode 100644 index 00000000..6e5e517f --- /dev/null +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue2014_3515/Issue3515Test.java @@ -0,0 +1,53 @@ +package com.alibaba.easyexcel.test.temp.issue2014_3515; + +import com.alibaba.easyexcel.test.util.TestFileUtil; +import com.alibaba.excel.EasyExcel; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * issue 3515 修复单元测试 + * + * @see https://github.com/alibaba/easyexcel/issues/3515 + * @author nukiyoam + */ +@Slf4j +public class Issue3515Test { + + @Test + public void readWithHeadRowNumber(){ + String fileName = String.join(File.separator, TestFileUtil.getPath(), "temp", "issue_3515", "issue_3515.xlsx"); + List> data = EasyExcel.read(fileName) + .sheet(0) + .headRowNumber(1) + .doReadSync(); + Assertions.assertEquals(3, data.size()); + data.forEach(it->{ + Assertions.assertEquals(3,it.size()); + }); + } + + @Test + public void readWithHeadList(){ + String fileName = String.join(File.separator, TestFileUtil.getPath(), "temp", "issue_3515", "issue_3515.xlsx"); + List> head = new ArrayList<>(); + head.add(Collections.singletonList("第一列")); + head.add(Collections.singletonList("第二列")); + head.add(Collections.singletonList("空列")); + List> data = EasyExcel.read(fileName) + .sheet(0) + .head(head) + .doReadSync(); + Assertions.assertEquals(3, data.size()); + data.forEach(it->{ + Assertions.assertEquals(3,it.size()); + }); + } +} diff --git a/easyexcel-test/src/test/resources/temp/issue_3515/issue_3515.xlsx b/easyexcel-test/src/test/resources/temp/issue_3515/issue_3515.xlsx new file mode 100644 index 00000000..70a52d6b Binary files /dev/null and b/easyexcel-test/src/test/resources/temp/issue_3515/issue_3515.xlsx differ