From f2260757d5df0ed921f7193802fe71397bbb7ae1 Mon Sep 17 00:00:00 2001 From: maoyikun Date: Wed, 31 Jan 2024 17:52:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(read):=20=E4=BF=AE=E5=A4=8D=E8=AF=BB?= =?UTF-8?q?=E5=8F=96Map=E6=95=B0=E6=8D=AE=E6=97=B6=E6=9C=80=E5=90=8E?= =?UTF-8?q?=E4=B8=80=E5=88=97=E6=95=B0=E6=8D=AE=E4=B8=BA=E7=A9=BA=E6=97=B6?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=8F=8A=E4=B8=AD=E6=B2=A1=E6=9C=89=E7=A9=BA?= =?UTF-8?q?=E5=88=97=E6=95=B0=E6=8D=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复当读取Map格式数据时,如果最后一列没有数据,那么读取到的map数据中不包含最后一列空数据的问题 Closes #3515 --- .../read/metadata/holder/ReadSheetHolder.java | 2 +- .../DefaultAnalysisEventProcessor.java | 13 +++-- .../temp/issue2014_3515/Issue3515Test.java | 53 ++++++++++++++++++ .../resources/temp/issue_3515/issue_3515.xlsx | Bin 0 -> 8641 bytes 4 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue2014_3515/Issue3515Test.java create mode 100644 easyexcel-test/src/test/resources/temp/issue_3515/issue_3515.xlsx 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 0000000000000000000000000000000000000000..70a52d6b68db634c617f9d965c1505433faf7454 GIT binary patch literal 8641 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 literal 0 HcmV?d00001