Kaydet (Commit) f501fe4d authored tarafından Eike Rathke's avatar Eike Rathke

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
üst 00e0ce3f
...@@ -932,60 +932,81 @@ void XclExpFormulaCell::SaveXml( XclExpXmlStream& rStrm ) ...@@ -932,60 +932,81 @@ void XclExpFormulaCell::SaveXml( XclExpXmlStream& rStrm )
// OOXTODO: XML_cm, XML_vm, XML_ph // OOXTODO: XML_cm, XML_vm, XML_ph
FSEND ); FSEND );
bool bWriteFormula = true;
bool bTagStarted = false; 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 case MM_NONE:
SCCOL nMatWidth; break;
SCROW nMatHeight; case MM_REFERENCE:
mrScFmlaCell.GetMatColsRows( nMatWidth, nMatHeight ); bWriteFormula = false;
OSL_ENSURE( nMatWidth && nMatHeight, "XclExpFormulaCell::XclExpFormulaCell - empty matrix" ); break;
ScRange aMatScRange( aScPos ); case MM_FORMULA:
ScAddress& rMatEnd = aMatScRange.aEnd; case MM_FAKE:
rMatEnd.IncCol( static_cast< SCsCOL >( nMatWidth - 1 ) ); {
rMatEnd.IncRow( static_cast< SCsROW >( nMatHeight - 1 ) ); // origin of the matrix - find the used matrix range
// reduce to valid range (range keeps valid, because start position IS valid SCCOL nMatWidth;
rStrm.GetRoot().GetAddressConverter().ValidateRange( aMatScRange, true ); SCROW nMatHeight;
mrScFmlaCell.GetMatColsRows( nMatWidth, nMatHeight );
OStringBuffer sFmlaCellRange; OSL_ENSURE( nMatWidth && nMatHeight, "XclExpFormulaCell::XclExpFormulaCell - empty matrix" );
if (ValidRange(aMatScRange)) ScRange aMatScRange( aScPos );
{ ScAddress& rMatEnd = aMatScRange.aEnd;
// calculate the cell range. rMatEnd.IncCol( static_cast< SCsCOL >( nMatWidth - 1 ) );
sFmlaCellRange.append(XclXmlUtils::ToOString( rStrm.GetRoot().GetStringBuf(), aMatScRange.aStart ).getStr()); rMatEnd.IncRow( static_cast< SCsROW >( nMatHeight - 1 ) );
sFmlaCellRange.append(":"); // reduce to valid range (range keeps valid, because start position IS valid
sFmlaCellRange.append(XclXmlUtils::ToOString( rStrm.GetRoot().GetStringBuf(), aMatScRange.aEnd ).getStr()); 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, rWorksheet->startElement( XML_f,
XML_aca, XclXmlUtils::ToPsz( (mxTokArr && mxTokArr->IsVolatile()) || (mxAddRec && mxAddRec->IsVolatile()) ), XML_aca, XclXmlUtils::ToPsz( (mxTokArr && mxTokArr->IsVolatile()) ||
XML_t, mxAddRec ? "array" : NULL, (mxAddRec && mxAddRec->IsVolatile()) ),
XML_ref, !sFmlaCellRange.isEmpty()? sFmlaCellRange.getStr() : NULL, FSEND );
// 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;
} }
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 ) if( strcmp( sType, "inlineStr" ) == 0 )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment