sw/qa/extras/ooxmlexport/data/tdf123356.docx      |binary
 sw/qa/extras/ooxmlexport/ooxmlexport15.cxx        |   20 ++++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |    4 ++++
 3 files changed, 24 insertions(+)

New commits:
commit f1f27b2487ccfb7a03190ff68eadbfb611dd9749
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Sat Aug 22 17:22:04 2020 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Sun Aug 23 13:07:03 2020 +0200

    tdf#123356 DOCX import: fix COUNT formula
    
    Convert COUNT(x) to the equivalent, but
    portable Writer formula SUM(x)/MEAN(x).
    
    Note: this is a temporary conversion, which
    supports only 1-level nesting of function calls.
    Adding COUNT to Writer core, it will be possible
    to remove portable conversion later.
    
    Change-Id: I4b4019aadad52e6d1cf3b2d18d80b1d2c7485c6a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101185
    Tested-by: Jenkins
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf123356.docx 
b/sw/qa/extras/ooxmlexport/data/tdf123356.docx
new file mode 100644
index 000000000000..9432ca2dbb06
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123356.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
index ad96c19673c3..638a43761c76 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
@@ -113,6 +113,26 @@ DECLARE_OOXMLEXPORT_TEST(testTdf123390, "tdf123390.docx")
     CPPUNIT_ASSERT_EQUAL(OUString("1"), 
xEnumerationAccess2->getPresentation(false).trim());
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf123356, "tdf123356.docx")
+{
+    uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, 
uno::UNO_QUERY);
+    uno::Reference<container::XEnumerationAccess> 
xFieldsAccess(xTextFieldsSupplier->getTextFields());
+    uno::Reference<container::XEnumeration> 
xFields(xFieldsAccess->createEnumeration());
+
+    uno::Reference<text::XTextField> 
xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("-11"), 
xEnumerationAccess1->getPresentation(true).trim());
+    CPPUNIT_ASSERT_EQUAL(OUString("-11"), 
xEnumerationAccess1->getPresentation(false).trim());
+
+    // Tests cell formula COUNT(x) to SUM(x)/MEAN(x) conversion
+    uno::Reference<text::XTextField> 
xEnumerationAccess4(xFields->nextElement(), uno::UNO_QUERY);
+    
CPPUNIT_ASSERT_EQUAL(OUString("(SUM(<A1:C1>|<A2:B2>)/MEAN(<A1:C1>|<A2:B2>))"), 
xEnumerationAccess4->getPresentation(true).trim());
+    CPPUNIT_ASSERT_EQUAL(OUString("5"), 
xEnumerationAccess4->getPresentation(false).trim());
+
+    uno::Reference<text::XTextField> 
xEnumerationAccess3(xFields->nextElement(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(OUString("(SUM(<A1:C1>)/MEAN(<A1:C1>))"), 
xEnumerationAccess3->getPresentation(true).trim());
+    CPPUNIT_ASSERT_EQUAL(OUString("3"), 
xEnumerationAccess3->getPresentation(false).trim());
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf98000_changePageStyle, 
"tdf98000_changePageStyle.odt")
 {
     uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx 
b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index b5a8f124c142..a482a3231551 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -4272,6 +4272,10 @@ OUString DomainMapper_Impl::convertFieldFormula(const 
OUString& input) {
     icu::RegexMatcher 
rmatch7("\\bSIGN\\s*(\\(([^()]*|([^()])*\\([^()]*\\)[^()]*)*\\))", usInput, 
rMatcherFlags, status);
     usInput = rmatch7.replaceAll(icu::UnicodeString("((0 L $1) - ($1 L 0))"), 
status);
 
+    /* Fix up COUNT(x) using SUM(x)/MEAN(x) (it supports only 1-level nesting) 
*/
+    icu::RegexMatcher 
rmatch8("\\bCOUNT\\s*(\\(([^()]*|([^()])*\\([^()]*\\)[^()]*)*\\))", usInput, 
rMatcherFlags, status);
+    usInput = rmatch8.replaceAll(icu::UnicodeString("(SUM$1/MEAN$1)"), status);
+
     return OUString(usInput.getTerminatedBuffer());
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to