Skip to content

Commit 651d2a4

Browse files
deleialaahongpsxjoy
authored
fix: fixed NPE exception in the WriteSheetWorkbookWriteHandler class (#566)
* fix: ensure sheetNo is set for writeSheetHolder and improve sheet indexing * test: add test cases for WriteSheet with sheet name --------- Co-authored-by: ian zhang <[email protected]> Co-authored-by: Shuxin Pan <[email protected]>
1 parent 697f554 commit 651d2a4

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

fastexcel/src/main/java/cn/idev/excel/context/WriteContextImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,11 @@ private void initSheet(WriteTypeEnum writeType) {
233233
if (currentSheet == null) {
234234
currentSheet = createSheet();
235235
}
236+
237+
if (currentSheet != null && writeSheetHolder.getSheetNo() == null) {
238+
writeSheetHolder.setSheetNo(writeWorkbookHolder.getWorkbook().getSheetIndex(currentSheet));
239+
}
240+
236241
writeSheetHolder.setSheet(currentSheet);
237242
WriteHandlerUtils.afterSheetCreate(sheetWriteHandlerContext);
238243
if (WriteTypeEnum.ADD.equals(writeType)) {

fastexcel/src/main/java/cn/idev/excel/write/handler/impl/WriteSheetWorkbookWriteHandler.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder;
88
import java.util.List;
99
import java.util.Map;
10+
import java.util.Objects;
1011
import java.util.stream.Collectors;
1112
import org.apache.commons.collections4.MapUtils;
1213
import org.apache.poi.ss.usermodel.Workbook;
@@ -32,8 +33,10 @@ public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) {
3233
}
3334
Workbook workbook = writeWorkbookHolder.getWorkbook();
3435
// sort by sheetNo.
35-
List<Integer> sheetNoSortList =
36-
writeSheetHolderMap.keySet().stream().sorted().collect(Collectors.toList());
36+
List<Integer> sheetNoSortList = writeSheetHolderMap.keySet().stream()
37+
.filter(Objects::nonNull)
38+
.sorted()
39+
.collect(Collectors.toList());
3740

3841
int pos = 0;
3942
for (Integer key : sheetNoSortList) {

fastexcel/src/test/java/cn/idev/excel/writesheet/WriteSheetTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import cn.idev.excel.FastExcel;
55
import cn.idev.excel.support.ExcelTypeEnum;
66
import cn.idev.excel.util.TestFileUtil;
7+
import cn.idev.excel.write.metadata.WriteSheet;
78
import java.io.File;
89
import java.util.ArrayList;
910
import java.util.Arrays;
@@ -28,6 +29,8 @@ public void testSheetOrder03() {
2829
testSheetOrderInternal(ExcelTypeEnum.XLS, Arrays.asList(-1));
2930
testSheetOrderInternal(ExcelTypeEnum.XLS, Arrays.asList(-8, -10, -6));
3031
testSheetOrderInternal(ExcelTypeEnum.XLS, Arrays.asList(-8, 6));
32+
// build a WriteSheet using the sheet name
33+
testSheetOrderWithSheetName(ExcelTypeEnum.XLS);
3134
}
3235

3336
@Test
@@ -42,6 +45,8 @@ public void testSheetOrder07() {
4245
testSheetOrderInternal(ExcelTypeEnum.XLSX, Arrays.asList(-1));
4346
testSheetOrderInternal(ExcelTypeEnum.XLSX, Arrays.asList(-8, -10, -6));
4447
testSheetOrderInternal(ExcelTypeEnum.XLSX, Arrays.asList(-8, 6));
48+
// build a WriteSheet using the sheet name
49+
testSheetOrderWithSheetName(ExcelTypeEnum.XLSX);
4550
}
4651

4752
private void testSheetOrderInternal(ExcelTypeEnum excelTypeEnum, List<Integer> sheetNoList) {
@@ -81,6 +86,49 @@ private Map<Integer, Integer> initSheetDataSizeList(List<Integer> sheetNoList) {
8186
return dataMap;
8287
}
8388

89+
private void testSheetOrderWithSheetName(ExcelTypeEnum excelTypeEnum) {
90+
List<String> sheetNameList = Arrays.asList("Sheet1", "Sheet2", "Sheet3");
91+
List<Integer> sheetNoList = Arrays.asList(0, 1, 2);
92+
93+
Map<Integer, Integer> dataMap = initSheetDataSizeList(sheetNoList);
94+
File testFile = TestFileUtil.createNewFile("writesheet/write-sheet-order-name" + excelTypeEnum.getValue());
95+
96+
try (ExcelWriter excelWriter = FastExcel.write(testFile, WriteSheetData.class)
97+
.excelType(excelTypeEnum)
98+
.build()) {
99+
100+
// sheetName is empty
101+
int sheetNo = 0;
102+
WriteSheet writeSheet = FastExcel.writerSheet(sheetNo).build();
103+
excelWriter.write(dataList(dataMap.get(sheetNo)), writeSheet);
104+
Assertions.assertEquals(
105+
sheetNo, excelWriter.writeContext().writeSheetHolder().getSheetNo());
106+
107+
// sheetNo is empty
108+
sheetNo = 1;
109+
writeSheet = FastExcel.writerSheet(sheetNameList.get(sheetNo)).build();
110+
excelWriter.write(dataList(dataMap.get(sheetNo)), writeSheet);
111+
Assertions.assertEquals(
112+
sheetNo, excelWriter.writeContext().writeSheetHolder().getSheetNo());
113+
114+
sheetNo = 2;
115+
writeSheet =
116+
FastExcel.writerSheet(sheetNo, sheetNameList.get(sheetNo)).build();
117+
excelWriter.write(dataList(dataMap.get(sheetNo)), writeSheet);
118+
Assertions.assertEquals(
119+
sheetNo, excelWriter.writeContext().writeSheetHolder().getSheetNo());
120+
}
121+
122+
for (int i = 0; i < sheetNoList.size(); i++) {
123+
List<WriteSheetData> sheetDataList = FastExcel.read(testFile)
124+
.excelType(excelTypeEnum)
125+
.head(WriteSheetData.class)
126+
.sheet(i)
127+
.doReadSync();
128+
Assertions.assertEquals(dataMap.get(sheetNoList.get(i)), sheetDataList.size());
129+
}
130+
}
131+
84132
private static List<WriteSheetData> dataList(int size) {
85133
List<WriteSheetData> dataList = new ArrayList<>();
86134
for (int i = 0; i < size; i++) {

0 commit comments

Comments
 (0)