diff --git a/spring-batch-excel/pom.xml b/spring-batch-excel/pom.xml index 8e4ae80..8773bc7 100644 --- a/spring-batch-excel/pom.xml +++ b/spring-batch-excel/pom.xml @@ -74,6 +74,11 @@ 1.9.5 test + + org.springframework + spring-test + 4.0.5.RELEASE + diff --git a/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiItemReader.java b/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiItemReader.java index a979e65..d51aac7 100644 --- a/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiItemReader.java +++ b/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiItemReader.java @@ -16,6 +16,7 @@ package org.springframework.batch.item.excel.poi; +import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.springframework.batch.item.excel.AbstractExcelItemReader; @@ -49,6 +50,7 @@ public class PoiItemReader extends AbstractExcelItemReader { @Override protected void openExcelFile(final Resource resource) throws Exception { this.workbook = WorkbookFactory.create(resource.getInputStream()); + this.workbook.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK); } } diff --git a/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiSheet.java b/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiSheet.java index f612c3b..423f3e0 100644 --- a/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiSheet.java +++ b/spring-batch-excel/src/main/java/org/springframework/batch/item/excel/poi/PoiSheet.java @@ -34,6 +34,8 @@ public class PoiSheet implements Sheet { private final org.apache.poi.ss.usermodel.Sheet delegate; + private int numberOfColumns = -1; + /** * Constructor which takes the delegate sheet. * @@ -71,7 +73,8 @@ public class PoiSheet implements Sheet { final Row row = this.delegate.getRow(rowNumber); final List cells = new LinkedList(); - for (Cell cell : row) { + for (int i =0; i< getNumberOfColumns(); i++) { + Cell cell = row.getCell(i); switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC: cells.add(String.valueOf(cell.getNumericCellValue())); @@ -107,10 +110,9 @@ public class PoiSheet implements Sheet { */ @Override public int getNumberOfColumns() { - final String[] columns = this.getHeader(); - if (columns != null) { - return columns.length; + if (numberOfColumns < 0) { + numberOfColumns = this.delegate.getRow(0).getLastCellNum(); } - return 0; + return numberOfColumns; } } diff --git a/spring-batch-excel/src/test/java/org/springframework/batch/item/excel/AbstractExcelItemReaderTests.java b/spring-batch-excel/src/test/java/org/springframework/batch/item/excel/AbstractExcelItemReaderTests.java index 3786727..21628f5 100644 --- a/spring-batch-excel/src/test/java/org/springframework/batch/item/excel/AbstractExcelItemReaderTests.java +++ b/spring-batch-excel/src/test/java/org/springframework/batch/item/excel/AbstractExcelItemReaderTests.java @@ -23,6 +23,7 @@ import org.junit.Test; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.excel.mapping.PassThroughRowMapper; import org.springframework.core.io.ClassPathResource; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.StringUtils; import static org.junit.Assert.assertEquals; @@ -38,6 +39,8 @@ public abstract class AbstractExcelItemReaderTests { protected AbstractExcelItemReader itemReader; + private ExecutionContext executionContext; + @Before public void setup() throws Exception { this.itemReader = createExcelItemReader(); @@ -52,7 +55,8 @@ public abstract class AbstractExcelItemReaderTests { }); configureItemReader(this.itemReader); this.itemReader.afterPropertiesSet(); - this.itemReader.open(new ExecutionContext()); + executionContext = new ExecutionContext(); + this.itemReader.open(executionContext); } protected void configureItemReader(AbstractExcelItemReader itemReader) { @@ -69,8 +73,13 @@ public abstract class AbstractExcelItemReaderTests { String[] row = null; do { row = (String[]) this.itemReader.read(); - this.logger.debug("Read: "+ StringUtils.arrayToCommaDelimitedString(row)); + this.logger.debug("Read: " + StringUtils.arrayToCommaDelimitedString(row)); + if (row != null) { + assertEquals(6, row.length); + } } while (row != null); + int readCount = (Integer) ReflectionTestUtils.getField(this.itemReader, "currentItemCount" ); + assertEquals(4320, readCount); // File contains 4321 lines, first is header 4321-1=4320 records read. } @Test(expected = IllegalArgumentException.class) diff --git a/spring-batch-excel/src/test/resources/org/springframework/batch/item/excel/player.xls b/spring-batch-excel/src/test/resources/org/springframework/batch/item/excel/player.xls index 6d5b08d..2a89397 100644 Binary files a/spring-batch-excel/src/test/resources/org/springframework/batch/item/excel/player.xls and b/spring-batch-excel/src/test/resources/org/springframework/batch/item/excel/player.xls differ