You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fesod.apache.org by be...@apache.org on 2026/08/12 11:52:02 UTC

(fesod) branch main updated: feat: add support for column-based reading of XLS files (#981)

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 c8224b88 feat: add support for column-based reading of XLS files (#981)
c8224b88 is described below

commit c8224b88de26a2daa54e70466556b9ef809bb7eb
Author: Selim S. <80...@users.noreply.github.com>
AuthorDate: Wed Aug 12 12:51:57 2026 +0100

    feat: add support for column-based reading of XLS files (#981)
    
    * feature: number and sstlabel with column support
    
    * remove null checks for sheet holder and sheet
    
    * feat: adding filtering capability for columns for additional typeset: formula, bool, rk, blank etc
    
    * fix CI: missing import
    
    * fix CI : add missing imports
    
    * address reviewing comments : revert NOTE
    
    * fix: code style and restore the missing test
    
    ---------
    
    Co-authored-by: Selim Soufargi <ssoufargi.idealab.unical@gmail.com~>
    Co-authored-by: Bengbengbalabalabeng <ba...@163.com>
---
 .../analysis/v03/handlers/BlankRecordHandler.java  | 15 ++++-
 .../v03/handlers/BoolErrRecordHandler.java         | 16 ++++-
 .../analysis/v03/handlers/DummyRecordHandler.java  | 14 +++-
 .../v03/handlers/FormulaRecordHandler.java         | 24 +++++--
 .../analysis/v03/handlers/LabelRecordHandler.java  | 16 ++++-
 .../v03/handlers/LabelSstRecordHandler.java        | 22 +++++--
 .../analysis/v03/handlers/NumberRecordHandler.java | 18 +++++-
 .../analysis/v03/handlers/RkRecordHandler.java     | 15 ++++-
 .../org/apache/fesod/sheet/FesodSheetTest.java     | 75 ++++++++++++++++++++++
 9 files changed, 197 insertions(+), 18 deletions(-)

diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java
index 07aa6884..2cf1782e 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BlankRecordHandler.java
@@ -25,6 +25,7 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
+import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.metadata.data.ReadCellData;
@@ -39,9 +40,21 @@ public class BlankRecordHandler extends AbstractXlsRecordHandler implements Igno
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         BlankRecord br = (BlankRecord) record;
+        int originalColumnIndex = br.getColumn();
+
+        List<Integer> includeColumnIndexes =
+                xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        int targetColumnIndex = originalColumnIndex;
+        if (includeColumnIndexes != null) {
+            targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+            if (targetColumnIndex < 0) {
+                return;
+            }
+        }
         xlsReadContext
                 .xlsReadSheetHolder()
                 .getCellMap()
-                .put((int) br.getColumn(), ReadCellData.newEmptyInstance(br.getRow(), (int) br.getColumn()));
+                .put(targetColumnIndex, ReadCellData.newEmptyInstance(br.getRow(), targetColumnIndex));
     }
 }
diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java
index eea2b15e..4fe379ca 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/BoolErrRecordHandler.java
@@ -25,6 +25,7 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
+import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.enums.RowTypeEnum;
@@ -40,11 +41,22 @@ public class BoolErrRecordHandler extends AbstractXlsRecordHandler implements Ig
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         BoolErrRecord ber = (BoolErrRecord) record;
+        int originalColumnIndex = ber.getColumn();
+        List<Integer> includeColumnIndexes =
+                xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        int targetColumnIndex = originalColumnIndex;
+        if (includeColumnIndexes != null) {
+            targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+            if (targetColumnIndex < 0) {
+                return;
+            }
+        }
         xlsReadContext
                 .xlsReadSheetHolder()
                 .getCellMap()
-                .put((int) ber.getColumn(), ReadCellData.newInstance(ber.getBooleanValue(), ber.getRow(), (int)
-                        ber.getColumn()));
+                .put(targetColumnIndex, ReadCellData.newInstance(ber.getBooleanValue(), ber.getRow(), (int)
+                        targetColumnIndex));
         xlsReadContext.xlsReadSheetHolder().setTempRowType(RowTypeEnum.DATA);
     }
 }
diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java
index 9035c551..18cc1c02 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/DummyRecordHandler.java
@@ -26,6 +26,7 @@
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
 import java.util.LinkedHashMap;
+import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.enums.RowTypeEnum;
@@ -58,11 +59,22 @@ public class DummyRecordHandler extends AbstractXlsRecordHandler implements Igno
             xlsReadSheetHolder.setTempRowType(RowTypeEnum.EMPTY);
         } else if (record instanceof MissingCellDummyRecord) {
             MissingCellDummyRecord mcdr = (MissingCellDummyRecord) record;
+            int originalColumnIndex = mcdr.getColumn();
+            List<Integer> includeColumnIndexes =
+                    xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+            int targetColumnIndex = originalColumnIndex;
+            if (includeColumnIndexes != null) {
+                targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+                if (targetColumnIndex < 0) {
+                    return;
+                }
+            }
             // Some abnormal XLS, in the case of data already exist, or there will be a "MissingCellDummyRecord"
             // records, so if the existing data, empty data is ignored
             xlsReadSheetHolder
                     .getCellMap()
-                    .putIfAbsent(mcdr.getColumn(), ReadCellData.newEmptyInstance(mcdr.getRow(), mcdr.getColumn()));
+                    .putIfAbsent(targetColumnIndex, ReadCellData.newEmptyInstance(mcdr.getRow(), targetColumnIndex));
         }
     }
 }
diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java
index b5a2218b..229a188a 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/FormulaRecordHandler.java
@@ -26,6 +26,7 @@
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
 import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
@@ -53,10 +54,23 @@ public class FormulaRecordHandler extends AbstractXlsRecordHandler implements Ig
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         FormulaRecord frec = (FormulaRecord) record;
+        int originalColumnIndex = frec.getColumn();
+
+        List<Integer> includeColumnIndexes =
+                xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        int targetColumnIndex = originalColumnIndex;
+        if (includeColumnIndexes != null) {
+            targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+            if (targetColumnIndex < 0) {
+                return;
+            }
+        }
+
         Map<Integer, Cell> cellMap = xlsReadContext.xlsReadSheetHolder().getCellMap();
         ReadCellData<?> tempCellData = new ReadCellData<>();
         tempCellData.setRowIndex(frec.getRow());
-        tempCellData.setColumnIndex((int) frec.getColumn());
+        tempCellData.setColumnIndex(targetColumnIndex);
         CellType cellType = CellType.forInt(frec.getCachedResultType());
         String formulaValue = null;
         try {
@@ -98,21 +112,21 @@ public class FormulaRecordHandler extends AbstractXlsRecordHandler implements Ig
                                 .getGlobalConfiguration()
                                 .getLocale()));
                 tempCellData.setDataFormatData(dataFormatData);
-                cellMap.put((int) frec.getColumn(), tempCellData);
+                cellMap.put(targetColumnIndex, tempCellData);
                 break;
             case ERROR:
                 tempCellData.setType(CellDataTypeEnum.ERROR);
                 tempCellData.setStringValue(ERROR);
-                cellMap.put((int) frec.getColumn(), tempCellData);
+                cellMap.put(targetColumnIndex, tempCellData);
                 break;
             case BOOLEAN:
                 tempCellData.setType(CellDataTypeEnum.BOOLEAN);
                 tempCellData.setBooleanValue(frec.getCachedBooleanValue());
-                cellMap.put((int) frec.getColumn(), tempCellData);
+                cellMap.put(targetColumnIndex, tempCellData);
                 break;
             default:
                 tempCellData.setType(CellDataTypeEnum.EMPTY);
-                cellMap.put((int) frec.getColumn(), tempCellData);
+                cellMap.put(targetColumnIndex, tempCellData);
                 break;
         }
     }
diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java
index 0196a10b..0df77a3b 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java
@@ -25,6 +25,7 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
+import java.util.List;
 import org.apache.fesod.common.util.StringUtils;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
@@ -41,6 +42,19 @@ public class LabelRecordHandler extends AbstractXlsRecordHandler implements Igno
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         LabelRecord lrec = (LabelRecord) record;
+        int originalColumnIndex = lrec.getColumn();
+
+        List<Integer> includeColumnIndexes =
+                xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        int targetColumnIndex = originalColumnIndex;
+        if (includeColumnIndexes != null) {
+            targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+            if (targetColumnIndex < 0) {
+                return;
+            }
+        }
+
         String data = lrec.getValue();
         if (data != null) {
             GlobalConfiguration globalConfiguration =
@@ -54,7 +68,7 @@ public class LabelRecordHandler extends AbstractXlsRecordHandler implements Igno
         xlsReadContext
                 .xlsReadSheetHolder()
                 .getCellMap()
-                .put((int) lrec.getColumn(), ReadCellData.newInstance(data, lrec.getRow(), (int) lrec.getColumn()));
+                .put(targetColumnIndex, ReadCellData.newInstance(data, lrec.getRow(), targetColumnIndex));
         xlsReadContext.xlsReadSheetHolder().setTempRowType(RowTypeEnum.DATA);
     }
 }
diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java
index 91ec669a..c718b85c 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java
@@ -25,6 +25,7 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
+import java.util.List;
 import java.util.Map;
 import org.apache.fesod.common.util.StringUtils;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
@@ -45,17 +46,28 @@ public class LabelSstRecordHandler extends AbstractXlsRecordHandler implements I
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         LabelSSTRecord lsrec = (LabelSSTRecord) record;
+        int originalColumnIndex = lsrec.getColumn();
+
+        List<Integer> includeColumnIndexes =
+                xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        int targetColumnIndex = originalColumnIndex;
+        if (includeColumnIndexes != null) {
+            targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+            if (targetColumnIndex < 0) {
+                return;
+            }
+        }
+
         ReadCache readCache = xlsReadContext.readWorkbookHolder().getReadCache();
         Map<Integer, Cell> cellMap = xlsReadContext.xlsReadSheetHolder().getCellMap();
         if (readCache == null) {
-            cellMap.put(
-                    (int) lsrec.getColumn(), ReadCellData.newEmptyInstance(lsrec.getRow(), (int) lsrec.getColumn()));
+            cellMap.put(targetColumnIndex, ReadCellData.newEmptyInstance(lsrec.getRow(), targetColumnIndex));
             return;
         }
         String data = readCache.get(lsrec.getSSTIndex());
         if (data == null) {
-            cellMap.put(
-                    (int) lsrec.getColumn(), ReadCellData.newEmptyInstance(lsrec.getRow(), (int) lsrec.getColumn()));
+            cellMap.put(targetColumnIndex, ReadCellData.newEmptyInstance(lsrec.getRow(), targetColumnIndex));
             return;
         }
 
@@ -66,7 +78,7 @@ public class LabelSstRecordHandler extends AbstractXlsRecordHandler implements I
         } else if (globalConfiguration.getAutoTrim()) {
             data = data.trim();
         }
-        cellMap.put((int) lsrec.getColumn(), ReadCellData.newInstance(data, lsrec.getRow(), (int) lsrec.getColumn()));
+        cellMap.put(targetColumnIndex, ReadCellData.newInstance(data, lsrec.getRow(), targetColumnIndex));
         xlsReadContext.xlsReadSheetHolder().setTempRowType(RowTypeEnum.DATA);
     }
 }
diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java
index 23cda011..ec0ea97b 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java
@@ -26,6 +26,7 @@
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
 import java.math.BigDecimal;
+import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.constant.BuiltinFormats;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
@@ -43,8 +44,21 @@ public class NumberRecordHandler extends AbstractXlsRecordHandler implements Ign
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         NumberRecord nr = (NumberRecord) record;
+        int originalColumnIndex = nr.getColumn();
+
+        List<Integer> includeColumnIndexes =
+                xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        int targetColumnIndex = originalColumnIndex;
+        if (includeColumnIndexes != null) {
+            targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+            if (targetColumnIndex < 0) {
+                return;
+            }
+        }
+
         ReadCellData<?> cellData =
-                ReadCellData.newInstanceOriginal(BigDecimal.valueOf(nr.getValue()), nr.getRow(), (int) nr.getColumn());
+                ReadCellData.newInstanceOriginal(BigDecimal.valueOf(nr.getValue()), nr.getRow(), targetColumnIndex);
         short dataFormat = (short) xlsReadContext
                 .xlsReadWorkbookHolder()
                 .getFormatTrackingHSSFListener()
@@ -59,7 +73,7 @@ public class NumberRecordHandler extends AbstractXlsRecordHandler implements Ign
                         .getFormatString(nr),
                 xlsReadContext.readSheetHolder().getGlobalConfiguration().getLocale()));
         cellData.setDataFormatData(dataFormatData);
-        xlsReadContext.xlsReadSheetHolder().getCellMap().put((int) nr.getColumn(), cellData);
+        xlsReadContext.xlsReadSheetHolder().getCellMap().put(targetColumnIndex, cellData);
         xlsReadContext.xlsReadSheetHolder().setTempRowType(RowTypeEnum.DATA);
     }
 }
diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java
index 99eaa087..502c9f34 100644
--- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java
+++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/RkRecordHandler.java
@@ -25,6 +25,7 @@
 
 package org.apache.fesod.sheet.analysis.v03.handlers;
 
+import java.util.List;
 import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
 import org.apache.fesod.sheet.context.xls.XlsReadContext;
 import org.apache.fesod.sheet.metadata.data.ReadCellData;
@@ -39,9 +40,21 @@ public class RkRecordHandler extends AbstractXlsRecordHandler implements Ignorab
     @Override
     public void processRecord(XlsReadContext xlsReadContext, Record record) {
         RKRecord re = (RKRecord) record;
+        int originalColumnIndex = re.getColumn();
+
+        List<Integer> includeColumnIndexes =
+                xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
+
+        int targetColumnIndex = originalColumnIndex;
+        if (includeColumnIndexes != null) {
+            targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
+            if (targetColumnIndex < 0) {
+                return;
+            }
+        }
         xlsReadContext
                 .xlsReadSheetHolder()
                 .getCellMap()
-                .put((int) re.getColumn(), ReadCellData.newEmptyInstance(re.getRow(), (int) re.getColumn()));
+                .put(targetColumnIndex, ReadCellData.newEmptyInstance(re.getRow(), targetColumnIndex));
     }
 }
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 8f267eb7..bcc6ad3e 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
@@ -27,6 +27,8 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.io.FileUtils;
@@ -316,4 +318,77 @@ class FesodSheetTest {
         Assertions.assertEquals("1", parsedRow.get(0));
         Assertions.assertEquals("30", parsedRow.get(1));
     }
+
+    @Test
+    void testReadSheet_withColumnIndexes_xlsFormat() {
+        File xlsFile = tempDir.resolve("test.xls").toFile();
+
+        List<List<String>> head = new ArrayList<>();
+        head.add(Arrays.asList("ID"));
+        head.add(Arrays.asList("Name"));
+        head.add(Arrays.asList("Age"));
+        head.add(Arrays.asList("Gender"));
+
+        List<List<Object>> dataList = new ArrayList<>();
+        dataList.add(Arrays.asList("1", "Alice", "30", "Female"));
+
+        FesodSheet.write(xlsFile).head(head).sheet("Sheet1").doWrite(dataList);
+
+        List<Integer> targetColumns = Arrays.asList(0, 2);
+
+        List<Map<Integer, String>> readResults = FesodSheet.read(xlsFile)
+                .sheet(0)
+                .includeColumnIndexes(targetColumns)
+                .doReadSync();
+
+        Assertions.assertNotNull(readResults);
+        Map<Integer, String> parsedRow = readResults.get(0);
+        Assertions.assertEquals(2, parsedRow.size(), "Should only contain 2 filtered columns");
+        Assertions.assertEquals("1", parsedRow.get(0));
+        Assertions.assertEquals("30", parsedRow.get(1));
+    }
+
+    @Test
+    void testReadSheet_withColumnIndexes_xlsFormat_allCellTypes() {
+        File xlsFile = tempDir.resolve("test_all_types.xls").toFile();
+
+        List<List<String>> head = new ArrayList<>();
+        head.add(Arrays.asList("StringCol"));
+        head.add(Arrays.asList("NumberCol"));
+        head.add(Arrays.asList("BooleanCol"));
+        head.add(Arrays.asList("DateCol"));
+        head.add(Arrays.asList("FormulaCol"));
+        head.add(Arrays.asList("BlankCol"));
+
+        List<Object> row = new ArrayList<>();
+        row.add("Hello Fesod");
+        row.add(100.50);
+        row.add(true);
+        row.add(new Date());
+        row.add("=SUM(10, 20)");
+        row.add(null);
+
+        List<List<Object>> dataList = Collections.singletonList(row);
+
+        FesodSheet.write(xlsFile).head(head).sheet("Sheet1").doWrite(dataList);
+
+        List<Integer> targetColumns = Arrays.asList(0, 2, 4);
+
+        List<Map<Integer, String>> readResults = FesodSheet.read(xlsFile)
+                .sheet(0)
+                .includeColumnIndexes(targetColumns)
+                .doReadSync();
+
+        Assertions.assertNotNull(readResults);
+        Assertions.assertEquals(1, readResults.size());
+
+        Map<Integer, String> parsedRow = readResults.get(0);
+
+        Assertions.assertEquals(3, parsedRow.size(), "Should only contain the 3 requested target columns");
+
+        Assertions.assertEquals("Hello Fesod", parsedRow.get(0), "Target 0 should contain String from Col 0");
+        Assertions.assertEquals("TRUE", parsedRow.get(1).toUpperCase(), "Target 1 should contain Boolean from Col 2");
+
+        Assertions.assertNotNull(parsedRow.get(2), "Target 2 should contain Formula result from Col 4");
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@fesod.apache.org
For additional commands, e-mail: commits-help@fesod.apache.org