[Libreoffice-commits] core.git: 6 commits - chart2/qa include/svl oox/source sc/source svl/source

Eike Rathke erack at redhat.com
Fri Nov 27 14:22:24 PST 2015


 chart2/qa/extras/chart2export.cxx  |    2 -
 include/svl/zforlist.hxx           |   14 +++++++
 oox/source/export/chartexport.cxx  |   29 ++++++++++----
 sc/source/filter/excel/xestyle.cxx |   61 ++-----------------------------
 svl/source/numbers/zforlist.cxx    |   72 +++++++++++++++++++++++++++++++++++++
 5 files changed, 112 insertions(+), 66 deletions(-)

New commits:
commit 509cfa40691cf544519872a63335cff4a4d94006
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Nov 27 22:57:55 2015 +0100

    Resolves: tdf#96072 export Chart format codes in Excel notation
    
    As for the change in chart2/qa/extras/chart2export.cxx
    Chart2ExportTest::testAxisNumberFormatXLSX() unit test: also Excel
    writes string parts of format codes quoted, including minus sign in
    negative subformat.
    
    Change-Id: I201bb012df818129cbc65de0eee8eca59e57d829

diff --git a/chart2/qa/extras/chart2export.cxx b/chart2/qa/extras/chart2export.cxx
index 6aaba78..ad5859b 100644
--- a/chart2/qa/extras/chart2export.cxx
+++ b/chart2/qa/extras/chart2export.cxx
@@ -1281,7 +1281,7 @@ void Chart2ExportTest::testAxisNumberFormatXLSX()
     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "formatCode", "0.00E+000");
     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[1]/c:numFmt", "sourceLinked", "0");
 
-    assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "formatCode", "[$$-409]#,##0;-[$$-409]#,##0");
+    assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "formatCode", "[$$-409]#,##0;\\-[$$-409]#,##0");
     assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:valAx[2]/c:numFmt", "sourceLinked", "1");
 }
 
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index 14e49a8..e62ad95 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -90,6 +90,10 @@
 #include <comphelper/sequence.hxx>
 #include <xmloff/SchXMLSeriesHelper.hxx>
 #include "ColorPropertySet.hxx"
+
+#include <svl/zforlist.hxx>
+#include <svl/numuno.hxx>
+
 #include <set>
 #include <unordered_set>
 
@@ -3753,17 +3757,26 @@ bool ChartExport::isDeep3dChart()
 
 OUString ChartExport::getNumberFormatCode(sal_Int32 nKey) const
 {
+    /* XXX if this was called more than one or two times per export the two
+     * SvNumberFormatter instances and NfKeywordTable should be member
+     * variables and initialized only once. */
+
+    OUString aCode("General");  // init with fallback
     uno::Reference<util::XNumberFormatsSupplier> xNumberFormatsSupplier(mxChartModel, uno::UNO_QUERY_THROW);
-    uno::Reference<util::XNumberFormats> xNumberFormats = xNumberFormatsSupplier->getNumberFormats();
-    uno::Reference<beans::XPropertySet> xNumberFormat = xNumberFormats->getByKey(nKey);
+    SvNumberFormatsSupplierObj* pSupplierObj = SvNumberFormatsSupplierObj::getImplementation( xNumberFormatsSupplier);
+    if (!pSupplierObj)
+        return aCode;
+
+    SvNumberFormatter* pNumberFormatter = pSupplierObj->GetNumberFormatter();
+    if (!pNumberFormatter)
+        return aCode;
 
-    if (!xNumberFormat.is())
-        return OUString();
+    SvNumberFormatter aTempFormatter( comphelper::getProcessComponentContext(), LANGUAGE_ENGLISH_US);
+    NfKeywordTable aKeywords;
+    aTempFormatter.FillKeywordTableForExcel( aKeywords);
+    aCode = pNumberFormatter->GetFormatStringForExcel( nKey, aKeywords, aTempFormatter);
 
-    uno::Any aAny = xNumberFormat->getPropertyValue("FormatString");
-    OUString aValue;
-    aAny >>= aValue;
-    return aValue;
+    return aCode;
 }
 
 }// drawingml
commit 7340872a3450e38a7f820945585a9ee60b2a9d41
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Nov 27 21:32:09 2015 +0100

    use SvNumberFormatter::GetFormatStringForExcel()
    
    Change-Id: I4d5f8aa33fffceaa080d8b2ef6a177b4680cf761

diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx
index be7a005..55ebdcf 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -1433,48 +1433,9 @@ void XclExpNumFmtBuffer::WriteFormatRecord( XclExpStream& rStrm, const XclExpNum
 
 namespace {
 
-OUString GetNumberFormatCode(XclRoot& rRoot, const sal_uInt16 nScNumFmt, SvNumberFormatter* xFormatter, NfKeywordTable* pKeywordTable)
+OUString GetNumberFormatCode(XclRoot& rRoot, const sal_uInt16 nScNumFmt, SvNumberFormatter* pFormatter, NfKeywordTable* pKeywordTable)
 {
-    OUString aFormatStr;
-
-    if( const SvNumberformat* pEntry = rRoot.GetFormatter().GetEntry( nScNumFmt ) )
-    {
-        if( pEntry->GetType() == css::util::NumberFormat::LOGICAL )
-        {
-            // build Boolean number format
-            Color* pColor = nullptr;
-            OUString aTemp;
-            const_cast< SvNumberformat* >( pEntry )->GetOutputString( 1.0, aTemp, &pColor );
-            aFormatStr += "\"" + aTemp + "\";\"" + aTemp + "\";\"";
-            const_cast< SvNumberformat* >( pEntry )->GetOutputString( 0.0, aTemp, &pColor );
-            aFormatStr += aTemp + "\"";
-        }
-        else
-        {
-            LanguageType eLang = pEntry->GetLanguage();
-            if( eLang != LANGUAGE_ENGLISH_US )
-            {
-                sal_Int32 nCheckPos;
-                short nType = css::util::NumberFormat::DEFINED;
-                sal_uInt32 nKey;
-                OUString aTemp( pEntry->GetFormatstring() );
-                xFormatter->PutandConvertEntry( aTemp, nCheckPos, nType, nKey, eLang, LANGUAGE_ENGLISH_US );
-                OSL_ENSURE( nCheckPos == 0, "XclExpNumFmtBuffer::WriteFormatRecord - format code not convertible" );
-                pEntry = xFormatter->GetEntry( nKey );
-            }
-
-            aFormatStr = pEntry->GetMappedFormatstring( *pKeywordTable, *xFormatter->GetLocaleData() );
-            if( aFormatStr == "Standard" )
-                aFormatStr = "General";
-        }
-    }
-    else
-    {
-        OSL_FAIL( "XclExpNumFmtBuffer::WriteFormatRecord - format not found" );
-        aFormatStr = "General";
-    }
-
-    return aFormatStr;
+    return rRoot.GetFormatter().GetFormatStringForExcel( nScNumFmt, *pKeywordTable, *pFormatter);
 }
 
 }
commit 2011b5412c4daa47bc5624a2efc996960e19c2a9
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Nov 27 19:08:50 2015 +0100

    introduce SvNumberFormatter::GetFormatStringForExcel()
    
    Taking implementation from sc/source/filter/excel/xestyle.cxx
    GetNumberFormatCode(), slightly modified to ensure valid conversion and
    force en-US locale data. Also don't unnecessarily convert if format is
    for system locale and system locale is en-US.
    
    Change-Id: I9223eaa655132b4106a35c94cb0005559d7575b1

diff --git a/include/svl/zforlist.hxx b/include/svl/zforlist.hxx
index 159763b..932fd86 100644
--- a/include/svl/zforlist.hxx
+++ b/include/svl/zforlist.hxx
@@ -759,9 +759,19 @@ public:
     void    FillKeywordTable( NfKeywordTable& rKeywords, LanguageType eLang );
 
     /** Fill a NfKeywordIndex table with keywords usable in Excel export with
-        GetMappedFormatstring() */
+        GetFormatStringForExcel() or SvNumberformat::GetMappedFormatstring() */
     void    FillKeywordTableForExcel( NfKeywordTable& rKeywords );
 
+    /** Return a format code string suitable for Excel export.
+
+        @param  rTempFormatter
+                SvNumberFormatter to use if a non-en-US format code needs to be
+                converted and put, should not be the same formatter to not
+                pollute the entries of this one here.
+     */
+    OUString GetFormatStringForExcel( sal_uInt32 nKey, const NfKeywordTable& rKeywords,
+            SvNumberFormatter& rTempFormatter ) const;
+
     /** Return a keyword for a language/country and NfKeywordIndex
         for XML import, to generate number format strings. */
     OUString GetKeyword( LanguageType eLnge, sal_uInt16 nIndex );
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 81502d5..078d566 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -791,6 +791,62 @@ void SvNumberFormatter::FillKeywordTableForExcel( NfKeywordTable& rKeywords )
 }
 
 
+OUString SvNumberFormatter::GetFormatStringForExcel( sal_uInt32 nKey, const NfKeywordTable& rKeywords,
+        SvNumberFormatter& rTempFormatter ) const
+{
+    OUString aFormatStr;
+    if (const SvNumberformat* pEntry = GetEntry( nKey))
+    {
+        if (pEntry->GetType() == css::util::NumberFormat::LOGICAL)
+        {
+            // Build Boolean number format, which needs non-zero and zero
+            // subformat codes with TRUE and FALSE strings.
+            Color* pColor = nullptr;
+            OUString aTemp;
+            const_cast< SvNumberformat* >( pEntry )->GetOutputString( 1.0, aTemp, &pColor );
+            aFormatStr += "\"" + aTemp + "\";\"" + aTemp + "\";\"";
+            const_cast< SvNumberformat* >( pEntry )->GetOutputString( 0.0, aTemp, &pColor );
+            aFormatStr += aTemp + "\"";
+        }
+        else
+        {
+            LanguageType nLang = pEntry->GetLanguage();
+            if (nLang == LANGUAGE_SYSTEM)
+                nLang = SvtSysLocale().GetLanguageTag().getLanguageType();
+            if (nLang != LANGUAGE_ENGLISH_US)
+            {
+                sal_Int32 nCheckPos;
+                short nType = css::util::NumberFormat::DEFINED;
+                sal_uInt32 nTempKey;
+                OUString aTemp( pEntry->GetFormatstring());
+                rTempFormatter.PutandConvertEntry( aTemp, nCheckPos, nType, nTempKey, nLang, LANGUAGE_ENGLISH_US);
+                SAL_WARN_IF( nCheckPos != 0, "svl.numbers",
+                        "SvNumberFormatter::GetFormatStringForExcel - format code not convertible");
+                if (nTempKey != NUMBERFORMAT_ENTRY_NOT_FOUND)
+                    pEntry = rTempFormatter.GetEntry( nTempKey);
+            }
+
+            if (pEntry)
+            {
+                // GetLocaleData() returns the current locale's data, so switch
+                // before (which doesn't do anything if it was the same locale
+                // already).
+                rTempFormatter.ChangeIntl( LANGUAGE_ENGLISH_US);
+                aFormatStr = pEntry->GetMappedFormatstring( rKeywords, *rTempFormatter.GetLocaleData());
+            }
+        }
+    }
+    else
+    {
+        SAL_WARN("svl.numbers","SvNumberFormatter::GetFormatStringForExcel - format not found: " << nKey);
+    }
+
+    if (aFormatStr.isEmpty())
+        aFormatStr = "General";
+    return aFormatStr;
+}
+
+
 OUString SvNumberFormatter::GetKeyword( LanguageType eLnge, sal_uInt16 nIndex )
 {
     ChangeIntl(eLnge);
commit ea1db935b085507f11d05f8606a680d521db4838
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Nov 27 15:14:38 2015 +0100

    use proper case "General" keyword
    
    ... Excel doesn't seem to care though.
    
    Change-Id: I3697a808d8fee2417f0b0e03dba2b94ceea133dd

diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index f12ee01..81502d5 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -779,6 +779,8 @@ void SvNumberFormatter::FillKeywordTableForExcel( NfKeywordTable& rKeywords )
 {
     FillKeywordTable( rKeywords, LANGUAGE_ENGLISH_US );
 
+    // Replace upper case "GENERAL" with proper case "General".
+    rKeywords[ NF_KEY_GENERAL ] = GetStandardName( LANGUAGE_ENGLISH_US );
     // Remap codes unknown to Excel.
     rKeywords[ NF_KEY_NN ] = "DDD";
     rKeywords[ NF_KEY_NNN ] = "DDDD";
commit 2246f478e2505388ab253d08a1d86b897251223b
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Nov 27 14:33:44 2015 +0100

    use SvNumberFormatter::FillKeywordTableForExcel()
    
    Change-Id: I83b0cd033ba46dabdde92ed2812398518d1895bf

diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx
index cd9f8e1..be7a005 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -1366,14 +1366,7 @@ XclExpNumFmtBuffer::XclExpNumFmtBuffer( const XclExpRoot& rRoot ) :
         default:        mnXclOffset = 0; DBG_ERROR_BIFF();
     }
 
-    mxFormatter->FillKeywordTable( *mpKeywordTable, LANGUAGE_ENGLISH_US );
-    // remap codes unknown to Excel
-    (*mpKeywordTable)[ NF_KEY_NN ] = "DDD";
-    (*mpKeywordTable)[ NF_KEY_NNN ] = "DDDD";
-    // NNNN gets a separator appended in SvNumberformat::GetMappedFormatString()
-    (*mpKeywordTable)[ NF_KEY_NNNN ] = "DDDD";
-    // Export the Thai T NatNum modifier.
-    (*mpKeywordTable)[ NF_KEY_THAI_T ] = "T";
+    mxFormatter->FillKeywordTableForExcel( *mpKeywordTable );
 }
 
 XclExpNumFmtBuffer::~XclExpNumFmtBuffer()
@@ -2997,14 +2990,7 @@ XclExpDxfs::XclExpDxfs( const XclExpRoot& rRoot )
     mxFormatter( new SvNumberFormatter( comphelper::getProcessComponentContext(), LANGUAGE_ENGLISH_US ) ),
     mpKeywordTable( new NfKeywordTable )
 {
-    mxFormatter->FillKeywordTable( *mpKeywordTable, LANGUAGE_ENGLISH_US );
-    // remap codes unknown to Excel
-    (*mpKeywordTable)[ NF_KEY_NN ] = "DDD";
-    (*mpKeywordTable)[ NF_KEY_NNN ] = "DDDD";
-    // NNNN gets a separator appended in SvNumberformat::GetMappedFormatString()
-    (*mpKeywordTable)[ NF_KEY_NNNN ] = "DDDD";
-    // Export the Thai T NatNum modifier.
-    (*mpKeywordTable)[ NF_KEY_THAI_T ] = "T";
+    mxFormatter->FillKeywordTableForExcel( *mpKeywordTable );
 
     SCTAB nTables = rRoot.GetDoc().GetTableCount();
     for(SCTAB nTab = 0; nTab < nTables; ++nTab)
commit b55548043e969a6aa4c211217cfc3fb85d50d2da
Author: Eike Rathke <erack at redhat.com>
Date:   Fri Nov 27 14:18:01 2015 +0100

    introduce SvNumberFormatter::FillKeywordTableForExcel()
    
    ... to conflate the places that do this on their own.
    
    Change-Id: Idde2173780e0515ad982b4be46fc4df23a7577ad

diff --git a/include/svl/zforlist.hxx b/include/svl/zforlist.hxx
index 2e3760e..159763b 100644
--- a/include/svl/zforlist.hxx
+++ b/include/svl/zforlist.hxx
@@ -758,6 +758,10 @@ public:
     /// Fill a NfKeywordIndex table with keywords of a language/country
     void    FillKeywordTable( NfKeywordTable& rKeywords, LanguageType eLang );
 
+    /** Fill a NfKeywordIndex table with keywords usable in Excel export with
+        GetMappedFormatstring() */
+    void    FillKeywordTableForExcel( NfKeywordTable& rKeywords );
+
     /** Return a keyword for a language/country and NfKeywordIndex
         for XML import, to generate number format strings. */
     OUString GetKeyword( LanguageType eLnge, sal_uInt16 nIndex );
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 53b4213..f12ee01 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -775,6 +775,20 @@ void SvNumberFormatter::FillKeywordTable( NfKeywordTable& rKeywords,
 }
 
 
+void SvNumberFormatter::FillKeywordTableForExcel( NfKeywordTable& rKeywords )
+{
+    FillKeywordTable( rKeywords, LANGUAGE_ENGLISH_US );
+
+    // Remap codes unknown to Excel.
+    rKeywords[ NF_KEY_NN ] = "DDD";
+    rKeywords[ NF_KEY_NNN ] = "DDDD";
+    // NNNN gets a separator appended in SvNumberformat::GetMappedFormatString()
+    rKeywords[ NF_KEY_NNNN ] = "DDDD";
+    // Export the Thai T NatNum modifier.
+    rKeywords[ NF_KEY_THAI_T ] = "T";
+}
+
+
 OUString SvNumberFormatter::GetKeyword( LanguageType eLnge, sal_uInt16 nIndex )
 {
     ChangeIntl(eLnge);


More information about the Libreoffice-commits mailing list