From b394c30e6553ba19fde33f556d89d18bfaf2fe1b Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Fri, 31 Jul 2026 00:21:43 +0200 Subject: [PATCH 1/6] feature: number and sstlabel with column support --- .../v03/handlers/LabelSstRecordHandler.java | 26 +++++++++++++---- .../v03/handlers/NumberRecordHandler.java | 22 ++++++++++++-- .../apache/fesod/sheet/FesodSheetTest.java | 29 +++++++++++++++++++ 3 files changed, 70 insertions(+), 7 deletions(-) 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 91ec669a6..3e74a6ab1 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,32 @@ public class LabelSstRecordHandler extends AbstractXlsRecordHandler implements I @Override public void processRecord(XlsReadContext xlsReadContext, Record record) { LabelSSTRecord lsrec = (LabelSSTRecord) record; + int originalColumnIndex = lsrec.getColumn(); + + List includeColumnIndexes = null; + if (xlsReadContext.readSheetHolder() != null + && xlsReadContext.readSheetHolder().getReadSheet() != null) { + includeColumnIndexes = + xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + } + + int targetColumnIndex = originalColumnIndex; + if (includeColumnIndexes != null) { + targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); + if (targetColumnIndex == -1) { + return; + } + } + ReadCache readCache = xlsReadContext.readWorkbookHolder().getReadCache(); Map 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 +82,7 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { } 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 23cda011b..ac2c7d4aa 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,25 @@ public class NumberRecordHandler extends AbstractXlsRecordHandler implements Ign @Override public void processRecord(XlsReadContext xlsReadContext, Record record) { NumberRecord nr = (NumberRecord) record; + int originalColumnIndex = nr.getColumn(); + + List includeColumnIndexes = null; + if (xlsReadContext.readSheetHolder() != null + && xlsReadContext.readSheetHolder().getReadSheet() != null) { + includeColumnIndexes = + xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + } + + int targetColumnIndex = originalColumnIndex; + if (includeColumnIndexes != null) { + targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); + if (targetColumnIndex == -1) { + 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 +77,7 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { .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/test/java/org/apache/fesod/sheet/FesodSheetTest.java b/fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java index b086c585d..2bc8b23f0 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 @@ -253,6 +253,35 @@ void testReadSheet_withAllParams_shouldReturnBuilder() { Assertions.assertNotNull(builder); } + @Test + void testReadSheet_withColumnIndexes_xlsFormat() { + File xlsFile = tempDir.resolve("test.xls").toFile(); + + List> head = new ArrayList<>(); + head.add(Arrays.asList("ID")); + head.add(Arrays.asList("Name")); + head.add(Arrays.asList("Age")); + head.add(Arrays.asList("Gender")); + + List> dataList = new ArrayList<>(); + dataList.add(Arrays.asList("1", "Alice", "30", "Female")); + + FesodSheet.write(xlsFile).head(head).sheet("Sheet1").doWrite(dataList); + + List targetColumns = Arrays.asList(0, 2); + + List> readResults = FesodSheet.read(xlsFile) + .sheet(0) + .includeColumnIndexes(targetColumns) + .doReadSync(); + + Assertions.assertNotNull(readResults); + Map 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_shouldConfigureAll() { From b32f39453ad98c4bea6e71eb02a046fd5e5058e4 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Wed, 5 Aug 2026 13:55:14 +0200 Subject: [PATCH 2/6] remove null checks for sheet holder and sheet --- .../sheet/analysis/v03/handlers/LabelSstRecordHandler.java | 7 ++----- .../sheet/analysis/v03/handlers/NumberRecordHandler.java | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) 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 3e74a6ab1..adf72349a 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 @@ -49,11 +49,8 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { int originalColumnIndex = lsrec.getColumn(); List includeColumnIndexes = null; - if (xlsReadContext.readSheetHolder() != null - && xlsReadContext.readSheetHolder().getReadSheet() != null) { - includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - } + + includeColumnIndexes = xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); int targetColumnIndex = originalColumnIndex; if (includeColumnIndexes != null) { 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 ac2c7d4aa..e5c040fcc 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 @@ -47,11 +47,8 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { int originalColumnIndex = nr.getColumn(); List includeColumnIndexes = null; - if (xlsReadContext.readSheetHolder() != null - && xlsReadContext.readSheetHolder().getReadSheet() != null) { - includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - } + + includeColumnIndexes = xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); int targetColumnIndex = originalColumnIndex; if (includeColumnIndexes != null) { From 44d005852c85a28cdf273284639a5c806665add0 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Wed, 5 Aug 2026 17:08:59 +0200 Subject: [PATCH 3/6] feat: adding filtering capability for columns for additional typeset: formula, bool, rk, blank etc --- .../v03/handlers/BlankRecordHandler.java | 15 ++++++- .../v03/handlers/BoolErrRecordHandler.java | 16 ++++++- .../v03/handlers/DummyRecordHandler.java | 14 +++++- .../v03/handlers/FormulaRecordHandler.java | 24 +++++++--- .../v03/handlers/LabelRecordHandler.java | 15 ++++++- .../v03/handlers/NoteRecordHandler.java | 15 ++++++- .../v03/handlers/RkRecordHandler.java | 15 ++++++- .../apache/fesod/sheet/FesodSheetTest.java | 44 +++++++++++++++++++ 8 files changed, 146 insertions(+), 12 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 07aa6884c..2cf1782e7 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 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 eea2b15e8..4fe379cab 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 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 9035c551f..18cc1c02f 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 void processRecord(XlsReadContext xlsReadContext, Record record) { xlsReadSheetHolder.setTempRowType(RowTypeEnum.EMPTY); } else if (record instanceof MissingCellDummyRecord) { MissingCellDummyRecord mcdr = (MissingCellDummyRecord) record; + int originalColumnIndex = mcdr.getColumn(); + List 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 b5a2218b3..229a188a8 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 includeColumnIndexes = + xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + + int targetColumnIndex = originalColumnIndex; + if (includeColumnIndexes != null) { + targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); + if (targetColumnIndex < 0) { + return; + } + } + Map 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 void processRecord(XlsReadContext xlsReadContext, Record record) { .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 0196a10b0..206c8ebb4 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 @@ -41,6 +41,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 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 +67,7 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { 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/NoteRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NoteRecordHandler.java index ce9263b1a..b85c71734 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NoteRecordHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NoteRecordHandler.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.CellExtraTypeEnum; @@ -45,8 +46,20 @@ public boolean support(XlsReadContext xlsReadContext, Record record) { @Override public void processRecord(XlsReadContext xlsReadContext, Record record) { NoteRecord nr = (NoteRecord) record; + int originalColumnIndex = nr.getColumn(); + + List includeColumnIndexes = + xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + + int targetColumnIndex = originalColumnIndex; + if (includeColumnIndexes != null) { + targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); + if (targetColumnIndex < 0) { + return; + } + } String text = xlsReadContext.xlsReadSheetHolder().getObjectCacheMap().get(nr.getShapeId()); - CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.COMMENT, text, nr.getRow(), nr.getColumn()); + CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.COMMENT, text, nr.getRow(), targetColumnIndex); xlsReadContext.xlsReadSheetHolder().setCellExtra(cellExtra); xlsReadContext.analysisEventProcessor().extra(xlsReadContext); } 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 99eaa087e..502c9f348 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 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 2bc8b23f0..aa00d3cc2 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 @@ -319,4 +319,48 @@ void testReadSheet_withColumnIndexes_shouldConfigureAll() { 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> 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 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> dataList = Collections.singletonList(row); + + FesodSheet.write(xlsFile).head(head).sheet("Sheet1").doWrite(dataList); + + List targetColumns = Arrays.asList(0, 2, 4); + + List> readResults = FesodSheet.read(xlsFile) + .sheet(0) + .includeColumnIndexes(targetColumns) + .doReadSync(); + + Assertions.assertNotNull(readResults); + Assertions.assertEquals(1, readResults.size()); + + Map 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"); + } } From 636961f14cee9011a6fcb2fae11e6b1fc58cb83a Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Wed, 5 Aug 2026 18:30:55 +0200 Subject: [PATCH 4/6] fix CI: missing import --- .../fesod/sheet/analysis/v03/handlers/LabelRecordHandler.java | 1 + 1 file changed, 1 insertion(+) 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 206c8ebb4..0df77a3b5 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; From 2060a5d4eed95dc008d65fcee38b7dacb50e37b0 Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Thu, 6 Aug 2026 13:42:32 +0200 Subject: [PATCH 5/6] fix CI : add missing imports --- .../src/test/java/org/apache/fesod/sheet/FesodSheetTest.java | 2 ++ 1 file changed, 2 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 aa00d3cc2..550ce2435 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 @@ -26,6 +26,8 @@ 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.fesod.sheet.read.builder.ExcelReaderBuilder; From fb3df39510dbfcecedf3d95ed7f8ffea1e9a1eeb Mon Sep 17 00:00:00 2001 From: Selim Soufargi Date: Thu, 6 Aug 2026 15:03:50 +0200 Subject: [PATCH 6/6] address reviewing comments : revert NOTE --- .../v03/handlers/LabelSstRecordHandler.java | 7 +++---- .../analysis/v03/handlers/NoteRecordHandler.java | 15 +-------------- .../v03/handlers/NumberRecordHandler.java | 7 +++---- 3 files changed, 7 insertions(+), 22 deletions(-) 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 adf72349a..c718b85cc 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 @@ -48,14 +48,13 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { LabelSSTRecord lsrec = (LabelSSTRecord) record; int originalColumnIndex = lsrec.getColumn(); - List includeColumnIndexes = null; - - includeColumnIndexes = xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + List includeColumnIndexes = + xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); int targetColumnIndex = originalColumnIndex; if (includeColumnIndexes != null) { targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex == -1) { + if (targetColumnIndex < 0) { return; } } diff --git a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NoteRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NoteRecordHandler.java index b85c71734..ce9263b1a 100644 --- a/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NoteRecordHandler.java +++ b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NoteRecordHandler.java @@ -25,7 +25,6 @@ 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.CellExtraTypeEnum; @@ -46,20 +45,8 @@ public boolean support(XlsReadContext xlsReadContext, Record record) { @Override public void processRecord(XlsReadContext xlsReadContext, Record record) { NoteRecord nr = (NoteRecord) record; - int originalColumnIndex = nr.getColumn(); - - List includeColumnIndexes = - xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); - - int targetColumnIndex = originalColumnIndex; - if (includeColumnIndexes != null) { - targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex < 0) { - return; - } - } String text = xlsReadContext.xlsReadSheetHolder().getObjectCacheMap().get(nr.getShapeId()); - CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.COMMENT, text, nr.getRow(), targetColumnIndex); + CellExtra cellExtra = new CellExtra(CellExtraTypeEnum.COMMENT, text, nr.getRow(), nr.getColumn()); xlsReadContext.xlsReadSheetHolder().setCellExtra(cellExtra); xlsReadContext.analysisEventProcessor().extra(xlsReadContext); } 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 e5c040fcc..ec0ea97bf 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 @@ -46,14 +46,13 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) { NumberRecord nr = (NumberRecord) record; int originalColumnIndex = nr.getColumn(); - List includeColumnIndexes = null; - - includeColumnIndexes = xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); + List includeColumnIndexes = + xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes(); int targetColumnIndex = originalColumnIndex; if (includeColumnIndexes != null) { targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex); - if (targetColumnIndex == -1) { + if (targetColumnIndex < 0) { return; } }