Browse Source

Merge f2260757d5 into aae9c61ab6

pull/3685/merge
nukiyoam 5 months ago committed by GitHub
parent
commit
158c5d85ec
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/ReadSheetHolder.java
  2. 13
      easyexcel-core/src/main/java/com/alibaba/excel/read/processor/DefaultAnalysisEventProcessor.java
  3. 53
      easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue2014_3515/Issue3515Test.java
  4. BIN
      easyexcel-test/src/test/resources/temp/issue_3515/issue_3515.xlsx

2
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 <a href="https://github.com/alibaba/easyexcel/issues/2014">https://github.com/alibaba/easyexcel/issues/2014</a>
*/
private Integer maxNotEmptyDataHeadSize;

13
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<Integer, ReadCellData<?>> cellDataMap = (Map)readRowHolder.getCellMap();
Map<Integer, ReadCellData<?>> 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())) {

53
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 <a href="https://github.com/alibaba/easyexcel/issues/3515">https://github.com/alibaba/easyexcel/issues/3515</a>
* @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<Map<Integer, Object>> 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<List<String>> head = new ArrayList<>();
head.add(Collections.singletonList("第一列"));
head.add(Collections.singletonList("第二列"));
head.add(Collections.singletonList("空列"));
List<Map<Integer, Object>> data = EasyExcel.read(fileName)
.sheet(0)
.head(head)
.doReadSync();
Assertions.assertEquals(3, data.size());
data.forEach(it->{
Assertions.assertEquals(3,it.size());
});
}
}

BIN
easyexcel-test/src/test/resources/temp/issue_3515/issue_3515.xlsx

Binary file not shown.
Loading…
Cancel
Save