diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2013-07-02 02:37:58 +0200 |
---|---|---|
committer | Fridrich Strba <fridrich@documentfoundation.org> | 2013-07-02 07:23:15 +0000 |
commit | 4e4cad34f696ef820edc24eed0e26bbeae3757c2 (patch) | |
tree | 21ee74838d68f5ace483d853b5c8ecb5ed5c901b | |
parent | ef7a440997f2e3b74837fd4e4d75df33b16e6ce6 (diff) |
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@documentfoundation.org>
Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
-rw-r--r-- | sc/source/filter/excel/xetable.cxx | 46 | ||||
-rw-r--r-- | sc/source/filter/inc/xetable.hxx | 3 |
2 files changed, 46 insertions, 3 deletions
diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx index 39f2e038e239..8694a495b499 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 b0253b3c21ce..655d6ea6cc3e 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 ); |