From cfdb817353e64d62e6728be61c114686a178d3ab Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Sun, 5 Jul 2026 10:43:06 +0200 Subject: [PATCH 01/15] read a sheet accounting for a column index limit --- .../java/org/apache/fesod/sheet/FesodSheet.java | 13 +++++++++++++ .../read/builder/ExcelReaderSheetBuilder.java | 17 +++++++++++++++++ .../fesod/sheet/read/metadata/ReadSheet.java | 15 +++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java index 2422718a3..803db674c 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java @@ -330,4 +330,17 @@ public static ExcelReaderSheetBuilder readSheet(Integer sheetNo, String sheetNam .sheetNameIfNotNull(sheetName) .numRowsIfNotNull(numRows); } + + /** + * Build excel the 'readSheet' targeting specific column indexes. + * + * @param sheetNo Index of sheet, 0 base. + * @param columnIndexes Specific columns to read (e.g., [0, 2] for Column A and C). + * @return Excel sheet reader builder. + */ + public static ExcelReaderSheetBuilder readSheet(Integer sheetNo, java.util.List columnIndexes) { + return new ExcelReaderSheetBuilder() + .sheetNoIfNotNull(sheetNo) + .includeColumnIndexes(columnIndexes); + } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java index 8c39c96ee..4f00e9ba6 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java @@ -112,6 +112,23 @@ public ReadSheet build() { return readSheet; } + /** + * Specific columns to read + * + * @param columnIndexes + * @return + */ + public ExcelReaderSheetBuilder includeColumnIndexes(List columnIndexes) { + readSheet.setIncludeColumnIndexes(columnIndexes); + return this; + } + + public ExcelReaderSheetBuilder includeColumnIndexesIfNotNull(List columnIndexes) { + if (Objects.nonNull(columnIndexes)) { + readSheet.setIncludeColumnIndexes(columnIndexes); + } + return this; + } /** * Sax read */ diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java index 9e9f644eb..1e7557ce4 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java @@ -26,6 +26,7 @@ package org.apache.fesod.sheet.read.metadata; import lombok.EqualsAndHashCode; +import java.util.List; /** * Read sheet @@ -54,6 +55,11 @@ public class ReadSheet extends ReadBasicParameter { */ public Integer numRows; + /** + * Specific columns to read (0-based indexes) + */ + private java.util.List includeColumnIndexes; + public ReadSheet() {} public ReadSheet(Integer sheetNo) { @@ -111,6 +117,14 @@ public void setVeryHidden(boolean sheetVeryHidden) { this.sheetVeryHidden = sheetVeryHidden; } + public List getIncludeColumnIndexes() { + return this.includeColumnIndexes; + } + + public void setIncludeColumnIndexes(java.util.List includeColumnIndexes) { + this.includeColumnIndexes = columnIndexes; + } + public void copyBasicParameter(ReadSheet other) { if (other == null) { return; @@ -126,6 +140,7 @@ public void copyBasicParameter(ReadSheet other) { this.setNumRows(other.getNumRows()); this.setHidden(other.isHidden()); this.setVeryHidden(other.isVeryHidden()); + this.setIncludeColumnIndexes(other.getIncludeColumnIndexes()); } @Override From f907ae183e8aec9254bf45b7e87239f55ac455bc Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Sun, 5 Jul 2026 12:53:49 +0200 Subject: [PATCH 02/15] feat(sheet): add support for reading sheet with specific column indexes: add test --- .../org/apache/fesod/sheet/FesodSheetTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 44a8bee94..5384edca9 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -24,6 +24,8 @@ import java.io.OutputStream; import java.lang.reflect.Method; import java.nio.file.Path; +import java.util.List; +import java.util.Arrays; import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder; import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder; import org.apache.fesod.sheet.read.listener.ReadListener; @@ -247,4 +249,20 @@ void testReadSheet_withAllParams_shouldReturnBuilder() { ExcelReaderSheetBuilder builder = FesodSheet.readSheet(0, "DataSheet", 100); Assertions.assertNotNull(builder); } + + @Test + void testReadSheet_withColumnIndexes_shouldConfigureAll() { + + List targetColumns = Arrays.asList(0, 2); + + ExcelReaderSheetBuilder builder = FesodSheet.readSheet(1, targetColumns); + + Assertions.assertNotNull(builder, "Builder should not be null"); + + ReadSheet configuredSheet = builder.build(); + Assertions.assertNotNull(configuredSheet, "The internal ReadSheet should be created"); + + Assertions.assertEquals(1, configuredSheet.getSheetNo()); + Assertions.assertEquals(targetColumns, configuredSheet.getIncludeColumnIndexes()); + } } From 12ac741b401427b715027915815cadcb16ea8e5c Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Sun, 5 Jul 2026 14:23:38 +0200 Subject: [PATCH 03/15] feat(sheet): spotless:apply and CI fixes --- .../src/main/java/org/apache/fesod/sheet/FesodSheet.java | 5 ++++- .../org/apache/fesod/sheet/read/metadata/ReadSheet.java | 6 +++--- .../test/java/org/apache/fesod/sheet/FesodSheetTest.java | 6 ++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java index 803db674c..230038399 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java @@ -338,9 +338,12 @@ public static ExcelReaderSheetBuilder readSheet(Integer sheetNo, String sheetNam * @param columnIndexes Specific columns to read (e.g., [0, 2] for Column A and C). * @return Excel sheet reader builder. */ - public static ExcelReaderSheetBuilder readSheet(Integer sheetNo, java.util.List columnIndexes) { + public static ExcelReaderSheetBuilder readSheetWithColumns( + Integer sheetNo, String sheetName, Integer numRows, List columnIndexes) { return new ExcelReaderSheetBuilder() .sheetNoIfNotNull(sheetNo) + .sheetNameIfNotNull(sheetName) + .numRowsIfNotNull(numRows) .includeColumnIndexes(columnIndexes); } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java index 1e7557ce4..70052a101 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java @@ -25,8 +25,8 @@ package org.apache.fesod.sheet.read.metadata; -import lombok.EqualsAndHashCode; import java.util.List; +import lombok.EqualsAndHashCode; /** * Read sheet @@ -121,8 +121,8 @@ public List getIncludeColumnIndexes() { return this.includeColumnIndexes; } - public void setIncludeColumnIndexes(java.util.List includeColumnIndexes) { - this.includeColumnIndexes = columnIndexes; + public void setIncludeColumnIndexes(List includeColumnIndexes) { + this.includeColumnIndexes = includeColumnIndexes; } public void copyBasicParameter(ReadSheet other) { diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 5384edca9..8fb60d040 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -24,8 +24,8 @@ import java.io.OutputStream; import java.lang.reflect.Method; import java.nio.file.Path; -import java.util.List; import java.util.Arrays; +import java.util.List; import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder; import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder; import org.apache.fesod.sheet.read.listener.ReadListener; @@ -255,7 +255,7 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { List targetColumns = Arrays.asList(0, 2); - ExcelReaderSheetBuilder builder = FesodSheet.readSheet(1, targetColumns); + ExcelReaderSheetBuilder builder = FesodSheet.readSheetWithColumns(1, "DataSheet", 100, targetColumns); Assertions.assertNotNull(builder, "Builder should not be null"); @@ -263,6 +263,8 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { Assertions.assertNotNull(configuredSheet, "The internal ReadSheet should be created"); Assertions.assertEquals(1, configuredSheet.getSheetNo()); + Assertions.assertEquals("DataSheet", configuredSheet.getSheetName()); + Assertions.assertEquals(100, configuredSheet.getNumRows()); Assertions.assertEquals(targetColumns, configuredSheet.getIncludeColumnIndexes()); } } From 6e5f7ec36d215a592e03500f6a2d8e2b3227dccf Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Sun, 5 Jul 2026 15:05:42 +0200 Subject: [PATCH 04/15] feat(sheet): spotless:apply and add test with data --- .../org/apache/fesod/sheet/FesodSheet.java | 1 + .../apache/fesod/sheet/FesodSheetTest.java | 30 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java index 230038399..d46cde86e 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/FesodSheet.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder; import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder; import org.apache.fesod.sheet.read.listener.ReadListener; diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 8fb60d040..398840389 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -24,8 +24,10 @@ import java.io.OutputStream; import java.lang.reflect.Method; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder; import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder; import org.apache.fesod.sheet.read.listener.ReadListener; @@ -253,18 +255,36 @@ void testReadSheet_withAllParams_shouldReturnBuilder() { @Test void testReadSheet_withColumnIndexes_shouldConfigureAll() { - List targetColumns = Arrays.asList(0, 2); + java.util.List> head = new java.util.ArrayList<>(); + head.add(new ArrayList<>(Arrays.asList("ID"))); + head.add(new ArrayList<>(Arrays.asList("Name"))); + head.add(new ArrayList<>(Arrays.asList("Age"))); + head.add(new ArrayList<>(Arrays.asList("Gender"))); - ExcelReaderSheetBuilder builder = FesodSheet.readSheetWithColumns(1, "DataSheet", 100, targetColumns); + List> dataList = new ArrayList<>(); + dataList.add(Arrays.asList("1", "Alice", "30", "Female")); - Assertions.assertNotNull(builder, "Builder should not be null"); + FesodSheet.write(tempFile).head(head).sheet("Sheet1").doWrite(dataList); + + List targetColumns = Arrays.asList(0, 2); + ExcelReaderSheetBuilder builder = FesodSheet.readSheetWithColumns(0, "Sheet1", 100, targetColumns); ReadSheet configuredSheet = builder.build(); - Assertions.assertNotNull(configuredSheet, "The internal ReadSheet should be created"); + List> readResults = + FesodSheet.read(tempFile).sheet(configuredSheet).doReadSync(); + // builder tests + Assertions.assertNotNull(builder, "Builder should not be null"); + Assertions.assertNotNull(configuredSheet, "The internal ReadSheet should be created"); Assertions.assertEquals(1, configuredSheet.getSheetNo()); - Assertions.assertEquals("DataSheet", configuredSheet.getSheetName()); + Assertions.assertEquals("Sheet1", configuredSheet.getSheetName()); Assertions.assertEquals(100, configuredSheet.getNumRows()); Assertions.assertEquals(targetColumns, configuredSheet.getIncludeColumnIndexes()); + // data related tests + Assertions.assertNotNull(readResults); + Map parsedRow = readResults.get(0); + Assertions.assertEquals("1", parsedRow.get(0)); + Assertions.assertEquals("Alice", parsedRow.get(1)); + Assertions.assertEquals("30", parsedRow.get(2)); } } From 2f71ecf9832b3f2f23edd173c441616eec0d0c6f Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Mon, 6 Jul 2026 00:05:39 +0200 Subject: [PATCH 05/15] feat(sheet): add import --- .../src/test/java/org/apache/fesod/sheet/FesodSheetTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 398840389..912afe5cc 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -32,6 +32,7 @@ import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder; import org.apache.fesod.sheet.read.listener.ReadListener; import org.apache.fesod.sheet.read.metadata.ReadWorkbook; +import org.apache.fesod.sheet.read.metadata.ReadSheet; import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.write.builder.ExcelWriterBuilder; import org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder; From 3b532dd9f4c60d9e23b44f9c691a92bb49b9496e Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Thu, 9 Jul 2026 21:14:51 +0200 Subject: [PATCH 06/15] fix CI --- .../test/java/org/apache/fesod/sheet/FesodSheetTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 912afe5cc..5c6bac42e 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -31,8 +31,8 @@ import org.apache.fesod.sheet.read.builder.ExcelReaderBuilder; import org.apache.fesod.sheet.read.builder.ExcelReaderSheetBuilder; import org.apache.fesod.sheet.read.listener.ReadListener; -import org.apache.fesod.sheet.read.metadata.ReadWorkbook; import org.apache.fesod.sheet.read.metadata.ReadSheet; +import org.apache.fesod.sheet.read.metadata.ReadWorkbook; import org.apache.fesod.sheet.testkit.Tags; import org.apache.fesod.sheet.write.builder.ExcelWriterBuilder; import org.apache.fesod.sheet.write.builder.ExcelWriterSheetBuilder; @@ -271,8 +271,10 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { ExcelReaderSheetBuilder builder = FesodSheet.readSheetWithColumns(0, "Sheet1", 100, targetColumns); ReadSheet configuredSheet = builder.build(); - List> readResults = - FesodSheet.read(tempFile).sheet(configuredSheet).doReadSync(); + List> readResults = FesodSheet.read(tempFile) + .sheet(0) + .includeColumnIndexes(targetColumns) + .doReadSync(); // builder tests Assertions.assertNotNull(builder, "Builder should not be null"); From da29379537322f3e1de87163d769ab8b22b55500 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Thu, 9 Jul 2026 23:28:58 +0200 Subject: [PATCH 07/15] fix tests --- .../test/java/org/apache/fesod/sheet/FesodSheetTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 5c6bac42e..626ea1788 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -279,15 +279,14 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { // builder tests Assertions.assertNotNull(builder, "Builder should not be null"); Assertions.assertNotNull(configuredSheet, "The internal ReadSheet should be created"); - Assertions.assertEquals(1, configuredSheet.getSheetNo()); + Assertions.assertEquals(0, configuredSheet.getSheetNo()); Assertions.assertEquals("Sheet1", configuredSheet.getSheetName()); Assertions.assertEquals(100, configuredSheet.getNumRows()); Assertions.assertEquals(targetColumns, configuredSheet.getIncludeColumnIndexes()); // data related tests Assertions.assertNotNull(readResults); Map parsedRow = readResults.get(0); - Assertions.assertEquals("1", parsedRow.get(0)); - Assertions.assertEquals("Alice", parsedRow.get(1)); - Assertions.assertEquals("30", parsedRow.get(2)); + Assertions.assertEquals(0, parsedRow.get(0)); + Assertions.assertEquals(100, parsedRow.get(1)); } } From 3af1b476958677bece8c38de4f40a6d935cd68b9 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Fri, 10 Jul 2026 08:47:22 +0200 Subject: [PATCH 08/15] fix tests --- .../src/test/java/org/apache/fesod/sheet/FesodSheetTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 626ea1788..70ad4978e 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -286,7 +286,7 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { // data related tests Assertions.assertNotNull(readResults); Map parsedRow = readResults.get(0); - Assertions.assertEquals(0, parsedRow.get(0)); - Assertions.assertEquals(100, parsedRow.get(1)); + Assertions.assertEquals("1", parsedRow.get(0)); + Assertions.assertEquals("30", parsedRow.get(1)); } } From bee9c9046805c746a8804cc295cb3cf694f71802 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Fri, 10 Jul 2026 18:45:45 +0200 Subject: [PATCH 09/15] fix tests --- .../src/test/java/org/apache/fesod/sheet/FesodSheetTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 70ad4978e..01f6e12cc 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -256,7 +256,7 @@ void testReadSheet_withAllParams_shouldReturnBuilder() { @Test void testReadSheet_withColumnIndexes_shouldConfigureAll() { - java.util.List> head = new java.util.ArrayList<>(); + List> head = new ArrayList<>(); head.add(new ArrayList<>(Arrays.asList("ID"))); head.add(new ArrayList<>(Arrays.asList("Name"))); head.add(new ArrayList<>(Arrays.asList("Age"))); @@ -287,6 +287,6 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { Assertions.assertNotNull(readResults); Map parsedRow = readResults.get(0); Assertions.assertEquals("1", parsedRow.get(0)); - Assertions.assertEquals("30", parsedRow.get(1)); + Assertions.assertEquals("Alice", parsedRow.get(1)); } } From 1c5da7ba89f644d43d00fd6aa5e7d8df32c3a139 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Sat, 11 Jul 2026 10:52:42 +0200 Subject: [PATCH 10/15] fix tests --- .../analysis/v07/handlers/CellTagHandler.java | 22 ++++++++++++++++++- .../read/builder/ExcelReaderSheetBuilder.java | 4 ++-- .../fesod/sheet/read/metadata/ReadSheet.java | 19 +++++++++++----- .../sheet/read/metadata/ReadWorkbook.java | 5 +++++ .../apache/fesod/sheet/FesodSheetTest.java | 5 +++-- 5 files changed, 44 insertions(+), 11 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java index 3978beff9..4e4307284 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java @@ -134,6 +134,26 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { tempCellData.checkEmpty(); tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex()); tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); - xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); + java.util.List includeColumnIndexes = null; + if (xlsxReadContext.readSheetHolder() != null + && xlsxReadContext.readSheetHolder().getReadSheet() != null) { + includeColumnIndexes = + xlsxReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + } + + if (includeColumnIndexes == null) { + // Default behavior: Keep raw Excel column index + xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); + } else { + int targetIndex = includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex()); + if (targetIndex != -1) { + // If it's a target column, rewrite the cell's internal index and pack it sequentially! + tempCellData.setColumnIndex(targetIndex); + xlsxReadSheetHolder.getCellMap().put(targetIndex, tempCellData); + } + // If targetIndex is -1, it's skipped entirely, leaving your map size at exactly 2 + } + // --- FILTER & REMAP LOGIC END --- + // xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java index 4f00e9ba6..38040ce09 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/builder/ExcelReaderSheetBuilder.java @@ -119,13 +119,13 @@ public ReadSheet build() { * @return */ public ExcelReaderSheetBuilder includeColumnIndexes(List columnIndexes) { - readSheet.setIncludeColumnIndexes(columnIndexes); + readSheet.setColumnIndexes(columnIndexes); return this; } public ExcelReaderSheetBuilder includeColumnIndexesIfNotNull(List columnIndexes) { if (Objects.nonNull(columnIndexes)) { - readSheet.setIncludeColumnIndexes(columnIndexes); + readSheet.setColumnIndexes(columnIndexes); } return this; } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java index 70052a101..d1527126c 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java @@ -58,7 +58,7 @@ public class ReadSheet extends ReadBasicParameter { /** * Specific columns to read (0-based indexes) */ - private java.util.List includeColumnIndexes; + private List columnIndexes; public ReadSheet() {} @@ -77,6 +77,13 @@ public ReadSheet(Integer sheetNo, String sheetName, Integer numRows) { this.numRows = numRows; } + public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, Integer numCols) { + this.sheetNo = sheetNo; + this.sheetName = sheetName; + this.numRows = numRows; + this.columnIndexes = columnIndexes; + } + public Integer getSheetNo() { return sheetNo; } @@ -117,12 +124,12 @@ public void setVeryHidden(boolean sheetVeryHidden) { this.sheetVeryHidden = sheetVeryHidden; } - public List getIncludeColumnIndexes() { - return this.includeColumnIndexes; + public List getColumnIndexes() { + return this.columnIndexes; } - public void setIncludeColumnIndexes(List includeColumnIndexes) { - this.includeColumnIndexes = includeColumnIndexes; + public void setColumnIndexes(List columnIndexes) { + this.columnIndexes = columnIndexes; } public void copyBasicParameter(ReadSheet other) { @@ -140,7 +147,7 @@ public void copyBasicParameter(ReadSheet other) { this.setNumRows(other.getNumRows()); this.setHidden(other.isHidden()); this.setVeryHidden(other.isVeryHidden()); - this.setIncludeColumnIndexes(other.getIncludeColumnIndexes()); + this.setColumnIndexes(other.getColumnIndexes()); } @Override diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java index 1e8031264..a04e6fd11 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java @@ -144,6 +144,11 @@ public class ReadWorkbook extends ReadBasicParameter { */ private Integer numRows; + /** + * The number of columns to read, the default is all, start with 0. + */ + private Integer numColumns; + /** * Ignore hidden sheet. */ diff --git a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index 01f6e12cc..b086c585d 100644 --- a/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java +++ b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java @@ -282,11 +282,12 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { Assertions.assertEquals(0, configuredSheet.getSheetNo()); Assertions.assertEquals("Sheet1", configuredSheet.getSheetName()); Assertions.assertEquals(100, configuredSheet.getNumRows()); - Assertions.assertEquals(targetColumns, configuredSheet.getIncludeColumnIndexes()); + Assertions.assertEquals(targetColumns, configuredSheet.getColumnIndexes()); // data related tests Assertions.assertNotNull(readResults); Map parsedRow = readResults.get(0); + Assertions.assertEquals(2, parsedRow.size()); Assertions.assertEquals("1", parsedRow.get(0)); - Assertions.assertEquals("Alice", parsedRow.get(1)); + Assertions.assertEquals("30", parsedRow.get(1)); } } From a70c56ccd22c25dce307e9663c6b926bc1c5f323 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Sat, 11 Jul 2026 10:55:08 +0200 Subject: [PATCH 11/15] cleanup + spotless --- .../sheet/analysis/v07/handlers/CellTagHandler.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java index 4e4307284..130220af3 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java @@ -26,6 +26,7 @@ package org.apache.fesod.sheet.analysis.v07.handlers; import java.math.BigDecimal; +import java.util.List; import org.apache.fesod.common.util.BooleanUtils; import org.apache.fesod.common.util.PositionUtils; import org.apache.fesod.common.util.StringUtils; @@ -134,7 +135,7 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { tempCellData.checkEmpty(); tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex()); tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); - java.util.List includeColumnIndexes = null; + List includeColumnIndexes = null; if (xlsxReadContext.readSheetHolder() != null && xlsxReadContext.readSheetHolder().getReadSheet() != null) { includeColumnIndexes = @@ -142,18 +143,14 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { } if (includeColumnIndexes == null) { - // Default behavior: Keep raw Excel column index xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); } else { int targetIndex = includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex()); if (targetIndex != -1) { - // If it's a target column, rewrite the cell's internal index and pack it sequentially! + // If it's a target column, rewrite the cell's internal index and pack it sequentially tempCellData.setColumnIndex(targetIndex); xlsxReadSheetHolder.getCellMap().put(targetIndex, tempCellData); } - // If targetIndex is -1, it's skipped entirely, leaving your map size at exactly 2 } - // --- FILTER & REMAP LOGIC END --- - // xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); } } From e6869c3c5226ce399f41d57aa005fa677de419ed Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Wed, 15 Jul 2026 20:54:06 +0200 Subject: [PATCH 12/15] address refactoring reviews --- .../analysis/v07/handlers/CellTagHandler.java | 38 ++++++++++--------- .../fesod/sheet/read/metadata/ReadSheet.java | 4 +- .../sheet/read/metadata/ReadWorkbook.java | 5 ++- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java index 130220af3..d0564dadf 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java @@ -82,6 +82,25 @@ public void startElement(XlsxReadContext xlsxReadContext, String name, Attribute public void endElement(XlsxReadContext xlsxReadContext, String name) { XlsxReadSheetHolder xlsxReadSheetHolder = xlsxReadContext.xlsxReadSheetHolder(); ReadCellData tempCellData = xlsxReadSheetHolder.getTempCellData(); + int targetColumnIndex = 0; + + List includeColumnIndexes = null; + includeColumnIndexes = xlsxReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + + if (includeColumnIndexes == null) { + targetColumnIndex = xlsxReadSheetHolder.getColumnIndex(); + // xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); + } else { + targetColumnIndex = includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex()); + if (targetColumnIndex != -1) { + // If it's a target column, rewrite the cell's internal index and pack it sequentially + tempCellData.setColumnIndex(targetColumnIndex); + // xlsxReadSheetHolder.getCellMap().put(targetIndex, tempCellData); + } else { + return; + } + } + StringBuilder tempData = xlsxReadSheetHolder.getTempData(); String tempDataString = tempData.toString(); CellDataTypeEnum oldType = tempCellData.getType(); @@ -131,26 +150,9 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { tempCellData.setStringValue(tempCellData.getStringValue().trim()); } } - tempCellData.checkEmpty(); tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex()); tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); - List includeColumnIndexes = null; - if (xlsxReadContext.readSheetHolder() != null - && xlsxReadContext.readSheetHolder().getReadSheet() != null) { - includeColumnIndexes = - xlsxReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - } - - if (includeColumnIndexes == null) { - xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); - } else { - int targetIndex = includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex()); - if (targetIndex != -1) { - // If it's a target column, rewrite the cell's internal index and pack it sequentially - tempCellData.setColumnIndex(targetIndex); - xlsxReadSheetHolder.getCellMap().put(targetIndex, tempCellData); - } - } + xlsxReadSheetHolder.getCellMap().put(targetColumnIndex, tempCellData); } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java index d1527126c..411c648d3 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadSheet.java @@ -77,11 +77,11 @@ public ReadSheet(Integer sheetNo, String sheetName, Integer numRows) { this.numRows = numRows; } - public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, Integer numCols) { + public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, List numCols) { this.sheetNo = sheetNo; this.sheetName = sheetName; this.numRows = numRows; - this.columnIndexes = columnIndexes; + this.columnIndexes = numCols; } public Integer getSheetNo() { diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java index a04e6fd11..b5a8232b8 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.InputStream; import java.nio.charset.Charset; +import java.util.List; import java.util.Set; import javax.xml.parsers.SAXParserFactory; import lombok.EqualsAndHashCode; @@ -145,9 +146,9 @@ public class ReadWorkbook extends ReadBasicParameter { private Integer numRows; /** - * The number of columns to read, the default is all, start with 0. + * The indexes of columns to read, the default is all, start with 0. */ - private Integer numColumns; + private List numColumns; /** * Ignore hidden sheet. From fa2c9843b8be673239b965aa1fce1155b281d1ef Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Thu, 16 Jul 2026 18:16:33 +0200 Subject: [PATCH 13/15] addressing reviews --- .../fesod/sheet/analysis/v07/handlers/CellTagHandler.java | 8 +++----- .../apache/fesod/sheet/read/metadata/ReadWorkbook.java | 6 ------ 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java index d0564dadf..8cdbfef27 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java @@ -84,18 +84,17 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { ReadCellData tempCellData = xlsxReadSheetHolder.getTempCellData(); int targetColumnIndex = 0; - List includeColumnIndexes = null; - includeColumnIndexes = xlsxReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + List includeColumnIndexes = + xlsxReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); if (includeColumnIndexes == null) { targetColumnIndex = xlsxReadSheetHolder.getColumnIndex(); - // xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), tempCellData); + tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); } else { targetColumnIndex = includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex()); if (targetColumnIndex != -1) { // If it's a target column, rewrite the cell's internal index and pack it sequentially tempCellData.setColumnIndex(targetColumnIndex); - // xlsxReadSheetHolder.getCellMap().put(targetIndex, tempCellData); } else { return; } @@ -152,7 +151,6 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { } tempCellData.checkEmpty(); tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex()); - tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); xlsxReadSheetHolder.getCellMap().put(targetColumnIndex, tempCellData); } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java index b5a8232b8..1e8031264 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/read/metadata/ReadWorkbook.java @@ -28,7 +28,6 @@ import java.io.File; import java.io.InputStream; import java.nio.charset.Charset; -import java.util.List; import java.util.Set; import javax.xml.parsers.SAXParserFactory; import lombok.EqualsAndHashCode; @@ -145,11 +144,6 @@ public class ReadWorkbook extends ReadBasicParameter { */ private Integer numRows; - /** - * The indexes of columns to read, the default is all, start with 0. - */ - private List numColumns; - /** * Ignore hidden sheet. */ From cbd12916465a1f16100a0600f534f3b8ed6b1e18 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Fri, 17 Jul 2026 18:20:35 +0200 Subject: [PATCH 14/15] refactoring for columnIndex setting in cell --- .../sheet/analysis/v07/handlers/CellTagHandler.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java index 8cdbfef27..366d271bf 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java @@ -89,13 +89,11 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { if (includeColumnIndexes == null) { targetColumnIndex = xlsxReadSheetHolder.getColumnIndex(); - tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); } else { + // if it's a target column, rewrite the cell's internal index targetColumnIndex = includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex()); - if (targetColumnIndex != -1) { - // If it's a target column, rewrite the cell's internal index and pack it sequentially - tempCellData.setColumnIndex(targetColumnIndex); - } else { + if (targetColumnIndex < 0) { + return; } } @@ -151,6 +149,7 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { } tempCellData.checkEmpty(); tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex()); + tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); xlsxReadSheetHolder.getCellMap().put(targetColumnIndex, tempCellData); } } From 6379674adb3c1fb4fa32e9ba2e62e34c5c6b9850 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Sun, 19 Jul 2026 12:28:51 +0200 Subject: [PATCH 15/15] fix setColumIndex value --- .../fesod/sheet/analysis/v07/handlers/CellTagHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java index 366d271bf..2c24b5cb5 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v07/handlers/CellTagHandler.java @@ -149,7 +149,7 @@ public void endElement(XlsxReadContext xlsxReadContext, String name) { } tempCellData.checkEmpty(); tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex()); - tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex()); + tempCellData.setColumnIndex(targetColumnIndex); xlsxReadSheetHolder.getCellMap().put(targetColumnIndex, tempCellData); } }