diff --git a/nop-commons/src/main/java/io/nop/commons/util/CollectionHelper.java b/nop-commons/src/main/java/io/nop/commons/util/CollectionHelper.java index c50954f35357b6419f948dac908b24c909051529..a802281d97fd4bf87abd39a6caa154799e08040a 100644 --- a/nop-commons/src/main/java/io/nop/commons/util/CollectionHelper.java +++ b/nop-commons/src/main/java/io/nop/commons/util/CollectionHelper.java @@ -250,9 +250,9 @@ public class CollectionHelper { while (kIt.hasNext() && vIt.hasNext()) { K key = kIt.next(); + V value = vIt.next(); if (StringHelper.isEmptyObject(key)) continue; - V value = vIt.next(); ret.put(key, value); } return ret; @@ -1071,4 +1071,4 @@ public class CollectionHelper { list.add(0, item); return list; } -} \ No newline at end of file +} diff --git a/nop-core/src/main/java/io/nop/core/resource/record/list/HeaderListRecordOutput.java b/nop-core/src/main/java/io/nop/core/resource/record/list/HeaderListRecordOutput.java index 7651b0e56a0c369c27f69ec8299316b8e160fb73..5c8e9c6cbd9fc051e5197f6b2677b5bb864e0639 100644 --- a/nop-core/src/main/java/io/nop/core/resource/record/list/HeaderListRecordOutput.java +++ b/nop-core/src/main/java/io/nop/core/resource/record/list/HeaderListRecordOutput.java @@ -18,12 +18,13 @@ import java.util.List; import java.util.function.BiFunction; public class HeaderListRecordOutput implements IRecordOutput> { - private List headers; + private final List records = new ArrayList<>(); private final BiFunction, List, R> rowBuilder; private boolean headersWritten; private long writeCount; private int headerRowCount; + private List headers; private List headerLabels; private IEvalFunction headersNormalizer; @@ -34,6 +35,10 @@ public class HeaderListRecordOutput implements IRecordOutput> { this.rowBuilder = rowBuilder; } + public void setHeaders(List headers) { + this.headers = headers; + } + public void setHeaderLabels(List headerLabels) { this.headerLabels = headerLabels; } @@ -98,4 +103,4 @@ public class HeaderListRecordOutput implements IRecordOutput> { @Override public void close() { } -} \ No newline at end of file +} diff --git a/nop-report/nop-report-core/src/main/java/io/nop/report/core/record/ExcelRecordInput.java b/nop-report/nop-report-core/src/main/java/io/nop/report/core/record/ExcelRecordInput.java index d0e6d533c0f9bd1682899fde82780aab46cb8ad9..fde962851a2e4487e48f4d3a128f4f8b754fa6cd 100644 --- a/nop-report/nop-report-core/src/main/java/io/nop/report/core/record/ExcelRecordInput.java +++ b/nop-report/nop-report-core/src/main/java/io/nop/report/core/record/ExcelRecordInput.java @@ -86,6 +86,7 @@ public class ExcelRecordInput implements IRecordInput { @Override public void beforeRead(Map map) { HeaderListRecordOutput> collector = new HeaderListRecordOutput<>(config.getHeaderRowCount(), CollectionHelper::toNonEmptyKeyMap); + collector.setHeaders(headers); collector.setHeaderLabels(headerLabels); collector.setHeadersNormalizer(headersNormalizer); diff --git a/nop-report/nop-report-core/src/test/java/io/nop/report/core/record/TestExcelResourceIO.java b/nop-report/nop-report-core/src/test/java/io/nop/report/core/record/TestExcelResourceIO.java index 87755a304f119b9fdc8dc105573132d851235c10..1370dcd6d70c572f1f53ff5dd504f489a0064a0f 100644 --- a/nop-report/nop-report-core/src/test/java/io/nop/report/core/record/TestExcelResourceIO.java +++ b/nop-report/nop-report-core/src/test/java/io/nop/report/core/record/TestExcelResourceIO.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class TestExcelResourceIO extends BaseTestCase { @@ -44,6 +45,50 @@ public class TestExcelResourceIO extends BaseTestCase { input.close(); } + @Test + public void testReadSpecifiedHeader() throws IOException { + ExcelResourceIO> io = new ExcelResourceIO<>(); + ExcelIOConfig config = new ExcelIOConfig(); + io.setIOConfig(config); + // 指定 headers + io.setHeaders(Arrays.asList("a","b","c")); + + IRecordInput> input = io.openInput(new ClassPathResource("classpath:io/nop/report/core/excel-input.xlsx"), null); + input.beforeRead(new HashMap<>()); + + List> list = input.readAll(); + System.out.println(JSON.serialize(list, true)); + assertEquals(1, list.get(0).get("a")); + assertEquals(1, list.get(0).get("b")); + assertEquals(1, list.get(0).get("c")); + assertEquals(10, list.get(9).get("a")); + assertEquals(901, list.get(9).get("b")); + assertEquals(9001, list.get(9).get("c")); + input.close(); + } + + @Test + public void testReadHeaderWithNull() throws IOException { + ExcelResourceIO> io = new ExcelResourceIO<>(); + ExcelIOConfig config = new ExcelIOConfig(); + // header 为空的列,就不会处理 + io.setHeaders(Arrays.asList("a",null/*b*/,"c",null/*d*/,null/*e*/,"f")); + io.setIOConfig(config); + + IRecordInput> input = io.openInput(new ClassPathResource("classpath:io/nop/report/core/excel-input.xlsx"), null); + input.beforeRead(new HashMap<>()); + + List> list = input.readAll(); + System.out.println(JSON.serialize(list, true)); + assertEquals(1, list.get(0).get("a")); + assertNull(list.get(0).get("b")); + assertEquals(1, list.get(0).get("c")); + assertNull(list.get(0).get("d")); + assertNull(list.get(0).get("e")); + assertEquals(11, list.get(0).get("f")); + input.close(); + } + @Test public void testReadMultiHeader() throws IOException { ExcelResourceIO> io = new ExcelResourceIO<>(); diff --git a/nop-report/nop-report-core/src/test/resources/io/nop/report/core/excel-input.xlsx b/nop-report/nop-report-core/src/test/resources/io/nop/report/core/excel-input.xlsx index 2c53d75e2108976e71987fff50ab2ffb1f6613ba..e2a7169ed8ef141e6a9ce44c71790f5454cff22b 100644 Binary files a/nop-report/nop-report-core/src/test/resources/io/nop/report/core/excel-input.xlsx and b/nop-report/nop-report-core/src/test/resources/io/nop/report/core/excel-input.xlsx differ