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