diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2019-05-01 07:22:44 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2019-05-01 09:40:22 +0200 |
commit | f8472069d451ec001e602bbc5329ad030fae1219 (patch) | |
tree | f7dcf3efddfc2aa77a8cb9de227fe5cc6cd73e78 /sc | |
parent | 4931a1e5e365c018a271fcd94f0a743b4fc38c6c (diff) |
tdf#125055: properly round fractions of seconds
... so that 2017-07-10T09:11:02.999999... becomes 2017-07-10T09:11:03,
not 2017-07-10T09:11:02. The latter created duplicated items in pivot
table cache previously.
TODO: check what to do if the times are actually different by 100 ns?
What Excel does then? Should we increase cache item precision?
Change-Id: I622d1c784ee9fddf6b387bec2d8af87bae5668ba
Reviewed-on: https://gerrit.libreoffice.org/71610
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx | bin | 0 -> 12193 bytes | |||
-rw-r--r-- | sc/qa/unit/pivottable_filters_test.cxx | 38 | ||||
-rw-r--r-- | sc/source/filter/excel/xepivotxml.cxx | 6 |
3 files changed, 42 insertions, 2 deletions
diff --git a/sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx b/sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx Binary files differnew file mode 100644 index 000000000000..de8906cf94ca --- /dev/null +++ b/sc/qa/unit/data/xlsx/pivottable_1s_difference.xlsx diff --git a/sc/qa/unit/pivottable_filters_test.cxx b/sc/qa/unit/pivottable_filters_test.cxx index d9804d0713f1..5df1766190cb 100644 --- a/sc/qa/unit/pivottable_filters_test.cxx +++ b/sc/qa/unit/pivottable_filters_test.cxx @@ -92,6 +92,7 @@ public: void testTdf124810(); void testTdf124883(); void testTdf125046(); + void testTdf125055(); CPPUNIT_TEST_SUITE(ScPivotTableFiltersTest); @@ -141,6 +142,7 @@ public: CPPUNIT_TEST(testTdf124810); CPPUNIT_TEST(testTdf124883); CPPUNIT_TEST(testTdf125046); + CPPUNIT_TEST(testTdf125055); CPPUNIT_TEST_SUITE_END(); @@ -2646,6 +2648,42 @@ void ScPivotTableFiltersTest::testTdf125046() "longText", "1"); } +void ScPivotTableFiltersTest::testTdf125055() +{ + ScDocShellRef xDocSh = loadDoc("pivottable_1s_difference.", FORMAT_XLSX); + CPPUNIT_ASSERT(xDocSh.is()); + + xmlDocPtr pDoc = XPathHelper::parseExport2( + *this, *xDocSh, m_xSFactory, "xl/pivotCache/pivotCacheDefinition1.xml", FORMAT_XLSX); + CPPUNIT_ASSERT(pDoc); + + // 1-second precision should not result in duplicated entries for values different by ~1 s. + // Previously truncating nanoseconds in GetExcelFormattedDate converted + // "2017-07-10T09:11:02.99999..." into "2017-07-10T09:11:02", creating two identical strings + // Only compare times here: see comment to ScPivotTableFiltersTest::testPivotCacheExportXLSX + // "TODO Date generator in tests are one day higher, than during standard xlsx export" + OUString sISODateTime = getXPath( + pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", "minDate"); + CPPUNIT_ASSERT_EQUAL(OUString("T09:11:02"), sISODateTime.copy(10)); + sISODateTime = getXPath( + pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", "maxDate"); + CPPUNIT_ASSERT_EQUAL(OUString("T09:11:03"), sISODateTime.copy(10)); + assertXPath(pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", + "count", "3"); + assertXPathChildren(pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", + 3); // 2 different values + empty + sISODateTime = getXPath( + pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems/x:d[1]", "v"); + CPPUNIT_ASSERT_EQUAL(OUString("T09:11:02"), sISODateTime.copy(10)); + sISODateTime = getXPath( + pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems/x:d[2]", "v"); + CPPUNIT_ASSERT_EQUAL(OUString("T09:11:03"), sISODateTime.copy(10)); + // Trailing empty + CPPUNIT_ASSERT_EQUAL( + 2, getXPathPosition( + pDoc, "/x:pivotCacheDefinition/x:cacheFields/x:cacheField[2]/x:sharedItems", "m")); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScPivotTableFiltersTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/filter/excel/xepivotxml.cxx b/sc/source/filter/excel/xepivotxml.cxx index 8c263795fe94..dc825f0c836b 100644 --- a/sc/source/filter/excel/xepivotxml.cxx +++ b/sc/source/filter/excel/xepivotxml.cxx @@ -192,8 +192,10 @@ namespace { */ OUString GetExcelFormattedDate( double fSerialDateTime, const SvNumberFormatter& rFormatter ) { - //::sax::Converter::convertDateTime(sBuf, (DateTime(rFormatter.GetNullDate()) + fSerialDateTime).GetUNODateTime(), 0, true); - css::util::DateTime aUDateTime = (DateTime(rFormatter.GetNullDate()) + fSerialDateTime).GetUNODateTime(); + // tdf#125055: properly round the value to seconds when truncating nanoseconds below + constexpr double fHalfSecond = 1 / 86400.0 * 0.5; + css::util::DateTime aUDateTime + = (DateTime(rFormatter.GetNullDate()) + fSerialDateTime + fHalfSecond).GetUNODateTime(); // We need to reset nanoseconds, to avoid string like: "1982-02-18T16:04:47.999999849" aUDateTime.NanoSeconds = 0; OUStringBuffer sBuf; |