summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorAndreas Heinisch <andreas.heinisch@yahoo.de>2021-03-17 10:33:05 +0100
committerEike Rathke <erack@redhat.com>2021-03-29 20:18:24 +0200
commit1bdef3250fc57ea3f9b69a1f55ceb035329b6fa9 (patch)
treea196916f8bdc475124f10cadffd0cd3c3475a512 /sc
parent7da7f6ca37c92ab33e34a76fd25efab526b7c80a (diff)
tdf#138646 - consider the document's address convention
When accessing a named range using getCellRangeByName, consider the document's address convention. Otherwise, an exception is raised, when the formula syntax is EXCEL R1C1 or EXCEL A1. Change-Id: I5df2546f1c3fd00ff30cb057dcf47f6bb01d501d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112602 Tested-by: Jenkins Reviewed-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/qa/extras/macros-test.cxx49
-rw-r--r--sc/qa/extras/testdocuments/tdf138646.odsbin0 -> 13577 bytes
-rw-r--r--sc/source/core/tool/rangeutl.cxx4
3 files changed, 52 insertions, 1 deletions
diff --git a/sc/qa/extras/macros-test.cxx b/sc/qa/extras/macros-test.cxx
index 14cb8c6d8101..06f921ca35e9 100644
--- a/sc/qa/extras/macros-test.cxx
+++ b/sc/qa/extras/macros-test.cxx
@@ -55,6 +55,7 @@ public:
void testTdf43003();
void testTdf133887();
void testTdf133889();
+ void testTdf138646();
CPPUNIT_TEST_SUITE(ScMacrosTest);
CPPUNIT_TEST(testStarBasic);
@@ -77,6 +78,7 @@ public:
CPPUNIT_TEST(testTdf43003);
CPPUNIT_TEST(testTdf133887);
CPPUNIT_TEST(testTdf133889);
+ CPPUNIT_TEST(testTdf138646);
CPPUNIT_TEST_SUITE_END();
};
@@ -976,6 +978,53 @@ void ScMacrosTest::testTdf133889()
xCloseable->close(true);
}
+void ScMacrosTest::testTdf138646()
+{
+ OUString aFileName;
+ createFileURL(u"tdf138646.ods", aFileName);
+ auto xComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument");
+ CPPUNIT_ASSERT_MESSAGE("Failed to load the doc", xComponent.is());
+
+ SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(xComponent);
+ CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell);
+
+ ScDocShell* pDocSh = dynamic_cast<ScDocShell*>(pFoundShell);
+ CPPUNIT_ASSERT(pDocSh);
+
+ // Without the fix in place, changing the grammar from GRAM_NATIVE to either GRAM_NATIVE_XL_A1
+ // or GRAM_NATIVE_XL_R1C1 would cause a Basic exception/error in the following script.
+ pDocSh->GetDocument().SetGrammar(formula::FormulaGrammar::Grammar::GRAM_NATIVE_XL_R1C1);
+
+ const std::vector<std::pair<OUString, OUString>> aTests({
+ { "GlobalNamedCell", "GlobalNamedCell" },
+ { "GlobalNamedCellSheet", "GlobalNamedCell" },
+ { "LocalNamedCell", "LocalNamedCell" },
+ { "LocalNamedCellAccessError", "Exception" }
+ });
+
+ {
+ Any aRet;
+ Sequence<sal_Int16> aOutParamIndex;
+ Sequence<Any> aOutParam;
+ Sequence<uno::Any> aParams;
+
+ for (auto& [sTestName, sExpected] : aTests)
+ {
+ SfxObjectShell::CallXScript(xComponent,
+ "vnd.sun.Star.script:Standard.Module1." + sTestName
+ + "?language=Basic&location=document",
+ aParams, aRet, aOutParamIndex, aOutParam);
+
+ OUString aReturnValue;
+ aRet >>= aReturnValue;
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sTestName.toUtf8().getStr(), sExpected, aReturnValue);
+ }
+ }
+
+ pDocSh->DoClose();
+}
+
+
ScMacrosTest::ScMacrosTest()
: UnoApiTest("/sc/qa/extras/testdocuments")
{
diff --git a/sc/qa/extras/testdocuments/tdf138646.ods b/sc/qa/extras/testdocuments/tdf138646.ods
new file mode 100644
index 000000000000..9faa95a54334
--- /dev/null
+++ b/sc/qa/extras/testdocuments/tdf138646.ods
Binary files differ
diff --git a/sc/source/core/tool/rangeutl.cxx b/sc/source/core/tool/rangeutl.cxx
index 401ad6ad5722..1a7467fbb0ec 100644
--- a/sc/source/core/tool/rangeutl.cxx
+++ b/sc/source/core/tool/rangeutl.cxx
@@ -276,7 +276,9 @@ bool ScRangeUtil::MakeRangeFromName (
ScRefAddress aStartPos;
ScRefAddress aEndPos;
- pData->GetSymbol( aStrArea );
+ // tdf#138646 - consider the current grammar and address convention of the document
+ pData->GetSymbol(aStrArea,
+ FormulaGrammar::mergeToGrammar(rDoc.GetGrammar(), rDetails.eConv));
if ( IsAbsArea( aStrArea, rDoc, nTable,
nullptr, &aStartPos, &aEndPos, rDetails ) )