Hello,

this patch removes entries like #REF! A1:A3 for named ranges when the sheet
referenced by the named range is no longer there. I implemented Regina's
first suggestion because I don't see a way to implement the other version
with our current formula api.

All in all this should be quite a save fix since I only added checks that
the ScTokenArray contains no error and that the reference is valid.

Regards,
Markus
From dd98777c8916ff0e9b955295338a2fea0f390759 Mon Sep 17 00:00:00 2001
From: Markus Mohrhard <markus.mohrh...@googlemail.com>
Date: Tue, 9 Aug 2011 04:31:35 +0200
Subject: [PATCH] fix for fdo#37391: don't write invalid references to file

---
 sc/inc/rangenam.hxx               |    2 +-
 sc/source/core/tool/rangenam.cxx  |    2 +-
 sc/source/filter/xml/xmlexprt.cxx |   25 ++++++++++++++++++++++---
 3 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx
index 5d3ff49..543d727 100644
--- a/sc/inc/rangenam.hxx
+++ b/sc/inc/rangenam.hxx
@@ -119,7 +119,7 @@ public:
     sal_uInt16    GetIndex() const                { return nIndex; }
     ScTokenArray*   GetCode()                       { return pCode; }
     const ScTokenArray* GetCode() const             { return pCode; }
-    sal_uInt16          GetErrCode();
+    sal_uInt16          GetErrCode() const;
     sal_Bool            HasReferences() const;
     void            SetDocument( ScDocument* pDocument){ pDoc = pDocument; }
     ScDocument*     GetDocument() const             { return pDoc; }
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx
index 9b19fbf..c79457a 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -521,7 +521,7 @@ SCCOL ScRangeData::GetMaxCol() const
 }
 
 
-sal_uInt16 ScRangeData::GetErrCode()
+sal_uInt16 ScRangeData::GetErrCode() const
 {
     return pCode ? pCode->GetCodeError() : 0;
 }
diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx
index 5ef06cf..c8123e8 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -2856,8 +2856,16 @@ void ScXMLExport::WriteTable(sal_Int32 nTable, const Reference<sheet::XSpreadshe
                 AddAttribute(XML_NAMESPACE_TABLE, XML_BASE_CELL_ADDRESS, aStr);
 
                 // expression
-                itr->GetSymbol(aStr, pDoc->GetStorageGrammar());
-                AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, aStr);
+                if (itr->GetErrCode())
+                {
+                    aStr = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[#REF!]"));
+                    AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, aStr);
+                }
+                else
+                {
+                    itr->GetSymbol(aStr, pDoc->GetStorageGrammar());
+                    AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, aStr);
+                }
 
                 SvXMLElementExport aElemNR(*this, XML_NAMESPACE_TABLE, XML_NAMED_EXPRESSION, sal_True, sal_True);
             }
@@ -3808,7 +3816,18 @@ void ScXMLExport::WriteNamedExpressions(const com::sun::star::uno::Reference <co
         }
         else
         {
-            AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, sOUTempContent);
+            ScRange aRange;
+            if (pNamedRange->GetErrCode() || !pNamedRange->IsValidReference(aRange))
+            {
+                rtl::OUString aStr(RTL_CONSTASCII_USTRINGPARAM("[#REF!]"));
+                AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, aStr);
+            }
+            else
+            {
+                rtl::OUString aStr;
+                pNamedRange->GetSymbol(aStr, pDoc->GetStorageGrammar());
+                AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, aStr);
+            }
             SvXMLElementExport aElemNE(*this, XML_NAMESPACE_TABLE, XML_NAMED_EXPRESSION, sal_True, sal_True);
         }
     }
-- 
1.7.3.4

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to