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..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; @@ -330,4 +331,20 @@ 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 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/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..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,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 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(List includeColumnIndexes) { + this.includeColumnIndexes = includeColumnIndexes; + } + 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 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..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 @@ -24,10 +24,15 @@ 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.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; @@ -247,4 +252,40 @@ void testReadSheet_withAllParams_shouldReturnBuilder() { ExcelReaderSheetBuilder builder = FesodSheet.readSheet(0, "DataSheet", 100); Assertions.assertNotNull(builder); } + + @Test + void testReadSheet_withColumnIndexes_shouldConfigureAll() { + + 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"))); + + List> dataList = new ArrayList<>(); + dataList.add(Arrays.asList("1", "Alice", "30", "Female")); + + 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(); + 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("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)); + } }