File indexing completed on 2025-03-16 03:35:12
0001 // xlsxrelationships.cpp 0002 0003 #include <QtGlobal> 0004 #include <QXmlStreamWriter> 0005 #include <QXmlStreamReader> 0006 #include <QDir> 0007 #include <QFile> 0008 #include <QBuffer> 0009 0010 #include "xlsxrelationships_p.h" 0011 0012 QT_BEGIN_NAMESPACE_XLSX 0013 0014 const QLatin1String schema_doc("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 0015 const QLatin1String schema_msPackage("http://schemas.microsoft.com/office/2006/relationships"); 0016 const QLatin1String schema_package("http://schemas.openxmlformats.org/package/2006/relationships"); 0017 //const QString schema_worksheet = QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 0018 Relationships::Relationships() 0019 { 0020 } 0021 0022 QList<XlsxRelationship> Relationships::documentRelationships(const QString &relativeType) const 0023 { 0024 return relationships(schema_doc + relativeType); 0025 } 0026 0027 void Relationships::addDocumentRelationship(const QString &relativeType, const QString &target) 0028 { 0029 addRelationship(schema_doc + relativeType, target); 0030 } 0031 0032 QList<XlsxRelationship> Relationships::msPackageRelationships(const QString &relativeType) const 0033 { 0034 return relationships(schema_msPackage + relativeType); 0035 } 0036 0037 void Relationships::addMsPackageRelationship(const QString &relativeType, const QString &target) 0038 { 0039 addRelationship(schema_msPackage + relativeType, target); 0040 } 0041 0042 QList<XlsxRelationship> Relationships::packageRelationships(const QString &relativeType) const 0043 { 0044 return relationships(schema_package + relativeType); 0045 } 0046 0047 void Relationships::addPackageRelationship(const QString &relativeType, const QString &target) 0048 { 0049 addRelationship(schema_package + relativeType, target); 0050 } 0051 0052 QList<XlsxRelationship> Relationships::worksheetRelationships(const QString &relativeType) const 0053 { 0054 return relationships(schema_doc + relativeType); 0055 } 0056 0057 void Relationships::addWorksheetRelationship(const QString &relativeType, const QString &target, const QString &targetMode) 0058 { 0059 addRelationship(schema_doc + relativeType, target, targetMode); 0060 } 0061 0062 QList<XlsxRelationship> Relationships::relationships(const QString &type) const 0063 { 0064 QList<XlsxRelationship> res; 0065 for (const XlsxRelationship &ship : m_relationships) { 0066 if (ship.type == type) 0067 res.append(ship); 0068 } 0069 return res; 0070 } 0071 0072 void Relationships::addRelationship(const QString &type, const QString &target, const QString &targetMode) 0073 { 0074 XlsxRelationship relation; 0075 relation.id = QStringLiteral("rId%1").arg(m_relationships.size()+1); 0076 relation.type = type; 0077 relation.target = target; 0078 relation.targetMode = targetMode; 0079 0080 m_relationships.append(relation); 0081 } 0082 0083 void Relationships::saveToXmlFile(QIODevice *device) const 0084 { 0085 QXmlStreamWriter writer(device); 0086 0087 writer.writeStartDocument(QStringLiteral("1.0"), true); 0088 writer.writeStartElement(QStringLiteral("Relationships")); 0089 writer.writeAttribute(QStringLiteral("xmlns"), QStringLiteral("http://schemas.openxmlformats.org/package/2006/relationships")); 0090 for (const XlsxRelationship &relation : m_relationships) { 0091 writer.writeStartElement(QStringLiteral("Relationship")); 0092 writer.writeAttribute(QStringLiteral("Id"), relation.id); 0093 writer.writeAttribute(QStringLiteral("Type"), relation.type); 0094 writer.writeAttribute(QStringLiteral("Target"), relation.target); 0095 if (!relation.targetMode.isNull()) 0096 writer.writeAttribute(QStringLiteral("TargetMode"), relation.targetMode); 0097 writer.writeEndElement(); 0098 } 0099 writer.writeEndElement();//Relationships 0100 writer.writeEndDocument(); 0101 } 0102 0103 QByteArray Relationships::saveToXmlData() const 0104 { 0105 QByteArray data; 0106 QBuffer buffer(&data); 0107 buffer.open(QIODevice::WriteOnly); 0108 saveToXmlFile(&buffer); 0109 0110 return data; 0111 } 0112 0113 bool Relationships::loadFromXmlFile(QIODevice *device) 0114 { 0115 clear(); 0116 QXmlStreamReader reader(device); 0117 while (!reader.atEnd()) { 0118 QXmlStreamReader::TokenType token = reader.readNext(); 0119 if (token == QXmlStreamReader::StartElement) { 0120 if (reader.name() == QStringLiteral("Relationship")) { 0121 QXmlStreamAttributes attributes = reader.attributes(); 0122 XlsxRelationship relationship; 0123 relationship.id = attributes.value(QLatin1String("Id")).toString(); 0124 relationship.type = attributes.value(QLatin1String("Type")).toString(); 0125 relationship.target = attributes.value(QLatin1String("Target")).toString(); 0126 relationship.targetMode = attributes.value(QLatin1String("TargetMode")).toString(); 0127 m_relationships.append(relationship); 0128 } 0129 } 0130 0131 if (reader.hasError()) 0132 return false; 0133 } 0134 return true; 0135 } 0136 0137 bool Relationships::loadFromXmlData(const QByteArray &data) 0138 { 0139 QBuffer buffer; 0140 buffer.setData(data); 0141 buffer.open(QIODevice::ReadOnly); 0142 return loadFromXmlFile(&buffer); 0143 } 0144 0145 XlsxRelationship Relationships::getRelationshipById(const QString &id) const 0146 { 0147 for (const XlsxRelationship &ship : m_relationships) { 0148 if (ship.id == id) 0149 return ship; 0150 } 0151 return XlsxRelationship(); 0152 } 0153 0154 void Relationships::clear() 0155 { 0156 m_relationships.clear(); 0157 } 0158 0159 int Relationships::count() const 0160 { 0161 return m_relationships.count(); 0162 } 0163 0164 bool Relationships::isEmpty() const 0165 { 0166 return m_relationships.isEmpty(); 0167 } 0168 0169 QT_END_NAMESPACE_XLSX