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() {