Skip to content

Commit 0acb6e0

Browse files
fix: reset cached batch in PageReadListener between sheets to avoid duplicate rows (#961)
Co-authored-by: Bengbengbalabalabeng <70380092+bengbengbalabalabeng@users.noreply.github.com>
1 parent 9a3201f commit 0acb6e0

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

fesod-sheet/src/main/java/org/apache/fesod/sheet/read/listener/PageReadListener.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public void invoke(T data, AnalysisContext context) {
7777
public void doAfterAllAnalysed(AnalysisContext context) {
7878
if (CollectionUtils.isNotEmpty(cachedDataList)) {
7979
consumer.accept(cachedDataList);
80+
cachedDataList = ListUtils.newArrayListWithExpectedSize(batchCount);
8081
}
8182
}
8283
}

fesod-sheet/src/test/java/org/apache/fesod/sheet/core/SimpleDataTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@
2626
package org.apache.fesod.sheet.core;
2727

2828
import java.io.File;
29+
import java.util.ArrayList;
30+
import java.util.Arrays;
2931
import java.util.List;
3032
import java.util.Map;
33+
import java.util.stream.Collectors;
34+
import org.apache.fesod.sheet.ExcelWriter;
3135
import org.apache.fesod.sheet.FesodSheet;
3236
import org.apache.fesod.sheet.read.listener.PageReadListener;
3337
import org.apache.fesod.sheet.testkit.Tags;
@@ -114,4 +118,33 @@ void pageReadListener07() throws Exception {
114118
.sheet()
115119
.doRead();
116120
}
121+
122+
@Test
123+
void pageReadListenerMultipleSheets07() throws Exception {
124+
File file = createTempFile(ExcelFormat.XLSX);
125+
try (ExcelWriter excelWriter = FesodSheet.write(file, SimpleData.class).build()) {
126+
excelWriter.write(
127+
TestDataBuilder.simpleData(3, "First"),
128+
FesodSheet.writerSheet(0, "sheet0").build());
129+
excelWriter.write(
130+
TestDataBuilder.simpleData(4, "Second"),
131+
FesodSheet.writerSheet(1, "sheet1").build());
132+
}
133+
134+
List<SimpleData> allData = new ArrayList<>();
135+
FesodSheet.read(file, SimpleData.class, new PageReadListener<SimpleData>(allData::addAll, 5))
136+
.doReadAll();
137+
138+
// Each row must be delivered exactly once, even when a sheet ends with a partially filled batch
139+
Assertions.assertEquals(
140+
Arrays.asList(
141+
"FirstName0",
142+
"FirstName1",
143+
"FirstName2",
144+
"SecondName0",
145+
"SecondName1",
146+
"SecondName2",
147+
"SecondName3"),
148+
allData.stream().map(SimpleData::getName).collect(Collectors.toList()));
149+
}
117150
}

0 commit comments

Comments
 (0)