Skip to content

Commit b394c30

Browse files
author
Selim Soufargi
committed
feature: number and sstlabel with column support
1 parent c7993d5 commit b394c30

3 files changed

Lines changed: 70 additions & 7 deletions

File tree

fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/LabelSstRecordHandler.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
package org.apache.fesod.sheet.analysis.v03.handlers;
2727

28+
import java.util.List;
2829
import java.util.Map;
2930
import org.apache.fesod.common.util.StringUtils;
3031
import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
@@ -45,17 +46,32 @@ public class LabelSstRecordHandler extends AbstractXlsRecordHandler implements I
4546
@Override
4647
public void processRecord(XlsReadContext xlsReadContext, Record record) {
4748
LabelSSTRecord lsrec = (LabelSSTRecord) record;
49+
int originalColumnIndex = lsrec.getColumn();
50+
51+
List<Integer> includeColumnIndexes = null;
52+
if (xlsReadContext.readSheetHolder() != null
53+
&& xlsReadContext.readSheetHolder().getReadSheet() != null) {
54+
includeColumnIndexes =
55+
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
56+
}
57+
58+
int targetColumnIndex = originalColumnIndex;
59+
if (includeColumnIndexes != null) {
60+
targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
61+
if (targetColumnIndex == -1) {
62+
return;
63+
}
64+
}
65+
4866
ReadCache readCache = xlsReadContext.readWorkbookHolder().getReadCache();
4967
Map<Integer, Cell> cellMap = xlsReadContext.xlsReadSheetHolder().getCellMap();
5068
if (readCache == null) {
51-
cellMap.put(
52-
(int) lsrec.getColumn(), ReadCellData.newEmptyInstance(lsrec.getRow(), (int) lsrec.getColumn()));
69+
cellMap.put(targetColumnIndex, ReadCellData.newEmptyInstance(lsrec.getRow(), targetColumnIndex));
5370
return;
5471
}
5572
String data = readCache.get(lsrec.getSSTIndex());
5673
if (data == null) {
57-
cellMap.put(
58-
(int) lsrec.getColumn(), ReadCellData.newEmptyInstance(lsrec.getRow(), (int) lsrec.getColumn()));
74+
cellMap.put(targetColumnIndex, ReadCellData.newEmptyInstance(lsrec.getRow(), targetColumnIndex));
5975
return;
6076
}
6177

@@ -66,7 +82,7 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) {
6682
} else if (globalConfiguration.getAutoTrim()) {
6783
data = data.trim();
6884
}
69-
cellMap.put((int) lsrec.getColumn(), ReadCellData.newInstance(data, lsrec.getRow(), (int) lsrec.getColumn()));
85+
cellMap.put(targetColumnIndex, ReadCellData.newInstance(data, lsrec.getRow(), targetColumnIndex));
7086
xlsReadContext.xlsReadSheetHolder().setTempRowType(RowTypeEnum.DATA);
7187
}
7288
}

fesod-sheet/src/main/java/org/apache/fesod/sheet/analysis/v03/handlers/NumberRecordHandler.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
package org.apache.fesod.sheet.analysis.v03.handlers;
2727

2828
import java.math.BigDecimal;
29+
import java.util.List;
2930
import org.apache.fesod.sheet.analysis.v03.IgnorableXlsRecordHandler;
3031
import org.apache.fesod.sheet.constant.BuiltinFormats;
3132
import org.apache.fesod.sheet.context.xls.XlsReadContext;
@@ -43,8 +44,25 @@ public class NumberRecordHandler extends AbstractXlsRecordHandler implements Ign
4344
@Override
4445
public void processRecord(XlsReadContext xlsReadContext, Record record) {
4546
NumberRecord nr = (NumberRecord) record;
47+
int originalColumnIndex = nr.getColumn();
48+
49+
List<Integer> includeColumnIndexes = null;
50+
if (xlsReadContext.readSheetHolder() != null
51+
&& xlsReadContext.readSheetHolder().getReadSheet() != null) {
52+
includeColumnIndexes =
53+
xlsReadContext.readSheetHolder().getReadSheet().getColumnIndexes();
54+
}
55+
56+
int targetColumnIndex = originalColumnIndex;
57+
if (includeColumnIndexes != null) {
58+
targetColumnIndex = includeColumnIndexes.indexOf(originalColumnIndex);
59+
if (targetColumnIndex == -1) {
60+
return;
61+
}
62+
}
63+
4664
ReadCellData<?> cellData =
47-
ReadCellData.newInstanceOriginal(BigDecimal.valueOf(nr.getValue()), nr.getRow(), (int) nr.getColumn());
65+
ReadCellData.newInstanceOriginal(BigDecimal.valueOf(nr.getValue()), nr.getRow(), targetColumnIndex);
4866
short dataFormat = (short) xlsReadContext
4967
.xlsReadWorkbookHolder()
5068
.getFormatTrackingHSSFListener()
@@ -59,7 +77,7 @@ public void processRecord(XlsReadContext xlsReadContext, Record record) {
5977
.getFormatString(nr),
6078
xlsReadContext.readSheetHolder().getGlobalConfiguration().getLocale()));
6179
cellData.setDataFormatData(dataFormatData);
62-
xlsReadContext.xlsReadSheetHolder().getCellMap().put((int) nr.getColumn(), cellData);
80+
xlsReadContext.xlsReadSheetHolder().getCellMap().put(targetColumnIndex, cellData);
6381
xlsReadContext.xlsReadSheetHolder().setTempRowType(RowTypeEnum.DATA);
6482
}
6583
}

fesod-sheet/src/test/java/org/apache/fesod/sheet/FesodSheetTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,35 @@ void testReadSheet_withAllParams_shouldReturnBuilder() {
253253
Assertions.assertNotNull(builder);
254254
}
255255

256+
@Test
257+
void testReadSheet_withColumnIndexes_xlsFormat() {
258+
File xlsFile = tempDir.resolve("test.xls").toFile();
259+
260+
List<List<String>> head = new ArrayList<>();
261+
head.add(Arrays.asList("ID"));
262+
head.add(Arrays.asList("Name"));
263+
head.add(Arrays.asList("Age"));
264+
head.add(Arrays.asList("Gender"));
265+
266+
List<List<Object>> dataList = new ArrayList<>();
267+
dataList.add(Arrays.asList("1", "Alice", "30", "Female"));
268+
269+
FesodSheet.write(xlsFile).head(head).sheet("Sheet1").doWrite(dataList);
270+
271+
List<Integer> targetColumns = Arrays.asList(0, 2);
272+
273+
List<Map<Integer, String>> readResults = FesodSheet.read(xlsFile)
274+
.sheet(0)
275+
.includeColumnIndexes(targetColumns)
276+
.doReadSync();
277+
278+
Assertions.assertNotNull(readResults);
279+
Map<Integer, String> parsedRow = readResults.get(0);
280+
Assertions.assertEquals(2, parsedRow.size(), "Should only contain 2 filtered columns");
281+
Assertions.assertEquals("1", parsedRow.get(0));
282+
Assertions.assertEquals("30", parsedRow.get(1));
283+
}
284+
256285
@Test
257286
void testReadSheet_withColumnIndexes_shouldConfigureAll() {
258287

0 commit comments

Comments
 (0)