From 4e4cad34f696ef820edc24eed0e26bbeae3757c2 Mon Sep 17 00:00:00 2001 From: Markus Mohrhard Date: Tue, 2 Jul 2013 02:37:58 +0200 Subject: 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 Tested-by: Fridrich Strba --- sc/source/filter/excel/xetable.cxx | 46 ++++++++++++++++++++++++++++++++++++-- sc/source/filter/inc/xetable.hxx | 3 ++- 2 files changed, 46 insertions(+), 3 deletions(-) (limited to 'sc') 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 ); -- cgit v1.2.3