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..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; @@ -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 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 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/LabelSstRecordHandler.java b/fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java index 91ec669a6..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 @@ -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 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 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 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..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 @@ -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 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 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/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 b086c585d..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; @@ -253,6 +255,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() { @@ -290,4 +321,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"); + } }