This is an automated email from the ASF dual-hosted git repository.
psxjoy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fesod.git
The following commit(s) were added to refs/heads/main by this push:
new 559d1eb3 fix: fix error in using relativeHeadRowIndex for writing
tables only (#810)
559d1eb3 is described below
commit 559d1eb35f5b077da955246379eab1bea059596d
Author: ZenanMiao <[email protected]>
AuthorDate: Wed Jul 1 16:42:46 2026 +0800
fix: fix error in using relativeHeadRowIndex for writing tables only (#810)
* fix: fix error in using relativeHeadRowIndex for writing tables only(#794)
* fix: fix error in using relativeHeadRowIndex for writing tables only(#794)
Modify code format
* Modify style issues and add unit tests
Signed-off-by: 苗泽楠 <[email protected]>
* test: enhance WriteTableTest with parameterized assertions for XLS/XLSX
- Add read-back verification via WorkbookFactory for both test cases
- Parameterize with @EnumSource to cover both .xls and .xlsx formats
- Use randomized offsets (0–9) and data sizes (1–10) for broader coverage
- Replace non-deterministic Random data with predictable prefix‑index
pattern
- Resolve header string from @ExcelProperty annotation via reflection
to avoid coupling to a hardcoded value in WriteSheetData
- Calculate expected sequential row layout (tables are sequential, not
overlapping; B's position = A's last row + offsetB + 1)
Signed-off-by: 苗泽楠 <[email protected]>
* test code format
Signed-off-by: 苗泽楠 <[email protected]>
* add copyright header and change test code.
Signed-off-by: 苗泽楠 <[email protected]>
* Avoid using import *
Signed-off-by: 苗泽楠 <[email protected]>
* remove import TestFileUtil
Signed-off-by: 苗泽楠 <[email protected]>
---------
Signed-off-by: 苗泽楠 <[email protected]>
Co-authored-by: ian zhang <[email protected]>
Co-authored-by: laolu <[email protected]>
Co-authored-by: Bengbengbalabalabeng
<[email protected]>
---
.../write/executor/ExcelWriteAddExecutor.java | 10 +-
.../apache/fesod/sheet/sheet/WriteTableTest.java | 149 +++++++++++++++++++++
2 files changed, 156 insertions(+), 3 deletions(-)
diff --git
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/executor/ExcelWriteAddExecutor.java
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/executor/ExcelWriteAddExecutor.java
index 36cace7f..1d995109 100644
---
a/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/executor/ExcelWriteAddExecutor.java
+++
b/fesod-sheet/src/main/java/org/apache/fesod/sheet/write/executor/ExcelWriteAddExecutor.java
@@ -48,6 +48,7 @@ import
org.apache.fesod.sheet.write.handler.context.RowWriteHandlerContext;
import org.apache.fesod.sheet.write.metadata.CollectionRowData;
import org.apache.fesod.sheet.write.metadata.MapRowData;
import org.apache.fesod.sheet.write.metadata.RowData;
+import org.apache.fesod.sheet.write.metadata.holder.AbstractWriteHolder;
import org.apache.fesod.sheet.write.metadata.holder.WriteHolder;
import org.apache.fesod.sheet.write.metadata.holder.WriteSheetHolder;
import org.apache.poi.ss.usermodel.Cell;
@@ -69,10 +70,13 @@ public class ExcelWriteAddExecutor extends
AbstractExcelWriteExecutor {
data = new ArrayList<>();
}
WriteSheetHolder writeSheetHolder = writeContext.writeSheetHolder();
+ WriteHolder currentWriteHolder = writeContext.currentWriteHolder();
int newRowIndex = writeSheetHolder.getNewRowIndexAndStartDoWrite();
- if (writeSheetHolder.isNew()
- && !writeSheetHolder.getExcelWriteHeadProperty().hasHead()) {
- newRowIndex +=
writeContext.currentWriteHolder().relativeHeadRowIndex();
+ if (currentWriteHolder.isNew()) {
+ AbstractWriteHolder writeHolder = (AbstractWriteHolder)
currentWriteHolder;
+ if (!writeHolder.getExcelWriteHeadProperty().hasHead()) {
+ newRowIndex += currentWriteHolder.relativeHeadRowIndex();
+ }
}
int relativeRowIndex = 0;
for (Object oneRowData : data) {
diff --git
a/fesod-sheet/src/test/java/org/apache/fesod/sheet/sheet/WriteTableTest.java
b/fesod-sheet/src/test/java/org/apache/fesod/sheet/sheet/WriteTableTest.java
new file mode 100644
index 00000000..05d0b637
--- /dev/null
+++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/sheet/WriteTableTest.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fesod.sheet.sheet;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Stream;
+import lombok.Data;
+import org.apache.fesod.sheet.ExcelWriter;
+import org.apache.fesod.sheet.FesodSheet;
+import org.apache.fesod.sheet.annotation.ExcelIgnoreUnannotated;
+import org.apache.fesod.sheet.annotation.ExcelProperty;
+import org.apache.fesod.sheet.testkit.Tags;
+import org.apache.fesod.sheet.testkit.base.AbstractExcelTest;
+import org.apache.fesod.sheet.testkit.enums.ExcelFormat;
+import org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder;
+import org.apache.fesod.sheet.write.builder.ExcelWriterTableBuilder;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+@Tag(Tags.ROUND_TRIP)
+public class WriteTableTest extends AbstractExcelTest {
+
+ @Data
+ @ExcelIgnoreUnannotated
+ public static class WriteSheetData {
+ @ExcelProperty("Title")
+ private String string;
+ }
+
+ private static final List<List<Integer>> OFFSETS = Arrays.asList(
+ Arrays.asList(0, 0, 0), Arrays.asList(0, 1, 3), Arrays.asList(1,
0, 2), Arrays.asList(2, 3, 0));
+
+ static Stream<Arguments> testData() {
+ return Stream.of(Arguments.of(ExcelFormat.XLSX, OFFSETS),
Arguments.of(ExcelFormat.XLS, OFFSETS));
+ }
+
+ @ParameterizedTest
+ @MethodSource("testData")
+ public void testWriteTable(ExcelFormat excelFormat, List<List<Integer>>
offsets) throws Exception {
+ int n = offsets.size();
+
+ File testFile = createTempFile(excelFormat);
+
+ try (ExcelWriter write = FesodSheet.write(testFile)
+ .excelType(excelFormat.toExcelTypeEnum())
+ .build()) {
+ writeSheets(write, offsets, 0, "T", true);
+ writeSheets(write, offsets, n, "U", false);
+ }
+
+ Assertions.assertTrue(testFile.exists(), "Written file should exist");
+ Assertions.assertTrue(testFile.length() > 0, "Written file should not
be empty");
+
+ try (Workbook workbook = WorkbookFactory.create(testFile)) {
+ Iterator<Sheet> it = workbook.sheetIterator();
+ for (int i = 0; i < n; i++) {
+ Assertions.assertTrue(it.hasNext(), "titled sheet " + i + "
should exist");
+ verifyRows(it.next(), true, offsets.get(i));
+ }
+ for (int i = 0; i < n; i++) {
+ Assertions.assertTrue(it.hasNext(), "untitled sheet " + i + "
should exist");
+ verifyRows(it.next(), false, offsets.get(i));
+ }
+ }
+ }
+
+ private static void writeSheets(
+ ExcelWriter write, List<List<Integer>> offsets, int startSheetNo,
String namePrefix, boolean isTitled) {
+ int n = offsets.size();
+ for (int i = 0; i < n; i++) {
+ ExcelWriterSheetBuilder sheet =
+ FesodSheet.writerSheet().sheetNo(startSheetNo +
i).sheetName(namePrefix + i);
+ List<Integer> rowOffsets = offsets.get(i);
+ for (int j = 0; j < rowOffsets.size(); j++) {
+ ExcelWriterTableBuilder table = FesodSheet.writerTable()
+ .relativeHeadRowIndex(rowOffsets.get(j))
+ .tableNo(j);
+ if (isTitled) {
+ table.head(WriteSheetData.class);
+ }
+ write.write(getList((char) ('A' + j)), sheet.build(),
table.build());
+ }
+ }
+ }
+
+ private static void verifyRows(Sheet sheet, boolean isTitled,
List<Integer> offsets) {
+ int rowIdx = 0;
+ char prefix = 'A';
+ for (int offset : offsets) {
+ if (isTitled) {
+ Row headerRow = sheet.getRow(rowIdx + offset);
+ Assertions.assertNotNull(headerRow, "Header row " + (rowIdx +
offset) + " missing");
+ Assertions.assertEquals(
+ "Title",
+ headerRow.getCell(0).getStringCellValue(),
+ "Row " + (rowIdx + offset) + " should be header");
+ rowIdx += offset + 1;
+ } else {
+ rowIdx += offset;
+ }
+ for (int j = 0; j < 2; j++) {
+ Row row = sheet.getRow(rowIdx + j);
+ Assertions.assertNotNull(row, "Data row " + (rowIdx + j) + "
missing");
+ Assertions.assertEquals(
+ prefix + "-" + j, row.getCell(0).getStringCellValue(),
"Row " + (rowIdx + j) + " mismatch");
+ }
+ rowIdx += 2;
+ prefix++;
+ }
+ }
+
+ private static List<WriteSheetData> getList(char prefix) {
+ List<WriteSheetData> list = new ArrayList<>();
+ for (int j = 0; j < 2; j++) {
+ WriteSheetData d = new WriteSheetData();
+ d.setString(prefix + "-" + j);
+ list.add(d);
+ }
+ return list;
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]