sc/source/filter/xml/xmlimprt.cxx |   21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

New commits:
commit 5a1bd80e0d685bbd76de2ebfaa1c6b0380d528f4
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Thu Sep 8 20:55:03 2022 +0200
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Fri Sep 9 16:00:54 2022 +0200

    Related: tdf#150312 "Repair" broken table:base-cell-address of defined names
    
    ... to not lose them entirely, though this may shift relative
    addressing, which may be equally bad because there is no
    indication and can go unnoticed. Most defined ranges use absolute
    addressing though and formula expressions are rarely affected.
    
    Change-Id: If57ff9274e673a4eb43c656698f6ed43e8415458
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139706
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins

diff --git a/sc/source/filter/xml/xmlimprt.cxx 
b/sc/source/filter/xml/xmlimprt.cxx
index b72cf35ffcf1..5f654392c478 100644
--- a/sc/source/filter/xml/xmlimprt.cxx
+++ b/sc/source/filter/xml/xmlimprt.cxx
@@ -1258,10 +1258,11 @@ class RangeNameInserter
 {
     ScDocument&  mrDoc;
     ScRangeName& mrRangeName;
+    SCTAB        mnTab;
 
 public:
-    RangeNameInserter(ScDocument& rDoc, ScRangeName& rRangeName) :
-        mrDoc(rDoc), mrRangeName(rRangeName) {}
+    RangeNameInserter(ScDocument& rDoc, ScRangeName& rRangeName, SCTAB nTab) :
+        mrDoc(rDoc), mrRangeName(rRangeName), mnTab(nTab) {}
 
     void operator() (const ScMyNamedExpression& p) const
     {
@@ -1282,6 +1283,17 @@ public:
         bool bSuccess = ScRangeStringConverter::GetAddressFromString(
             aPos, p.sBaseCellAddress, mrDoc, FormulaGrammar::CONV_OOO, 
nOffset);
 
+        if (!bSuccess)
+        {
+            SAL_WARN("sc.filter", "No conversion from table:base-cell-address 
'" << p.sBaseCellAddress
+                    << "' for name '" << p.sName << "' on sheet " << mnTab);
+            // Do not lose the defined name. Relative addressing in
+            // content/expression, if any, will be broken though.
+            // May had happened due to tdf#150312.
+            aPos.SetTab(mnTab < 0 ? 0 : mnTab);
+            bSuccess = true;
+        }
+
         if (bSuccess)
         {
             OUString aContent = p.sContent;
@@ -1307,7 +1319,8 @@ void ScXMLImport::SetNamedRanges()
 
     // Insert the namedRanges
     ScRangeName* pRangeNames = pDoc->GetRangeName();
-    ::std::for_each(m_aMyNamedExpressions.begin(), 
m_aMyNamedExpressions.end(), RangeNameInserter(*pDoc, *pRangeNames));
+    ::std::for_each(m_aMyNamedExpressions.begin(), m_aMyNamedExpressions.end(),
+            RangeNameInserter(*pDoc, *pRangeNames, -1));
 }
 
 void ScXMLImport::SetSheetNamedRanges()
@@ -1323,7 +1336,7 @@ void ScXMLImport::SetSheetNamedRanges()
             continue;
 
         const ScMyNamedExpressions& rNames = itr.second;
-        ::std::for_each(rNames.begin(), rNames.end(), RangeNameInserter(*pDoc, 
*pRangeNames));
+        ::std::for_each(rNames.begin(), rNames.end(), RangeNameInserter(*pDoc, 
*pRangeNames, nTab));
     }
 }
 

Reply via email to