diff --git a/src/main/java/com/monitorjbl/xlsx/impl/StreamingSheet.java b/src/main/java/com/monitorjbl/xlsx/impl/StreamingSheet.java index e89073e0..de128481 100644 --- a/src/main/java/com/monitorjbl/xlsx/impl/StreamingSheet.java +++ b/src/main/java/com/monitorjbl/xlsx/impl/StreamingSheet.java @@ -27,6 +27,7 @@ public class StreamingSheet implements Sheet { + private Workbook workbook; private final String name; private final StreamingSheetReader reader; @@ -36,6 +37,10 @@ public StreamingSheet(String name, StreamingSheetReader reader) { reader.setSheet(this); } + void setWorkbook(Workbook workbook) { + this.workbook = workbook; + } + StreamingSheetReader getReader() { return reader; } @@ -77,6 +82,14 @@ public boolean isColumnHidden(int columnIndex) { return reader.isColumnHidden(columnIndex); } + @Override + public Workbook getWorkbook() { + if (workbook == null) { + throw new UnsupportedOperationException(); + } + return workbook; + } + /* Unsupported */ /** @@ -849,14 +862,6 @@ public Drawing createDrawingPatriarch() { throw new UnsupportedOperationException(); } - /** - * Not supported - */ - @Override - public Workbook getWorkbook() { - throw new UnsupportedOperationException(); - } - /** * Not supported */ diff --git a/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbook.java b/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbook.java index 47d1346a..163040b6 100644 --- a/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbook.java +++ b/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbook.java @@ -7,6 +7,7 @@ import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.DataFormat; +import org.apache.poi.ss.usermodel.Date1904Support; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.PictureData; @@ -19,8 +20,9 @@ import java.io.OutputStream; import java.util.Iterator; import java.util.List; +import java.util.stream.StreamSupport; -public class StreamingWorkbook implements Workbook, AutoCloseable { +public class StreamingWorkbook implements Workbook, Date1904Support, AutoCloseable { private final StreamingWorkbookReader reader; public StreamingWorkbook(StreamingWorkbookReader reader) { @@ -43,7 +45,7 @@ int findSheetByName(String name) { */ @Override public Iterator iterator() { - return reader.iterator(); + return StreamSupport.stream(reader.spliterator(), false).map(this::withWorkbook).iterator(); } /** @@ -95,7 +97,7 @@ public int getNumberOfSheets() { */ @Override public Sheet getSheetAt(int index) { - return reader.getSheets().get(index); + return withWorkbook(reader.getSheets().get(index)); } /** @@ -107,7 +109,7 @@ public Sheet getSheet(String name) { if(index == -1) { throw new MissingSheetException("Sheet '" + name + "' does not exist"); } - return reader.getSheets().get(index); + return withWorkbook(reader.getSheets().get(index)); } /** @@ -126,6 +128,11 @@ public boolean isSheetVeryHidden(int sheetIx) { return "veryHidden".equals(reader.getSheetProperties().get(sheetIx).get("state")); } + @Override + public boolean isDate1904() { + return reader.isDate1904(); + } + /** * {@inheritDoc} */ @@ -134,6 +141,13 @@ public void close() throws IOException { reader.close(); } + private Sheet withWorkbook(Sheet sheet) { + if (sheet instanceof StreamingSheet) { + ((StreamingSheet)sheet).setWorkbook(this); + } + return sheet; + } + /* Not supported */ /** diff --git a/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbookReader.java b/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbookReader.java index 282f4bc9..3792b39e 100644 --- a/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbookReader.java +++ b/src/main/java/com/monitorjbl/xlsx/impl/StreamingWorkbookReader.java @@ -180,6 +180,10 @@ List getSheets() { return sheets; } + boolean isDate1904() { + return use1904Dates; + } + public List> getSheetProperties() { return sheetProperties; } diff --git a/src/test/java/com/monitorjbl/xlsx/StreamingWorkbookTest.java b/src/test/java/com/monitorjbl/xlsx/StreamingWorkbookTest.java index 13a978cf..0456fb52 100644 --- a/src/test/java/com/monitorjbl/xlsx/StreamingWorkbookTest.java +++ b/src/test/java/com/monitorjbl/xlsx/StreamingWorkbookTest.java @@ -20,6 +20,7 @@ import java.util.function.Consumer; import static com.monitorjbl.xlsx.TestUtils.expectCachedType; +import static com.monitorjbl.xlsx.TestUtils.expectFormattedContent; import static com.monitorjbl.xlsx.TestUtils.expectFormula; import static com.monitorjbl.xlsx.TestUtils.expectSameStringContent; import static com.monitorjbl.xlsx.TestUtils.expectStringContent; @@ -190,6 +191,22 @@ public void testEntityExpansion() { })); } + @Test + public void testDataFormatter() throws IOException { + try(Workbook workbook = openWorkbook("formats.xlsx")) { + Sheet sheet = workbook.getSheetAt(0); + Iterator rowIterator = sheet.rowIterator(); + + Cell A1 = getCellFromNextRow(rowIterator, 0); + Cell A2 = getCellFromNextRow(rowIterator, 0); + Cell A3 = getCellFromNextRow(rowIterator, 0); + + expectFormattedContent(A1, "1234.6"); + expectFormattedContent(A2, "1918-11-11"); + expectFormattedContent(A3, "50%"); + } + } + private static class ExploitServer extends NanoHTTPD implements AutoCloseable { private final Consumer onRequest; diff --git a/src/test/java/com/monitorjbl/xlsx/TestUtils.java b/src/test/java/com/monitorjbl/xlsx/TestUtils.java index 46c67926..bb893f47 100644 --- a/src/test/java/com/monitorjbl/xlsx/TestUtils.java +++ b/src/test/java/com/monitorjbl/xlsx/TestUtils.java @@ -2,6 +2,7 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; @@ -30,6 +31,10 @@ static void expectStringContent(Cell cell, String value) { assertEquals(value, cell.getStringCellValue(), "Cell " + ref(cell) + " has wrong string content."); } + static void expectFormattedContent(Cell cell, String value) { + assertEquals(value, new DataFormatter().formatCellValue(cell), "Cell " + ref(cell) + " has wrong formatted content."); + } + static void expectCachedType(Cell cell, CellType cellType) { assertEquals(cellType, cell.getCachedFormulaResultType(), "Cell " + ref(cell) + " has wrong cached type." + cellType); } diff --git a/src/test/resources/formats.xlsx b/src/test/resources/formats.xlsx new file mode 100644 index 00000000..8955982b Binary files /dev/null and b/src/test/resources/formats.xlsx differ