Skip to content

Commit 8405d0d

Browse files
Copilotozlerhakan
andcommitted
Add @ExcelCellRange support and tests for records to improve coverage
Co-authored-by: ozlerhakan <[email protected]>
1 parent 319b496 commit 8405d0d

File tree

6 files changed

+78
-4
lines changed

6 files changed

+78
-4
lines changed

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@
233233
<release>11</release>
234234
<testExcludes>
235235
<exclude>**/model/byid/CalculationRecord.java</exclude>
236+
<exclude>**/model/byid/ClassesRecord.java</exclude>
236237
<exclude>**/model/byname/EmployeeRecord.java</exclude>
237238
<exclude>**/model/byname/PersonRecord.java</exclude>
238239
<exclude>**/model/byname/OrgWithUnknownCellsRecord.java</exclude>

src/main/java/com/poiji/bind/mapping/PoijiHandler.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,21 @@ private void setFieldValue(String content, Class<? super T> subclass, int column
8585
**/
8686
private Object getInstance(Field field) {
8787
Object ins;
88-
if (fieldInstances.containsKey(field.getName())) {
89-
ins = fieldInstances.get(field.getName());
88+
if (isRecord) {
89+
// For records, check recordValues for nested objects
90+
if (recordValues.containsKey(field.getName())) {
91+
ins = recordValues.get(field.getName());
92+
} else {
93+
ins = ReflectUtil.newInstanceOf(field.getType());
94+
recordValues.put(field.getName(), ins);
95+
}
9096
} else {
91-
ins = ReflectUtil.newInstanceOf(field.getType());
92-
fieldInstances.put(field.getName(), ins);
97+
if (fieldInstances.containsKey(field.getName())) {
98+
ins = fieldInstances.get(field.getName());
99+
} else {
100+
ins = ReflectUtil.newInstanceOf(field.getType());
101+
fieldInstances.put(field.getName(), ins);
102+
}
93103
}
94104
return ins;
95105
}

src/test/java/com/poiji/deserialize/RecordDeserializationTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.poiji.bind.Poiji;
44
import com.poiji.deserialize.model.AlbumRecord;
55
import com.poiji.deserialize.model.byid.CalculationRecord;
6+
import com.poiji.deserialize.model.byid.ClassesRecord;
67
import com.poiji.deserialize.model.byname.EmployeeRecord;
78
import com.poiji.deserialize.model.byname.OrgWithUnknownCellsRecord;
89
import com.poiji.deserialize.model.byname.PersonRecord;
@@ -400,4 +401,51 @@ public void shouldMapXLSToRecordWithExcelCellsJoinedByName() {
400401
assertThat(album.tracks(), notNullValue());
401402
assertThat(album.tracks().size(), is(2)); // Track1 and Track2
402403
}
404+
405+
@Test
406+
public void shouldMapExcelToRecordWithExcelCellRange() {
407+
// Test with @ExcelCellRange annotation
408+
List<ClassesRecord> classes = Poiji.fromExcel(
409+
new File("src/test/resources/test_multi.xlsx"),
410+
ClassesRecord.class,
411+
PoijiOptions.PoijiOptionsBuilder.settings(1)
412+
.headerStart(1)
413+
.build()
414+
);
415+
416+
assertThat(classes, notNullValue());
417+
assertThat(classes.size(), is(3));
418+
419+
ClassesRecord firstClass = classes.get(0);
420+
assertThat(firstClass.classA(), notNullValue());
421+
assertThat(firstClass.classA().getAge(), is(28));
422+
423+
assertThat(firstClass.classB(), notNullValue());
424+
assertThat(firstClass.classB().getCity(), is("Los Angeles"));
425+
426+
ClassesRecord secondClass = classes.get(1);
427+
assertThat(secondClass.classA().getName(), is("Paul Ryan"));
428+
assertThat(secondClass.classB().getState(), is("Virginia"));
429+
assertThat(secondClass.classB().getZip(), is(22347));
430+
}
431+
432+
@Test
433+
public void shouldMapXLSToRecordWithExcelCellRange() {
434+
// Test XLS format with @ExcelCellRange annotation
435+
List<ClassesRecord> classes = Poiji.fromExcel(
436+
new File("src/test/resources/test_multi.xls"),
437+
ClassesRecord.class,
438+
PoijiOptions.PoijiOptionsBuilder.settings(1)
439+
.headerStart(1)
440+
.build()
441+
);
442+
443+
assertThat(classes, notNullValue());
444+
assertThat(classes.size(), is(3));
445+
446+
// Verify nested fields are properly mapped
447+
ClassesRecord secondClass = classes.get(1);
448+
assertThat(secondClass.classA(), notNullValue());
449+
assertThat(secondClass.classB(), notNullValue());
450+
}
403451
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.poiji.deserialize.model.byid;
2+
3+
import com.poiji.annotation.ExcelCellRange;
4+
5+
/**
6+
* Record class to test @ExcelCellRange support
7+
*/
8+
public record ClassesRecord(
9+
@ExcelCellRange
10+
PersonATest classA,
11+
12+
@ExcelCellRange
13+
PersonBTest classB
14+
) {
15+
}

src/test/resources/employees.xlsx

0 Bytes
Binary file not shown.

src/test/resources/person.xlsx

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)