This is an automated email from the ASF dual-hosted git repository.

bengbengbalabalabeng 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 aeffefa8 feat: add support for column index limit in ReadSheet (#942)
aeffefa8 is described below

commit aeffefa80f414a63d09468afb51f3144d12df0e1
Author: Selim S. <[email protected]>
AuthorDate: Thu Jul 23 13:38:14 2026 +0200

    feat: add support for column index limit in ReadSheet (#942)
    
    * read a sheet accounting for a column index limit
    
    * feat(sheet): add support for reading sheet with specific column indexes: 
add test
    
    * feat(sheet): spotless:apply and CI fixes
    
    * feat(sheet): spotless:apply and add test with data
    
    * feat(sheet): add import
    
    * fix CI
    
    * fix tests
    
    * fix tests
    
    * fix tests
    
    * fix tests
    
    * cleanup + spotless
    
    * address refactoring reviews
    
    * addressing reviews
    
    * refactoring for columnIndex setting in cell
    
    * fix setColumIndex value
    
    ---------
    
    Co-authored-by: Selim Soufargi <[email protected]~>
    Co-authored-by: DeleiGuo <[email protected]>
    Co-authored-by: Bengbengbalabalabeng 
<[email protected]>
---
 .../java/org/apache/fesod/sheet/FesodSheet.java    | 17 +++++++++
 .../analysis/v07/handlers/CellTagHandler.java      | 22 +++++++++--
 .../read/builder/ExcelReaderSheetBuilder.java      | 17 +++++++++
 .../fesod/sheet/read/metadata/ReadSheet.java       | 22 +++++++++++
 .../org/apache/fesod/sheet/FesodSheetTest.java     | 43 ++++++++++++++++++++++
 5 files changed, 118 insertions(+), 3 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 2422718a..d46cde86 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 @@ package org.apache.fesod.sheet;
 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;
@@ -330,4 +331,20 @@ public class FesodSheet {
                 .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 readSheetWithColumns(
+            Integer sheetNo, String sheetName, Integer numRows, List<Integer> 
columnIndexes) {
+        return new ExcelReaderSheetBuilder()
+                .sheetNoIfNotNull(sheetNo)
+                .sheetNameIfNotNull(sheetName)
+                .numRowsIfNotNull(numRows)
+                .includeColumnIndexes(columnIndexes);
+    }
 }
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 3978beff..2c24b5cb 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;
@@ -81,6 +82,22 @@ public class CellTagHandler extends AbstractXlsxTagHandler {
     public void endElement(XlsxReadContext xlsxReadContext, String name) {
         XlsxReadSheetHolder xlsxReadSheetHolder = 
xlsxReadContext.xlsxReadSheetHolder();
         ReadCellData<?> tempCellData = xlsxReadSheetHolder.getTempCellData();
+        int targetColumnIndex = 0;
+
+        List<Integer> includeColumnIndexes =
+                
xlsxReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        if (includeColumnIndexes == null) {
+            targetColumnIndex = xlsxReadSheetHolder.getColumnIndex();
+        } else {
+            // if it's a target column, rewrite the cell's internal index
+            targetColumnIndex = 
includeColumnIndexes.indexOf(xlsxReadSheetHolder.getColumnIndex());
+            if (targetColumnIndex < 0) {
+
+                return;
+            }
+        }
+
         StringBuilder tempData = xlsxReadSheetHolder.getTempData();
         String tempDataString = tempData.toString();
         CellDataTypeEnum oldType = tempCellData.getType();
@@ -130,10 +147,9 @@ public class CellTagHandler extends AbstractXlsxTagHandler 
{
                 
tempCellData.setStringValue(tempCellData.getStringValue().trim());
             }
         }
-
         tempCellData.checkEmpty();
         tempCellData.setRowIndex(xlsxReadSheetHolder.getRowIndex());
-        tempCellData.setColumnIndex(xlsxReadSheetHolder.getColumnIndex());
-        
xlsxReadSheetHolder.getCellMap().put(xlsxReadSheetHolder.getColumnIndex(), 
tempCellData);
+        tempCellData.setColumnIndex(targetColumnIndex);
+        xlsxReadSheetHolder.getCellMap().put(targetColumnIndex, 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 8c39c96e..38040ce0 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 class ExcelReaderSheetBuilder extends 
AbstractExcelReaderParameterBuilder
         return readSheet;
     }
 
+    /**
+     * Specific columns to read
+     *
+     * @param columnIndexes
+     * @return
+     */
+    public ExcelReaderSheetBuilder includeColumnIndexes(List<Integer> 
columnIndexes) {
+        readSheet.setColumnIndexes(columnIndexes);
+        return this;
+    }
+
+    public ExcelReaderSheetBuilder includeColumnIndexesIfNotNull(List<Integer> 
columnIndexes) {
+        if (Objects.nonNull(columnIndexes)) {
+            readSheet.setColumnIndexes(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 9e9f644e..411c648d 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,6 +25,7 @@
 
 package org.apache.fesod.sheet.read.metadata;
 
+import java.util.List;
 import lombok.EqualsAndHashCode;
 
 /**
@@ -54,6 +55,11 @@ public class ReadSheet extends ReadBasicParameter {
      */
     public Integer numRows;
 
+    /**
+     * Specific columns to read (0-based indexes)
+     */
+    private List<Integer> columnIndexes;
+
     public ReadSheet() {}
 
     public ReadSheet(Integer sheetNo) {
@@ -71,6 +77,13 @@ public class ReadSheet extends ReadBasicParameter {
         this.numRows = numRows;
     }
 
+    public ReadSheet(Integer sheetNo, String sheetName, Integer numRows, 
List<Integer> numCols) {
+        this.sheetNo = sheetNo;
+        this.sheetName = sheetName;
+        this.numRows = numRows;
+        this.columnIndexes = numCols;
+    }
+
     public Integer getSheetNo() {
         return sheetNo;
     }
@@ -111,6 +124,14 @@ public class ReadSheet extends ReadBasicParameter {
         this.sheetVeryHidden = sheetVeryHidden;
     }
 
+    public List<Integer> getColumnIndexes() {
+        return this.columnIndexes;
+    }
+
+    public void setColumnIndexes(List<Integer> columnIndexes) {
+        this.columnIndexes = columnIndexes;
+    }
+
     public void copyBasicParameter(ReadSheet other) {
         if (other == null) {
             return;
@@ -126,6 +147,7 @@ public class ReadSheet extends ReadBasicParameter {
         this.setNumRows(other.getNumRows());
         this.setHidden(other.isHidden());
         this.setVeryHidden(other.isVeryHidden());
+        this.setColumnIndexes(other.getColumnIndexes());
     }
 
     @Override
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 44a8bee9..b086c585 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,9 +24,14 @@ import java.io.InputStream;
 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;
+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;
@@ -247,4 +252,42 @@ class FesodSheetTest {
         ExcelReaderSheetBuilder builder = FesodSheet.readSheet(0, "DataSheet", 
100);
         Assertions.assertNotNull(builder);
     }
+
+    @Test
+    void testReadSheet_withColumnIndexes_shouldConfigureAll() {
+
+        List<List<String>> head = new 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")));
+
+        List<List<Object>> dataList = new ArrayList<>();
+        dataList.add(Arrays.asList("1", "Alice", "30", "Female"));
+
+        
FesodSheet.write(tempFile).head(head).sheet("Sheet1").doWrite(dataList);
+
+        List<Integer> targetColumns = Arrays.asList(0, 2);
+
+        ExcelReaderSheetBuilder builder = FesodSheet.readSheetWithColumns(0, 
"Sheet1", 100, targetColumns);
+        ReadSheet configuredSheet = builder.build();
+        List<Map<Integer, String>> readResults = FesodSheet.read(tempFile)
+                .sheet(0)
+                .includeColumnIndexes(targetColumns)
+                .doReadSync();
+
+        // builder tests
+        Assertions.assertNotNull(builder, "Builder should not be null");
+        Assertions.assertNotNull(configuredSheet, "The internal ReadSheet 
should be created");
+        Assertions.assertEquals(0, configuredSheet.getSheetNo());
+        Assertions.assertEquals("Sheet1", configuredSheet.getSheetName());
+        Assertions.assertEquals(100, configuredSheet.getNumRows());
+        Assertions.assertEquals(targetColumns, 
configuredSheet.getColumnIndexes());
+        // data related tests
+        Assertions.assertNotNull(readResults);
+        Map<Integer, String> parsedRow = readResults.get(0);
+        Assertions.assertEquals(2, parsedRow.size());
+        Assertions.assertEquals("1", parsedRow.get(0));
+        Assertions.assertEquals("30", parsedRow.get(1));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to