sc/qa/unit/data/xlsx/empty-noconf.xlsx |binary sc/qa/unit/data/xlsx/empty.xlsx |binary sc/qa/unit/subsequent_export-test.cxx | 61 ++++++++++++++++++++++++++++++++ sc/qa/unit/ucalc_formula.cxx | 6 +-- sc/source/core/tool/interpr1.cxx | 7 +-- sc/source/filter/oox/workbookhelper.cxx | 10 +++++ sc/source/filter/xml/xmlimprt.cxx | 17 ++++++++ sc/source/filter/xml/xmlimprt.hxx | 1 8 files changed, 95 insertions(+), 7 deletions(-)
New commits: commit a54f0d6c980b880854458b7c685c04632acf91ac Author: Katarina Behrens <katarina.behr...@cib.de> Date: Tue Sep 29 15:45:22 2015 +0200 tdf#93688: Set CalcA1|ExcelA1 syntax only for imported docs those whose string ref syntax is unknown or can't be guessed i.e. don't use it for new documents (prefer user settings in that case) Conflicts: sc/qa/unit/subsequent_export-test.cxx Change-Id: I1355031cdd63e2a5c50064531011be71ae7f7b8f Reviewed-on: https://gerrit.libreoffice.org/19244 Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Eike Rathke <er...@redhat.com> diff --git a/sc/qa/unit/data/xlsx/empty-noconf.xlsx b/sc/qa/unit/data/xlsx/empty-noconf.xlsx new file mode 100644 index 0000000..21f80b4 Binary files /dev/null and b/sc/qa/unit/data/xlsx/empty-noconf.xlsx differ diff --git a/sc/qa/unit/data/xlsx/empty.xlsx b/sc/qa/unit/data/xlsx/empty.xlsx new file mode 100644 index 0000000..c186485 Binary files /dev/null and b/sc/qa/unit/data/xlsx/empty.xlsx differ diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index a8e0f30..b21b4aa 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -148,6 +148,8 @@ public: void testMoveCellAnchoredShapes(); void testHeaderImage(); void testMatrixMultiplication(); + void testRefStringXLSX(); + void testRefStringConfigXLSX(); CPPUNIT_TEST_SUITE(ScExportTest); @@ -206,6 +208,8 @@ public: CPPUNIT_TEST(testMoveCellAnchoredShapes); CPPUNIT_TEST(testHeaderImage); CPPUNIT_TEST(testMatrixMultiplication); + CPPUNIT_TEST(testRefStringXLSX); + CPPUNIT_TEST(testRefStringConfigXLSX); CPPUNIT_TEST_SUITE_END(); @@ -2854,6 +2858,63 @@ void ScExportTest::testMatrixMultiplication() xDocSh->DoClose(); } +void ScExportTest::testRefStringXLSX() +{ + ScDocShellRef xDocSh = loadDoc("ref_string.", XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to open doc", xDocSh.Is()); + + //make sure ref syntax gets saved for MSO-produced docs + xDocSh = saveAndReload( &(*xDocSh), XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to reload doc", xDocSh.Is()); + + ScDocument& rDoc = xDocSh->GetDocument(); + ScCalcConfig aCalcConfig = rDoc.GetCalcConfig(); + CPPUNIT_ASSERT_EQUAL(formula::FormulaGrammar::CONV_XL_A1, aCalcConfig.meStringRefAddressSyntax); + + xDocSh->DoClose(); +} + +void ScExportTest::testRefStringConfigXLSX() +{ + // this doc is configured with CalcA1 ref syntax + ScDocShellRef xDocSh = loadDoc("empty.", XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to open doc", xDocSh.Is()); + + xDocSh = saveAndReload( &(*xDocSh), XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to reload doc", xDocSh.Is()); + + ScDocument& rDoc = xDocSh->GetDocument(); + ScCalcConfig aConfig = rDoc.GetCalcConfig(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match", formula::FormulaGrammar::CONV_OOO, + aConfig.meStringRefAddressSyntax); + + // this doc has no entry for ref syntax + xDocSh = loadDoc("empty-noconf.", XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to open 2nd doc", xDocSh.Is()); + + ScDocument& rDoc2 = xDocSh->GetDocument(); + aConfig = rDoc2.GetCalcConfig(); + // therefore after import, ref syntax should be set to CalcA1 | ExcelA1 + CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match", formula::FormulaGrammar::CONV_A1_XL_A1, + aConfig.meStringRefAddressSyntax); + + //set ref syntax to something else than ExcelA1 (native to xlsx format) ... + aConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_R1C1; + rDoc2.SetCalcConfig( aConfig ); + + ScDocShellRef xNewDocSh = saveAndReload( &(*xDocSh), XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to reload 2nd doc", xNewDocSh.Is()); + + // ... and make sure it got saved + ScDocument& rDoc3 = xNewDocSh->GetDocument(); + aConfig = rDoc3.GetCalcConfig(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("String ref syntax doesn't match", formula::FormulaGrammar::CONV_XL_R1C1, + aConfig.meStringRefAddressSyntax); + + xDocSh->DoClose(); + xNewDocSh->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/qa/unit/ucalc_formula.cxx b/sc/qa/unit/ucalc_formula.cxx index 5a84e56..6c593a5 100644 --- a/sc/qa/unit/ucalc_formula.cxx +++ b/sc/qa/unit/ucalc_formula.cxx @@ -4232,10 +4232,10 @@ void Test::testFuncINDIRECT() m_pDoc->CalcAll(); { - // Default is to use compatibility mode, accept both Calc A1 and - // Excel A1 syntax + // Default (for new documents) is to use current formula syntax + // which is Calc A1 const OUString* aChecks[] = { - &aTest, &aTest, &aRefErr, &aTest + &aTest, &aRefErr, &aRefErr, &aTest }; for (size_t i = 0; i < SAL_N_ELEMENTS(aChecks); ++i) diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 68802ae..13e764d 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -7032,10 +7032,9 @@ void ScInterpreter::ScIndirect() // Use the current address syntax if unspecified. eConv = pDok->GetAddressConvention(); - // either CONV_A1_XL_A1 was explicitly configured, or nothing at all - // was configured - bool bTryXlA1 = (eConv == FormulaGrammar::CONV_A1_XL_A1 || - !maCalcConfig.mbHasStringRefSyntax); + // either CONV_A1_XL_A1 was explicitly configured, or it wasn't possible + // to determine which syntax to use during doc import + bool bTryXlA1 = (eConv == FormulaGrammar::CONV_A1_XL_A1); if (nParamCount == 2 && 0.0 == ::rtl::math::approxFloor( GetDouble())) { diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index fc080cc..2573a39 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -797,6 +797,16 @@ void WorkbookHelper::finalizeWorkbookImport() sheets. Automatic numbering is set by passing the value 0. */ PropertySet aDefPageStyle( getStyleObject( "Default", true ) ); aDefPageStyle.setProperty< sal_Int16 >( PROP_FirstPageNumber, 0 ); + + // Has any string ref syntax been imported? + // If not, we need to take action + ScCalcConfig aCalcConfig = getScDocument().GetCalcConfig(); + + if ( !aCalcConfig.mbHasStringRefSyntax ) + { + aCalcConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_A1_XL_A1; + getScDocument().SetCalcConfig(aCalcConfig); + } } // document model ------------------------------------------------------------- diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index 226a27c..d1bb299 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -3180,6 +3180,22 @@ void ScXMLImport::SetSheetNamedRanges() } } +void ScXMLImport::SetStringRefSyntaxIfMissing() +{ + if (!pDoc) + return; + + ScCalcConfig aCalcConfig = pDoc->GetCalcConfig(); + + // Has any string ref syntax been imported? + // If not, we need to take action + if ( !aCalcConfig.mbHasStringRefSyntax ) + { + aCalcConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_A1_XL_A1; + pDoc->SetCalcConfig(aCalcConfig); + } +} + void SAL_CALL ScXMLImport::endDocument() throw(::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeException, @@ -3226,6 +3242,7 @@ void SAL_CALL ScXMLImport::endDocument() SetLabelRanges(); SetNamedRanges(); SetSheetNamedRanges(); + SetStringRefSyntaxIfMissing(); if (mpPivotSources) // Process pivot table sources after the named ranges have been set. mpPivotSources->process(); diff --git a/sc/source/filter/xml/xmlimprt.hxx b/sc/source/filter/xml/xmlimprt.hxx index c26a710..97291ae 100644 --- a/sc/source/filter/xml/xmlimprt.hxx +++ b/sc/source/filter/xml/xmlimprt.hxx @@ -1219,6 +1219,7 @@ public: void SetSheetNamedRanges(); void SetLabelRanges(); void AddDefaultNote( const com::sun::star::table::CellAddress& aCell ); + void SetStringRefSyntaxIfMissing(); /** Extracts the formula string, the formula grammar namespace URL, and a grammar enum value from the passed formula attribute value. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits