From 3717111db8664e81d076420bac506f4f0d3afd45 Mon Sep 17 00:00:00 2001 From: Tom Morris Date: Sat, 4 Jul 2020 02:42:33 -0400 Subject: [PATCH] Fix Open Office Spreadsheet (ODS) dates (#2843) * Truncate any completely empty columns on the right Fixes #565 The current versions of Open Office create default spreadsheets with over 1000 empty columns. Keep track of the rightmost non-empty column when importing and truncate everything else. Also adds a basic ODS import test. * Fix dates in ODS spreadsheets Fixes #2224 --- .../google/refine/importers/OdsImporter.java | 3 ++- .../refine/importers/OdsImporterTests.java | 4 ++-- .../src/com/google/refine/importers/films.ods | Bin 0 -> 14139 bytes 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 main/tests/server/src/com/google/refine/importers/films.ods diff --git a/main/src/com/google/refine/importers/OdsImporter.java b/main/src/com/google/refine/importers/OdsImporter.java index 47d41d170..3abe9cc90 100644 --- a/main/src/com/google/refine/importers/OdsImporter.java +++ b/main/src/com/google/refine/importers/OdsImporter.java @@ -39,6 +39,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -216,7 +217,7 @@ public class OdsImporter extends TabularImportingParserBase { } else if ("float".equals(cellType)) { value = cell.getDoubleValue(); } else if ("date".equals(cellType)) { - value = cell.getDateValue(); + value = cell.getDateValue().toInstant().atOffset(ZoneOffset.UTC); } else if ("currency".equals(cellType)) { value = cell.getCurrencyValue(); } else if ("percentage".equals(cellType)) { diff --git a/main/tests/server/src/com/google/refine/importers/OdsImporterTests.java b/main/tests/server/src/com/google/refine/importers/OdsImporterTests.java index 8ebe73507..ff5b7e42e 100644 --- a/main/tests/server/src/com/google/refine/importers/OdsImporterTests.java +++ b/main/tests/server/src/com/google/refine/importers/OdsImporterTests.java @@ -43,6 +43,7 @@ import static org.testng.Assert.assertTrue; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.time.OffsetDateTime; import org.slf4j.LoggerFactory; import org.testng.Assert; @@ -109,8 +110,7 @@ public class OdsImporterTests extends ImporterTest { Row row = project.rows.get(0); assertEquals(row.cells.size(), COLUMNS); assertEquals((String)row.getCellValue(1),"2 Days In New York"); - // FIXME: Dates are currently broken -// assertEquals(((OffsetDateTime)row.getCellValue(3)).toString().substring(0, 10),"2012-03-28"); + assertEquals(((OffsetDateTime)row.getCellValue(3)).toString().substring(0, 10),"2012-03-28"); assertEquals(((Number)row.getCellValue(5)).doubleValue(), 4.5, EPSILON); assertFalse((Boolean)row.getCellValue(7)); diff --git a/main/tests/server/src/com/google/refine/importers/films.ods b/main/tests/server/src/com/google/refine/importers/films.ods new file mode 100644 index 0000000000000000000000000000000000000000..0452824c39ddd4e2bfa03c34c1ca00c597c9e222 GIT binary patch literal 14139 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 literal 0 HcmV?d00001