[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - sc/source

Markus Mohrhard markus.mohrhard at googlemail.com
Tue Jul 2 00:23:36 PDT 2013


 sc/source/filter/excel/xetable.cxx |   46 +++++++++++++++++++++++++++++++++++--
 sc/source/filter/inc/xetable.hxx   |    3 +-
 2 files changed, 46 insertions(+), 3 deletions(-)

New commits:
commit 4e4cad34f696ef820edc24eed0e26bbeae3757c2
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Jul 2 02:37:58 2013 +0200

    don't forget the formula cell style during xls/xlsx export, fdo#66242
    
    This reverts parts of commit 64223bda068cc6d82d3c5e359d465014568398bb.
    
    Change-Id: I6d5379aaedbf011b39a4cf076f0a43bc8a6cbc93
    (cherry picked from commit 93a5b7ee36818d60963e4fbe21f9e6c43c7c5a80)
    Reviewed-on: https://gerrit.libreoffice.org/4670
    Reviewed-by: Fridrich Strba <fridrich at documentfoundation.org>
    Tested-by: Fridrich Strba <fridrich at documentfoundation.org>

diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx
index 39f2e03..8694a49 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -760,13 +760,55 @@ IMPL_FIXEDMEMPOOL_NEWDEL( XclExpFormulaCell )
 
 XclExpFormulaCell::XclExpFormulaCell(
         const XclExpRoot& rRoot, const XclAddress& rXclPos,
-        sal_uInt32 nForcedXFId, const ScFormulaCell& rScFmlaCell,
+        const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId,
+        const ScFormulaCell& rScFmlaCell,
         XclExpArrayBuffer& rArrayBfr,
         XclExpShrfmlaBuffer& rShrfmlaBfr,
         XclExpTableopBuffer& rTableopBfr ) :
     XclExpSingleCellBase( EXC_ID2_FORMULA, 0, rXclPos, nForcedXFId ),
     mrScFmlaCell( const_cast< ScFormulaCell& >( rScFmlaCell ) )
 {
+    // *** Find result number format overwriting cell number format *** -------
+
+    if( GetXFId() == EXC_XFID_NOTFOUND )
+    {
+        SvNumberFormatter& rFormatter = rRoot.GetFormatter();
+        XclExpNumFmtBuffer& rNumFmtBfr = rRoot.GetNumFmtBuffer();
+
+        // current cell number format
+        sal_uLong nScNumFmt = pPattern ?
+            GETITEMVALUE( pPattern->GetItemSet(), SfxUInt32Item, ATTR_VALUE_FORMAT, sal_uLong ) :
+            rNumFmtBfr.GetStandardFormat();
+
+        // alternative number format passed to XF buffer
+        sal_uLong nAltScNumFmt = NUMBERFORMAT_ENTRY_NOT_FOUND;
+        /*  Xcl doesn't know Boolean number formats, we write
+            "TRUE";"FALSE" (language dependent). Don't do it for automatic
+            formula formats, because Excel gets them right. */
+        /*  #i8640# Don't set text format, if we have string results. */
+        short nFormatType = mrScFmlaCell.GetFormatType();
+        if( ((nScNumFmt % SV_COUNTRY_LANGUAGE_OFFSET) == 0) &&
+                (nFormatType != NUMBERFORMAT_LOGICAL) &&
+                (nFormatType != NUMBERFORMAT_TEXT) )
+            nAltScNumFmt = nScNumFmt;
+        /*  If cell number format is Boolean and automatic formula
+            format is Boolean don't write that ugly special format. */
+        else if( (nFormatType == NUMBERFORMAT_LOGICAL) &&
+                (rFormatter.GetType( nScNumFmt ) == NUMBERFORMAT_LOGICAL) )
+            nAltScNumFmt = rNumFmtBfr.GetStandardFormat();
+
+        // #i41420# find script type according to result type (always latin for numeric results)
+        sal_Int16 nScript = ApiScriptType::LATIN;
+        bool bForceLineBreak = false;
+        if( nFormatType == NUMBERFORMAT_TEXT )
+        {
+            String aResult = mrScFmlaCell.GetString();
+            bForceLineBreak = mrScFmlaCell.IsMultilineResult();
+            nScript = XclExpStringHelper::GetLeadingScriptType( rRoot, aResult );
+        }
+        SetXFId( rRoot.GetXFBuffer().InsertWithNumFmt( pPattern, nScript, nAltScNumFmt, bForceLineBreak ) );
+    }
+
     // *** Convert the formula token array *** --------------------------------
 
     ScAddress aScPos( static_cast< SCCOL >( rXclPos.mnCol ), static_cast< SCROW >( rXclPos.mnRow ), rRoot.GetCurrScTab() );
@@ -2336,7 +2378,7 @@ XclExpCellTable::XclExpCellTable( const XclExpRoot& rRoot ) :
             case CELLTYPE_FORMULA:
             {
                 xCell.reset(new XclExpFormulaCell(
-                    GetRoot(), aXclPos, nMergeBaseXFId,
+                    GetRoot(), aXclPos, pPattern, nMergeBaseXFId,
                     *rScCell.mpFormula, maArrayBfr, maShrfmlaBfr, maTableopBfr));
             }
             break;
diff --git a/sc/source/filter/inc/xetable.hxx b/sc/source/filter/inc/xetable.hxx
index b0253b3..655d6ea 100644
--- a/sc/source/filter/inc/xetable.hxx
+++ b/sc/source/filter/inc/xetable.hxx
@@ -451,7 +451,8 @@ class XclExpFormulaCell : public XclExpSingleCellBase
 
 public:
     explicit            XclExpFormulaCell( const XclExpRoot& rRoot, const XclAddress& rXclPos,
-                            sal_uInt32 nForcedXFId, const ScFormulaCell& rScFmlaCell,
+                            const ScPatternAttr* pPattern, sal_uInt32 nForcedXFId,
+                            const ScFormulaCell& rScFmlaCell,
                             XclExpArrayBuffer& rArrayBfr,
                             XclExpShrfmlaBuffer& rShrfmlaBfr,
                             XclExpTableopBuffer& rTableopBfr );


More information about the Libreoffice-commits mailing list