[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - sc/inc sc/source
László Németh
laszlo.nemeth at collabora.com
Mon Jan 26 10:46:02 PST 2015
sc/inc/address.hxx | 3 ++
sc/source/core/tool/address.cxx | 45 ++++++++++++++++++++++++++++++++++++
sc/source/filter/excel/xestream.cxx | 10 ++++++++
sc/source/filter/excel/xetable.cxx | 14 ++++++++---
sc/source/filter/inc/xestream.hxx | 2 +
5 files changed, 71 insertions(+), 3 deletions(-)
New commits:
commit ace8f9c2a31795cc2329c6bb27deacde9f4c18df
Author: László Németh <laszlo.nemeth at collabora.com>
Date: Mon Jan 26 15:45:05 2015 +0100
fdo#88810 avoid unnecessary massive O(U)String allocations in XLSX export
Change-Id: Ie6a024463e7ee9b0f4492b2431533708a578faf0
diff --git a/sc/inc/address.hxx b/sc/inc/address.hxx
index 06c450b..aa05a58 100644
--- a/sc/inc/address.hxx
+++ b/sc/inc/address.hxx
@@ -325,6 +325,9 @@ public:
ExternalInfo* pExtInfo = NULL,
const css::uno::Sequence<css::sheet::ExternalLinkInfo>* pExternalLinks = NULL );
+ SC_DLLPUBLIC bool TryFormat( char * s, sal_uInt16 nFlags = 0,
+ const ScDocument* pDocument = NULL,
+ const Details& rDetails = detailsOOOa1) const;
SC_DLLPUBLIC OUString Format( sal_uInt16 nFlags = 0,
const ScDocument* pDocument = NULL,
const Details& rDetails = detailsOOOa1) const;
diff --git a/sc/source/core/tool/address.cxx b/sc/source/core/tool/address.cxx
index 1efcac7..bb7a1bf 100644
--- a/sc/source/core/tool/address.cxx
+++ b/sc/source/core/tool/address.cxx
@@ -1745,6 +1745,51 @@ static OUString getFileNameFromDoc( const ScDocument* pDoc )
return sFileName;
}
+/** Tries to obtain a simple address without OUString/OString allocation
+ *
+ * @returns TRUE at success (it is enough to call OUString Format() at FALSE)
+ *
+ */
+
+bool ScAddress::TryFormat(char * s, sal_uInt16 nFlags, const ScDocument* pDoc,
+ const Details& rDetails) const
+{
+ if( nFlags & SCA_VALID )
+ nFlags |= ( SCA_VALID_ROW | SCA_VALID_COL | SCA_VALID_TAB );
+ if(( pDoc && (nFlags & SCA_VALID_TAB ) && ( nTab >= pDoc->GetTableCount() || ( nFlags & SCA_TAB_3D ))) ||
+ ! (nFlags & SCA_VALID_COL) || ! (nFlags & SCA_VALID_ROW) ||
+ (nFlags & SCA_COL_ABSOLUTE) != 0 || (nFlags & SCA_ROW_ABSOLUTE) != 0 )
+ {
+ return false;
+ }
+
+ switch( rDetails.eConv )
+ {
+ default :
+ // Note: length of s (defined by SIMPLEADDRESSLEN) supports the following simple addresses
+ case formula::FormulaGrammar::CONV_OOO:
+ case formula::FormulaGrammar::CONV_XL_A1:
+ case formula::FormulaGrammar::CONV_XL_OOX:
+ if (nCol >= 26 * 26)
+ // TODO: extend it for full column range
+ return false;
+ if( nCol < 26 )
+ *s = 'A' + nCol;
+ else
+ {
+ *s = 'A' + nCol / 26 - 1;
+ s++;
+ *s = 'A' + nCol % 26;
+ }
+ sprintf(s + 1, "%d", nRow + 1);
+ break;
+ case formula::FormulaGrammar::CONV_XL_R1C1:
+ // not used in XLSX export
+ return false;
+ }
+ return true;
+}
+
OUString ScAddress::Format(sal_uInt16 nFlags, const ScDocument* pDoc,
const Details& rDetails) const
{
diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx
index e5ff50c..188fcd6 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -718,6 +718,11 @@ OString XclXmlUtils::ToOString( const OUString& s )
return OUStringToOString( s, RTL_TEXTENCODING_UTF8 );
}
+bool XclXmlUtils::TryToChar( char * s, const ScAddress& rAddress )
+{
+ return rAddress.TryFormat(s, SCA_VALID, NULL, ScAddress::Details( FormulaGrammar::CONV_XL_A1));
+}
+
OString XclXmlUtils::ToOString( const ScAddress& rAddress )
{
OUString sAddress(rAddress.Format(SCA_VALID, NULL, ScAddress::Details( FormulaGrammar::CONV_XL_A1)));
@@ -760,6 +765,11 @@ static ScAddress lcl_ToAddress( const XclAddress& rAddress )
return aAddress;
}
+bool XclXmlUtils::TryToChar( sal_Char * s, const XclAddress& rAddress )
+{
+ return TryToChar( s, lcl_ToAddress( rAddress ));
+}
+
OString XclXmlUtils::ToOString( const XclAddress& rAddress )
{
return ToOString( lcl_ToAddress( rAddress ) );
diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx
index 23adf6e..f32cdce 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -41,6 +41,11 @@ using namespace ::oox;
namespace ApiScriptType = ::com::sun::star::i18n::ScriptType;
+// max string length of simple addresses (eg. ABC1000000\0)
+#if MAXROWCOUNT_DEFINE < 9999999
+#define SIMPLEADDRESSLEN 11
+#endif
+
// Helper records for cell records
XclExpStringRec::XclExpStringRec( const XclExpRoot& rRoot, const OUString& rResult ) :
@@ -630,9 +635,10 @@ static OString lcl_GetStyleId( XclExpXmlStream& rStrm, const XclExpCellBase& rCe
void XclExpNumberCell::SaveXml( XclExpXmlStream& rStrm )
{
+ char fastAdr[SIMPLEADDRESSLEN];
sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
rWorksheet->startElement( XML_c,
- XML_r, XclXmlUtils::ToOString( GetXclPos() ).getStr(),
+ XML_r, XclXmlUtils::TryToChar( fastAdr, GetXclPos() ) ? fastAdr : XclXmlUtils::ToOString( GetXclPos() ).getStr(),
XML_s, lcl_GetStyleId( rStrm, *this ).getStr(),
XML_t, "n",
// OOXTODO: XML_cm, XML_vm, XML_ph
@@ -923,11 +929,12 @@ void XclExpFormulaCell::SaveXml( XclExpXmlStream& rStrm )
{
const char* sType = NULL;
OUString sValue;
+ char fastAdr[SIMPLEADDRESSLEN];
XclXmlUtils::GetFormulaTypeAndValue( mrScFmlaCell, sType, sValue );
sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
rWorksheet->startElement( XML_c,
- XML_r, XclXmlUtils::ToOString( GetXclPos() ).getStr(),
+ XML_r, XclXmlUtils::TryToChar( fastAdr, GetXclPos() ) ? fastAdr : XclXmlUtils::ToOString( GetXclPos() ).getStr(),
XML_s, lcl_GetStyleId( rStrm, *this ).getStr(),
XML_t, sType,
// OOXTODO: XML_cm, XML_vm, XML_ph
@@ -1307,9 +1314,10 @@ bool XclExpRkCell::TryMerge( const XclExpCellBase& rCell )
void XclExpRkCell::WriteXmlContents( XclExpXmlStream& rStrm, const XclAddress& rAddress, sal_uInt32 nXFId, sal_uInt16 nRelCol )
{
+ char fastAdr[SIMPLEADDRESSLEN];
sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
rWorksheet->startElement( XML_c,
- XML_r, XclXmlUtils::ToOString( rAddress ).getStr(),
+ XML_r, XclXmlUtils::TryToChar( fastAdr, rAddress ) ? fastAdr : XclXmlUtils::ToOString( rAddress ).getStr(),
XML_s, lcl_GetStyleId( rStrm, nXFId ).getStr(),
XML_t, "n",
// OOXTODO: XML_cm, XML_vm, XML_ph
diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx
index df1f7a3..8454b2e 100644
--- a/sc/source/filter/inc/xestream.hxx
+++ b/sc/source/filter/inc/xestream.hxx
@@ -266,9 +266,11 @@ public:
static OString ToOString( const Color& rColor );
static OString ToOString( const OUString& s );
static OString ToOString( const ScfUInt16Vec& rBuffer );
+ static bool TryToChar( char * s, const ScAddress& rRange );
static OString ToOString( const ScAddress& rRange );
static OString ToOString( const ScRange& rRange );
static OString ToOString( const ScRangeList& rRangeList );
+ static bool TryToChar( char * s, const XclAddress& rAddress );
static OString ToOString( const XclAddress& rAddress );
static OString ToOString( const XclExpString& s );
static OString ToOString( const XclRange& rRange );
More information about the Libreoffice-commits
mailing list