tdf#167689: Calc: add test for xmlMaps.xml

follow-up for https://gerrit.libreoffice.org/c/core/+/188451 (f84f8f2ea4)

- added a unittest for xmlMaps.xml and <xmlColumnPr>
- removed unused aContent variable.
  - this was causing the tests to fail to load the bugdoc during createScDoc("...")
- change Target="/xl/xmlMaps.xml" to Target="xmlMaps.xml" in xl/_rels/workbook.xml.rels
- change xmlns attribute to xmlns:x in xl/tables/table[n].xml
- add XmlColumnPrModel and TableColumnModel
  - these Models can be used for implementing sub-elements.

Signed-off-by: Bayram Çiçek <bayram.cicek@collabora.com>
Change-Id: I5e6ad575b7071f3cf4decb5d90d418b9c54ba107
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189044
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
This commit is contained in:
Bayram Çiçek
2025-08-20 09:52:57 +02:00
committed by Caolán McNamara
parent 3f3aed0045
commit 657f0112b5
9 changed files with 77 additions and 34 deletions
+18 -4
View File
@@ -49,12 +49,23 @@ struct TableColumnAttributes
};
// xmlColumnPr attributes
struct XmlColumnPrAttributes
struct XmlColumnPrModel
{
sal_uInt32 mnMapId;
OUString msXpath;
OUString msXmlDataType;
bool mbDenormalized;
explicit XmlColumnPrModel();
};
struct TableColumnModel
{
typedef std::unique_ptr<XmlColumnPrModel> XmlColumnPrModelPtr;
XmlColumnPrModelPtr mxXmlColumnPr; // Special settings for XML Column Properties.
XmlColumnPrModel& createXmlColumnPr();
explicit TableColumnModel();
};
/** Container base class to provide selected access for ScDBData. */
@@ -108,7 +119,7 @@ private:
::std::vector< OUString > maTableColumnNames; ///< names of table columns
::std::vector< TableColumnAttributes > maTableColumnAttributes; ///< attributes of table columns
::std::vector< XmlColumnPrAttributes > maXmlColumnPrAttributes; ///< attributes of <xmlColumnPr>
::std::vector< TableColumnModel > maTableColumnModel;
bool mbTableColumnNamesDirty;
SCSIZE nFilteredRowCount;
@@ -165,8 +176,11 @@ public:
SC_DLLPUBLIC const ::std::vector< OUString >& GetTableColumnNames() const { return maTableColumnNames; }
SC_DLLPUBLIC void SetTableColumnAttributes( ::std::vector< TableColumnAttributes >&& rAttributes );
SC_DLLPUBLIC const ::std::vector< TableColumnAttributes >& GetTableColumnAttributes() const { return maTableColumnAttributes; }
SC_DLLPUBLIC void SetXmlColumnPrAttributes( const XmlColumnPrAttributes& rAttributes );
SC_DLLPUBLIC const ::std::vector< XmlColumnPrAttributes >& GetXmlColumnPrAttributes() const { return maXmlColumnPrAttributes; }
SC_DLLPUBLIC void SetTableColumnModel( TableColumnModel& rModel )
{
maTableColumnModel.push_back(std::move(rModel));
}
SC_DLLPUBLIC const ::std::vector< TableColumnModel >& GetTableColumnModel() const { return maTableColumnModel; }
bool AreTableColumnNamesDirty() const { return mbTableColumnNamesDirty; }
/** Refresh/update the column names with the header row's cell contents. */
+22
View File
@@ -1646,6 +1646,28 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testTotalsRowFunction)
}
}
CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf167689_xmlMaps_and_xmlColumnPr)
{
createScDoc("xlsx/tdf167689_xmlMaps_and_xmlColumnPr.xlsx");
save(u"Calc Office Open XML"_ustr);
// xl/xmlMaps.xml
xmlDocUniquePtr pDocXml = parseExport(u"xl/xmlMaps.xml"_ustr);
CPPUNIT_ASSERT(pDocXml);
assertXPath(pDocXml,
"/x:MapInfo/Schema/xsd:schema/xsd:element/xsd:complexType/xsd:sequence/xsd:element/"
"xsd:complexType/xsd:sequence/xsd:element[3]/xsd:complexType/xsd:sequence/"
"xsd:element[1]",
"name", u"Code");
// test <xmlColumnPr> of xl/tables/table1.xml
xmlDocUniquePtr pDocXmlTables = parseExport(u"xl/tables/table1.xml"_ustr);
CPPUNIT_ASSERT(pDocXmlTables);
assertXPath(pDocXmlTables, "/x:table/x:tableColumns/x:tableColumn[1]/x:xmlColumnPr", "xpath",
u"/DataList/TransactionTypeList/TransactionType/Code");
}
CPPUNIT_TEST_FIXTURE(ScExportTest4, testAutofilterHiddenButton)
{
createScDoc("xlsx/hiddenButton.xlsx");
-5
View File
@@ -702,11 +702,6 @@ void ScDBData::SetTableColumnAttributes( ::std::vector< TableColumnAttributes >&
maTableColumnAttributes = std::move(rAttributes);
}
void ScDBData::SetXmlColumnPrAttributes( const XmlColumnPrAttributes& rAttributes )
{
maXmlColumnPrAttributes.push_back(rAttributes);
}
void ScDBData::AdjustTableColumnAttributes( UpdateRefMode eUpdateRefMode, SCCOL nDx, SCCOL nCol1,
SCCOL nOldCol1, SCCOL nOldCol2, SCCOL nNewCol1, SCCOL nNewCol2 )
{
+1 -1
View File
@@ -1279,7 +1279,7 @@ void ExcDocument::WriteXml( XclExpXmlStream& rStrm )
// save xl/xmlMaps.xml relationship into xl/_rels/workbook.xml.rels
// save xl/xmlMaps.xml reference into [Content_Types].xml and open stream to xl/xmlMaps.xml
sax_fastparser::FSHelperPtr aXmlMapsXml = rStrm.CreateOutputStream(
"xl/xmlMaps.xml", u"/xl/xmlMaps.xml", rStrm.GetCurrentStream()->getOutputStream(),
"xl/xmlMaps.xml", u"xmlMaps.xml", rStrm.GetCurrentStream()->getOutputStream(),
"application/xml", oox::getRelationship(Relationship::XMLMAPS));
// start exporting xl/xmlMaps.xml
+8 -8
View File
@@ -223,7 +223,7 @@ void XclExpTables::SaveTableXml( XclExpXmlStream& rStrm, const Entry& rEntry )
const std::vector< OUString >& rColNames = rData.GetTableColumnNames();
const std::vector< TableColumnAttributes >& rColAttributes = rData.GetTableColumnAttributes();
const std::vector< XmlColumnPrAttributes >& rXmlColPrAttributes = rData.GetXmlColumnPrAttributes();
const std::vector< TableColumnModel >& rTableColumnModel = rData.GetTableColumnModel();
if (!rColNames.empty())
{
pTableStrm->startElement(XML_tableColumns,
@@ -252,18 +252,18 @@ void XclExpTables::SaveTableXml( XclExpXmlStream& rStrm, const Entry& rEntry )
// OOXTODO: XML_uniqueName, ...
);
if (!rXmlColPrAttributes.empty() && (i < rXmlColPrAttributes.size()))
if (i < rTableColumnModel.size() && rTableColumnModel[i].mxXmlColumnPr)
{
// export <xmlColumnPr>
rtl::Reference<sax_fastparser::FastAttributeList> pXmlColumnPrAttrList
= sax_fastparser::FastSerializerHelper::createAttrList();
pXmlColumnPrAttrList->add(XML_mapId,
OUString::number(rXmlColPrAttributes[i].mnMapId));
pXmlColumnPrAttrList->add(XML_xpath, rXmlColPrAttributes[i].msXpath);
pXmlColumnPrAttrList->add(XML_xmlDataType, rXmlColPrAttributes[i].msXmlDataType);
pXmlColumnPrAttrList->add(XML_denormalized,
ToPsz10(rXmlColPrAttributes[i].mbDenormalized));
XmlColumnPrModel* rXmlColRef = rTableColumnModel[i].mxXmlColumnPr.get();
pXmlColumnPrAttrList->add(XML_mapId, OUString::number(rXmlColRef->mnMapId));
pXmlColumnPrAttrList->add(XML_xpath, rXmlColRef->msXpath);
pXmlColumnPrAttrList->add(XML_xmlDataType, rXmlColRef->msXmlDataType);
pXmlColumnPrAttrList->add(XML_denormalized, ToPsz10(rXmlColRef->mbDenormalized));
pTableStrm->singleElement(XML_xmlColumnPr, pXmlColumnPrAttrList);
}
+5 -3
View File
@@ -22,6 +22,7 @@
#include <oox/helper/refvector.hxx>
#include <dbdata.hxx>
#include "workbookhelper.hxx"
#include <osl/diagnose.h>
namespace oox { class AttributeList; }
namespace oox { class SequenceInputStream; }
@@ -45,15 +46,16 @@ public:
const TableColumnAttributes& getColumnAttributes() const;
/** Imports XML column properties for the xmlColumnPr element. */
void importXmlColumnPr(const AttributeList& rAttribs);
/** Gets the XML column properties. <xmlColumnPr> */
const XmlColumnPrAttributes& getXmlColumnPrAttributes() const;
/** Returns access to the table column model data. */
TableColumnModel& getModel() { return maModel; }
private:
OUString maName;
sal_Int32 mnId;
sal_Int32 mnDataDxfId;
TableColumnAttributes maColumnAttributes;
XmlColumnPrAttributes maXmlColumnPrAttributes;
TableColumnModel maModel;
};
class TableColumns : public WorkbookHelper
+23 -9
View File
@@ -23,6 +23,23 @@
#include <oox/helper/attributelist.hxx>
#include <oox/token/tokens.hxx>
XmlColumnPrModel::XmlColumnPrModel() :
mnMapId( 1 ),
msXpath( OUString() ),
msXmlDataType( OUString() ),
mbDenormalized( false )
{
}
TableColumnModel::TableColumnModel() {}
XmlColumnPrModel& TableColumnModel::createXmlColumnPr()
{
OSL_ENSURE( !mxXmlColumnPr, "TableColumnModel::createXmlColumnPr - multiple call" );
mxXmlColumnPr.reset( new XmlColumnPrModel );
return *mxXmlColumnPr;
}
namespace oox::xls {
TableColumn::TableColumn( const WorkbookHelper& rHelper ) :
@@ -59,15 +76,12 @@ const TableColumnAttributes& TableColumn::getColumnAttributes() const
void TableColumn::importXmlColumnPr(const AttributeList& rAttribs)
{
maXmlColumnPrAttributes.mnMapId = rAttribs.getInteger(XML_mapId, 0);
maXmlColumnPrAttributes.msXpath = rAttribs.getXString(XML_xpath, OUString());
maXmlColumnPrAttributes.msXmlDataType = rAttribs.getXString(XML_xmlDataType, OUString());
maXmlColumnPrAttributes.mbDenormalized = rAttribs.getBool(XML_denormalized, false);
}
XmlColumnPrModel& rXmlColumnPr = maModel.createXmlColumnPr();
const XmlColumnPrAttributes& TableColumn::getXmlColumnPrAttributes() const
{
return maXmlColumnPrAttributes;
rXmlColumnPr.mnMapId = rAttribs.getInteger(XML_mapId, 0);
rXmlColumnPr.msXpath = rAttribs.getXString(XML_xpath, OUString());
rXmlColumnPr.msXmlDataType = rAttribs.getXString(XML_xmlDataType, OUString());
rXmlColumnPr.mbDenormalized = rAttribs.getBool(XML_denormalized, false);
}
TableColumns::TableColumns( const WorkbookHelper& rHelper ) :
@@ -108,7 +122,7 @@ bool TableColumns::finalizeImport( ScDBData* pDBData )
{
aNames[i] = rxTableColumn->getName();
aAttributesVector[i] = rxTableColumn->getColumnAttributes();
pDBData->SetXmlColumnPrAttributes( rxTableColumn->getXmlColumnPrAttributes() );
pDBData->SetTableColumnModel( rxTableColumn->getModel() );
++i;
}
pDBData->SetTableColumnNames( std::move(aNames) );
@@ -408,10 +408,6 @@ void WorkbookFragment::finalizeImport()
std::string sXmlMapsContent;
size_t nBufferSize = 4096;
ucbhelper::Content aContent(aXmlMapsFragmentPath,
Reference<css::ucb::XCommandEnvironment>(),
comphelper::getProcessComponentContext());
Reference<XInputStream> xXmlMapsInputStream(
getBaseFilter().openInputStream(aXmlMapsFragmentPath), UNO_SET_THROW);