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]