[Libreoffice-commits] core.git: 2 commits - sc/qa sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Mon Mar 10 11:26:16 PDT 2014
sc/qa/unit/data/xlsx/shared-formula/3d-reference.xlsx |binary
sc/qa/unit/subsequent_export-test.cxx | 74 ++++++++++++++++++
sc/source/filter/excel/xecontent.cxx | 12 +-
sc/source/filter/excel/xeextlst.cxx | 2
sc/source/filter/excel/xeroot.cxx | 6 -
sc/source/filter/excel/xestream.cxx | 17 ----
sc/source/filter/excel/xetable.cxx | 4
sc/source/filter/inc/xeroot.hxx | 2
sc/source/filter/inc/xestream.hxx | 4
sc/source/filter/xcl97/XclExpChangeTrack.cxx | 3
10 files changed, 87 insertions(+), 37 deletions(-)
New commits:
commit ca8ca8c28742879220f3ff88ae0d71c8d69b11cd
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Mon Mar 10 14:02:00 2014 -0400
fdo#75950: Just set the right grammar and be done with it.
Using the Excel A1 syntax with custom opcode was probably a hack back
in the day. These days we can just set the right grammar and expect the
compiler to do the right thing.
Change-Id: Iae98f9f09a7da0b7b9549e06308d5d313bbff1ea
diff --git a/sc/source/filter/excel/xecontent.cxx b/sc/source/filter/excel/xecontent.cxx
index 14baaea..0df97bb 100644
--- a/sc/source/filter/excel/xecontent.cxx
+++ b/sc/source/filter/excel/xecontent.cxx
@@ -946,13 +946,13 @@ void XclExpCFImpl::SaveXml( XclExpXmlStream& rStrm )
{
rWorksheet->startElement( XML_formula, FSEND );
rWorksheet->write(XclXmlUtils::ToOUString( GetRoot().GetDoc(), mrFormatEntry.GetValidSrcPos(),
- mrFormatEntry.CreateTokenArry( 0 ), GetRoot().GetOpCodeMap() ));
+ mrFormatEntry.CreateTokenArry(0)));
rWorksheet->endElement( XML_formula );
if (bFmla2)
{
rWorksheet->startElement( XML_formula, FSEND );
rWorksheet->write(XclXmlUtils::ToOUString( GetRoot().GetDoc(), mrFormatEntry.GetValidSrcPos(),
- mrFormatEntry.CreateTokenArry( 1 ), GetRoot().GetOpCodeMap() ));
+ mrFormatEntry.CreateTokenArry(1)));
rWorksheet->endElement( XML_formula );
}
}
@@ -1093,7 +1093,7 @@ void XclExpCfvo::SaveXml( XclExpXmlStream& rStrm )
if(mrEntry.GetType() == COLORSCALE_FORMULA)
{
OUString aFormula = XclXmlUtils::ToOUString( GetRoot().GetDoc(), maSrcPos,
- mrEntry.GetFormula()->Clone(), GetRoot().GetOpCodeMap() );
+ mrEntry.GetFormula()->Clone());
aValue = OUStringToOString(aFormula, RTL_TEXTENCODING_UTF8 );
}
else
@@ -1602,7 +1602,7 @@ XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) :
CreateDataValFormula() and CreateListValFormula(). */
mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_LISTVAL, *xScTokArr );
msFormula1 = XclXmlUtils::ToOUString( GetDoc(), pValData->GetSrcPos(),
- xScTokArr.get(), GetRoot().GetOpCodeMap() );
+ xScTokArr.get());
}
}
else
@@ -1610,7 +1610,7 @@ XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) :
// no list validation -> convert the formula
mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, *xScTokArr );
msFormula1 = XclXmlUtils::ToOUString( GetDoc(), pValData->GetSrcPos(),
- xScTokArr.get(), GetRoot().GetOpCodeMap() );
+ xScTokArr.get());
}
}
@@ -1620,7 +1620,7 @@ XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) :
{
mxTokArr2 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, *xScTokArr );
msFormula2 = XclXmlUtils::ToOUString( GetDoc(), pValData->GetSrcPos(),
- xScTokArr.get(), GetRoot().GetOpCodeMap() );
+ xScTokArr.get());
}
}
else
diff --git a/sc/source/filter/excel/xeextlst.cxx b/sc/source/filter/excel/xeextlst.cxx
index 92fb6c6..852647c 100644
--- a/sc/source/filter/excel/xeextlst.cxx
+++ b/sc/source/filter/excel/xeextlst.cxx
@@ -63,7 +63,7 @@ XclExpExtCfvo::XclExpExtCfvo( const XclExpRoot& rRoot, const ScColorScaleEntry&
if(pArr)
{
aFormula = XclXmlUtils::ToOUString( GetRoot().GetDoc(), rSrcPos,
- pArr->Clone(), GetRoot().GetOpCodeMap() );
+ pArr->Clone());
}
maValue = OUStringToOString(aFormula, RTL_TEXTENCODING_UTF8 );
}
diff --git a/sc/source/filter/excel/xeroot.cxx b/sc/source/filter/excel/xeroot.cxx
index 88ab3e3..3da4427 100644
--- a/sc/source/filter/excel/xeroot.cxx
+++ b/sc/source/filter/excel/xeroot.cxx
@@ -167,12 +167,6 @@ XclExpPivotTableManager& XclExpRoot::GetPivotTableManager() const
return *mrExpData.mxPTableMgr;
}
-ScCompiler::OpCodeMapPtr XclExpRoot::GetOpCodeMap() const
-{
- OSL_ENSURE( mrExpData.mxOpCodeMap, "XclExpRoot::GetOpCodeMap - missing object (wrong BIFF?)" );
- return mrExpData.mxOpCodeMap;
-}
-
void XclExpRoot::InitializeConvert()
{
mrExpData.mxTabInfo.reset( new XclExpTabInfo( GetRoot() ) );
diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx
index 2c37fb1..290bd6d 100644
--- a/sc/source/filter/excel/xestream.cxx
+++ b/sc/source/filter/excel/xestream.cxx
@@ -842,23 +842,10 @@ OUString XclXmlUtils::ToOUString( const ScfUInt16Vec& rBuf, sal_Int32 nStart, sa
}
OUString XclXmlUtils::ToOUString(
- ScDocument& rDocument, const ScAddress& rAddress, const ScTokenArray* pTokenArray,
- const FormulaCompiler::OpCodeMapPtr & xOpCodeMap )
+ ScDocument& rDocument, const ScAddress& rAddress, const ScTokenArray* pTokenArray )
{
ScCompiler aCompiler( &rDocument, rAddress, const_cast<ScTokenArray&>(*pTokenArray));
- if (xOpCodeMap)
- {
- aCompiler.SetFormulaLanguage( xOpCodeMap );
- /* TODO: The correct ref convention would be CONV_XL_OOX but that would
- * need aCompiler.SetExternalLinks() and so far we don't have the links
- * mapping. */
- aCompiler.SetRefConvention( formula::FormulaGrammar::CONV_XL_A1 );
- }
- else
- {
- SAL_WARN( "sc", "XclXmlUtils::ToOUString - no opcodemap, dumb fallback to PODF");
- aCompiler.SetGrammar(FormulaGrammar::GRAM_ENGLISH_XL_A1);
- }
+ aCompiler.SetGrammar(FormulaGrammar::GRAM_ENGLISH_XL_OOX);
OUStringBuffer aBuffer( pTokenArray->GetLen() * 5 );
aCompiler.CreateStringFromTokenArray( aBuffer );
diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx
index 5655910..18b9e0e 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -962,8 +962,8 @@ void XclExpFormulaCell::SaveXml( XclExpXmlStream& rStrm )
// OOXTODO: XML_si, uint
// OOXTODO: XML_bx bool
FSEND );
- rWorksheet->writeEscaped( XclXmlUtils::ToOUString( *mrScFmlaCell.GetDocument(), mrScFmlaCell.aPos,
- mrScFmlaCell.GetCode(), rStrm.GetRoot().GetOpCodeMap() ) );
+ rWorksheet->writeEscaped( XclXmlUtils::ToOUString(
+ *mrScFmlaCell.GetDocument(), mrScFmlaCell.aPos, mrScFmlaCell.GetCode()));
rWorksheet->endElement( XML_f );
if( strcmp( sType, "inlineStr" ) == 0 )
{
diff --git a/sc/source/filter/inc/xeroot.hxx b/sc/source/filter/inc/xeroot.hxx
index 67c4f2e..80a7ee5 100644
--- a/sc/source/filter/inc/xeroot.hxx
+++ b/sc/source/filter/inc/xeroot.hxx
@@ -145,8 +145,6 @@ public:
XclExpPivotTableManager& GetPivotTableManager() const;
/** Returns the differential formatting list */
XclExpDxfs& GetDxfs() const;
- /** Returns the op-code mapping */
- ScCompiler::OpCodeMapPtr GetOpCodeMap() const;
/** Is called when export filter starts to create the Excel document (all BIFF versions). */
void InitializeConvert();
diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx
index 8d58c8d..8d137ea 100644
--- a/sc/source/filter/inc/xestream.hxx
+++ b/sc/source/filter/inc/xestream.hxx
@@ -34,7 +34,6 @@
#include "xlstream.hxx"
#include "xestring.hxx"
-#include "compiler.hxx"
#include <filter/msfilter/mscodec.hxx>
#include <vector>
@@ -285,8 +284,7 @@ public:
static OUString ToOUString( const char* s );
static OUString ToOUString( const ScfUInt16Vec& rBuffer, sal_Int32 nStart = 0, sal_Int32 nLength = -1 );
- static OUString ToOUString( ScDocument& rDocument, const ScAddress& rAddress,
- const ScTokenArray* pTokenArray, const ScCompiler::OpCodeMapPtr & xOpCodeMap );
+ static OUString ToOUString( ScDocument& rDocument, const ScAddress& rAddress, const ScTokenArray* pTokenArray );
static OUString ToOUString( const XclExpString& s );
static const char* ToPsz( bool b );
diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
index f4e4ff3..bcfab7b 100644
--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx
+++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx
@@ -984,8 +984,7 @@ static void lcl_WriteCell( XclExpXmlStream& rStrm, sal_Int32 nElement, const ScA
FSEND );
pStream->writeEscaped( XclXmlUtils::ToOUString(
*pData->mpFormulaCell->GetDocument(),
- pData->mpFormulaCell->aPos, pData->mpFormulaCell->GetCode(),
- rStrm.GetRoot().GetOpCodeMap() ) );
+ pData->mpFormulaCell->aPos, pData->mpFormulaCell->GetCode()));
pStream->endElement( XML_f );
break;
case EXC_CHTR_TYPE_STRING:
commit 5f5cce2ca3ed6aa05bdaa4cdb046efeb6904d9a3
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Mon Mar 10 13:18:01 2014 -0400
fdo#75950: Add test for this.
Change-Id: I92253daf4793b50eb2928a1e368fa6231d2f285a
diff --git a/sc/qa/unit/data/xlsx/shared-formula/3d-reference.xlsx b/sc/qa/unit/data/xlsx/shared-formula/3d-reference.xlsx
new file mode 100644
index 0000000..2fb95b5
Binary files /dev/null and b/sc/qa/unit/data/xlsx/shared-formula/3d-reference.xlsx differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index f2f653b..5eb4eca 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -88,6 +88,7 @@ public:
void testCellBordersXLSX();
void testSharedFormulaExportXLS();
+ void testSharedFormulaExportXLSX();
CPPUNIT_TEST_SUITE(ScExportTest);
CPPUNIT_TEST(test);
@@ -113,6 +114,7 @@ public:
CPPUNIT_TEST(testCellBordersXLS);
CPPUNIT_TEST(testCellBordersXLSX);
CPPUNIT_TEST(testSharedFormulaExportXLS);
+ CPPUNIT_TEST(testSharedFormulaExportXLSX);
CPPUNIT_TEST_SUITE_END();
@@ -1175,6 +1177,78 @@ void ScExportTest::testSharedFormulaExportXLS()
xDocSh2->DoClose();
}
+void ScExportTest::testSharedFormulaExportXLSX()
+{
+ struct
+ {
+ bool checkContent( ScDocument* pDoc )
+ {
+ // B2:B7 should show 1,2,3,4,5,6.
+ double fExpected = 1.0;
+ for (SCROW i = 1; i <= 6; ++i, ++fExpected)
+ {
+ ScAddress aPos(1,i,0);
+ double fVal = pDoc->GetValue(aPos);
+ if (fVal != fExpected)
+ {
+ cerr << "Wrong value in B" << (i+1) << ": expected=" << fExpected << ", actual=" << fVal << endl;
+ return false;
+ }
+ }
+
+ // C2:C7 should show 10,20,....,60.
+ fExpected = 10.0;
+ for (SCROW i = 1; i <= 6; ++i, fExpected+=10.0)
+ {
+ ScAddress aPos(2,i,0);
+ double fVal = pDoc->GetValue(aPos);
+ if (fVal != fExpected)
+ {
+ cerr << "Wrong value in C" << (i+1) << ": expected=" << fExpected << ", actual=" << fVal << endl;
+ return false;
+ }
+ }
+
+ // D2:D7 should show 1,2,...,6.
+ fExpected = 1.0;
+ for (SCROW i = 1; i <= 6; ++i, ++fExpected)
+ {
+ ScAddress aPos(3,i,0);
+ double fVal = pDoc->GetValue(aPos);
+ if (fVal != fExpected)
+ {
+ cerr << "Wrong value in D" << (i+1) << ": expected=" << fExpected << ", actual=" << fVal << endl;
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ } aTest;
+
+ ScDocShellRef xDocSh = loadDoc("shared-formula/3d-reference.", XLSX);
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocSh.Is());
+ ScDocument* pDoc = xDocSh->GetDocument();
+ pDoc->CalcAll(); // Recalculate to flush all cached results.
+
+ bool bRes = aTest.checkContent(pDoc);
+ CPPUNIT_ASSERT_MESSAGE("Content check on the initial document failed.", bRes);
+
+ // Save and reload, and check the content again.
+ ScDocShellRef xDocSh2 = saveAndReload(xDocSh, XLSX);
+ xDocSh->DoClose();
+
+ CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocSh2.Is());
+ pDoc = xDocSh2->GetDocument();
+ pDoc->CalcAll(); // Recalculate to flush all cached results.
+
+ bRes = aTest.checkContent(pDoc);
+ CPPUNIT_ASSERT_MESSAGE("Content check on the reloaded document failed.", bRes);
+
+ xDocSh2->DoClose();
+}
+
ScExportTest::ScExportTest()
: ScBootstrapFixture("/sc/qa/unit/data")
{
More information about the Libreoffice-commits
mailing list