sc/source/filter/excel/xetable.cxx |  113 +++++++++++++++++++++----------------
 1 file changed, 67 insertions(+), 46 deletions(-)

New commits:
commit f501fe4da88e1d64fcc88a492a52911113d28f6a
Author: Eike Rathke <er...@redhat.com>
Date:   Tue Sep 15 15:13:43 2015 +0200

    do not write MM_REFERENCE formulas to OOXML, tdf#61908 follow-up
    
    The array range is covered by MM_FORMULA.
    Excel even complained when loading such a document.
    
    Change-Id: I10e1b19fbfb8ea849ffe3d46504fdf3389633c5f

diff --git a/sc/source/filter/excel/xetable.cxx 
b/sc/source/filter/excel/xetable.cxx
index 9437d8c..c30334a 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -932,60 +932,81 @@ void XclExpFormulaCell::SaveXml( XclExpXmlStream& rStrm )
             // OOXTODO: XML_cm, XML_vm, XML_ph
             FSEND );
 
+    bool bWriteFormula = true;
     bool bTagStarted = false;
-    ScAddress aScPos( static_cast< SCCOL >( GetXclPos().mnCol ), static_cast< 
SCROW >( GetXclPos().mnRow ), rStrm.GetRoot().GetCurrScTab() );
+    ScAddress aScPos( static_cast< SCCOL >( GetXclPos().mnCol ),
+            static_cast< SCROW >( GetXclPos().mnRow ), 
rStrm.GetRoot().GetCurrScTab() );
 
-    if ( mrScFmlaCell.GetMatrixFlag() == MM_FORMULA)
+    switch (mrScFmlaCell.GetMatrixFlag())
     {
-        // origin of the matrix - find the used matrix range
-        SCCOL nMatWidth;
-        SCROW nMatHeight;
-        mrScFmlaCell.GetMatColsRows( nMatWidth, nMatHeight );
-        OSL_ENSURE( nMatWidth && nMatHeight, 
"XclExpFormulaCell::XclExpFormulaCell - empty matrix" );
-        ScRange aMatScRange( aScPos );
-        ScAddress& rMatEnd = aMatScRange.aEnd;
-        rMatEnd.IncCol( static_cast< SCsCOL >( nMatWidth - 1 ) );
-        rMatEnd.IncRow( static_cast< SCsROW >( nMatHeight - 1 ) );
-        // reduce to valid range (range keeps valid, because start position IS 
valid
-        rStrm.GetRoot().GetAddressConverter().ValidateRange( aMatScRange, true 
);
-
-        OStringBuffer sFmlaCellRange;
-        if (ValidRange(aMatScRange))
-        {
-            // calculate the cell range.
-            sFmlaCellRange.append(XclXmlUtils::ToOString( 
rStrm.GetRoot().GetStringBuf(), aMatScRange.aStart ).getStr());
-            sFmlaCellRange.append(":");
-            sFmlaCellRange.append(XclXmlUtils::ToOString( 
rStrm.GetRoot().GetStringBuf(), aMatScRange.aEnd ).getStr());
-        }
+        case MM_NONE:
+            break;
+        case MM_REFERENCE:
+            bWriteFormula = false;
+            break;
+        case MM_FORMULA:
+        case MM_FAKE:
+            {
+                // origin of the matrix - find the used matrix range
+                SCCOL nMatWidth;
+                SCROW nMatHeight;
+                mrScFmlaCell.GetMatColsRows( nMatWidth, nMatHeight );
+                OSL_ENSURE( nMatWidth && nMatHeight, 
"XclExpFormulaCell::XclExpFormulaCell - empty matrix" );
+                ScRange aMatScRange( aScPos );
+                ScAddress& rMatEnd = aMatScRange.aEnd;
+                rMatEnd.IncCol( static_cast< SCsCOL >( nMatWidth - 1 ) );
+                rMatEnd.IncRow( static_cast< SCsROW >( nMatHeight - 1 ) );
+                // reduce to valid range (range keeps valid, because start 
position IS valid
+                rStrm.GetRoot().GetAddressConverter().ValidateRange( 
aMatScRange, true );
+
+                OStringBuffer sFmlaCellRange;
+                if (ValidRange(aMatScRange))
+                {
+                    // calculate the cell range.
+                    sFmlaCellRange.append( XclXmlUtils::ToOString(
+                                rStrm.GetRoot().GetStringBuf(), 
aMatScRange.aStart ).getStr());
+                    sFmlaCellRange.append(":");
+                    sFmlaCellRange.append( XclXmlUtils::ToOString(
+                                rStrm.GetRoot().GetStringBuf(), 
aMatScRange.aEnd ).getStr());
+                }
 
-        if (aMatScRange.aStart.Col() == GetXclPos().mnCol && 
aMatScRange.aStart.Row() == static_cast<SCROW>(GetXclPos().mnRow))
+                if (    aMatScRange.aStart.Col() == GetXclPos().mnCol &&
+                        aMatScRange.aStart.Row() == 
static_cast<SCROW>(GetXclPos().mnRow))
+                {
+                    rWorksheet->startElement( XML_f,
+                            XML_aca, XclXmlUtils::ToPsz( (mxTokArr && 
mxTokArr->IsVolatile()) ||
+                                (mxAddRec && mxAddRec->IsVolatile())),
+                            XML_t, mxAddRec ? "array" : NULL,
+                            XML_ref, !sFmlaCellRange.isEmpty()? 
sFmlaCellRange.getStr() : NULL,
+                            // OOXTODO: XML_dt2D,   bool
+                            // OOXTODO: XML_dtr,    bool
+                            // OOXTODO: XML_del1,   bool
+                            // OOXTODO: XML_del2,   bool
+                            // OOXTODO: XML_r1,     ST_CellRef
+                            // OOXTODO: XML_r2,     ST_CellRef
+                            // OOXTODO: XML_ca,     bool
+                            // OOXTODO: XML_si,     uint
+                            // OOXTODO: XML_bx      bool
+                            FSEND );
+                    bTagStarted = true;
+                }
+            }
+            break;
+    }
+
+    if (bWriteFormula)
+    {
+        if (!bTagStarted)
         {
             rWorksheet->startElement( XML_f,
-                        XML_aca,    XclXmlUtils::ToPsz( (mxTokArr && 
mxTokArr->IsVolatile()) || (mxAddRec && mxAddRec->IsVolatile()) ),
-                        XML_t, mxAddRec ? "array" : NULL,
-                        XML_ref, !sFmlaCellRange.isEmpty()? 
sFmlaCellRange.getStr() : NULL,
-                        // OOXTODO: XML_dt2D,   bool
-                        // OOXTODO: XML_dtr,    bool
-                        // OOXTODO: XML_del1,   bool
-                        // OOXTODO: XML_del2,   bool
-                        // OOXTODO: XML_r1,     ST_CellRef
-                        // OOXTODO: XML_r2,     ST_CellRef
-                        // OOXTODO: XML_ca,     bool
-                        // OOXTODO: XML_si,     uint
-                        // OOXTODO: XML_bx      bool
-                        FSEND );
-            bTagStarted = true;
+                    XML_aca, XclXmlUtils::ToPsz( (mxTokArr && 
mxTokArr->IsVolatile()) ||
+                        (mxAddRec && mxAddRec->IsVolatile()) ),
+                    FSEND );
         }
+        rWorksheet->writeEscaped( XclXmlUtils::ToOUString(
+                    rStrm.GetRoot().GetCompileFormulaContext(), 
mrScFmlaCell.aPos, mrScFmlaCell.GetCode()));
+        rWorksheet->endElement( XML_f );
     }
-    if (!bTagStarted)
-    {
-        rWorksheet->startElement( XML_f,
-                                  XML_aca,    XclXmlUtils::ToPsz( (mxTokArr && 
mxTokArr->IsVolatile()) || (mxAddRec && mxAddRec->IsVolatile()) ),
-                                  FSEND );
-    }
-    rWorksheet->writeEscaped( XclXmlUtils::ToOUString(
-        rStrm.GetRoot().GetCompileFormulaContext(), mrScFmlaCell.aPos, 
mrScFmlaCell.GetCode()));
-    rWorksheet->endElement( XML_f );
 
     if( strcmp( sType, "inlineStr" ) == 0 )
     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to