File indexing completed on 2025-03-23 03:32:48
0001 // xlsxcontenttypes.cpp 0002 0003 #include <QXmlStreamWriter> 0004 #include <QXmlStreamReader> 0005 #include <QFile> 0006 #include <QMapIterator> 0007 #include <QBuffer> 0008 #include <QDebug> 0009 0010 #include "xlsxcontenttypes_p.h" 0011 0012 QT_BEGIN_NAMESPACE_XLSX 0013 0014 ContentTypes::ContentTypes(CreateFlag flag) 0015 :AbstractOOXmlFile(flag) 0016 { 0017 m_package_prefix = QStringLiteral("application/vnd.openxmlformats-package."); 0018 m_document_prefix = QStringLiteral("application/vnd.openxmlformats-officedocument."); 0019 0020 m_defaults.insert(QStringLiteral("rels"), m_package_prefix + QLatin1String("relationships+xml")); 0021 m_defaults.insert(QStringLiteral("xml"), QStringLiteral("application/xml")); 0022 } 0023 0024 void ContentTypes::addDefault(const QString &key, const QString &value) 0025 { 0026 m_defaults.insert(key, value); 0027 } 0028 0029 void ContentTypes::addOverride(const QString &key, const QString &value) 0030 { 0031 m_overrides.insert(key, value); 0032 } 0033 0034 void ContentTypes::addDocPropApp() 0035 { 0036 addOverride(QStringLiteral("/docProps/app.xml"), m_document_prefix + QLatin1String("extended-properties+xml")); 0037 } 0038 0039 void ContentTypes::addDocPropCore() 0040 { 0041 addOverride(QStringLiteral("/docProps/core.xml"), m_package_prefix + QLatin1String("core-properties+xml")); 0042 } 0043 0044 void ContentTypes::addStyles() 0045 { 0046 addOverride(QStringLiteral("/xl/styles.xml"), m_document_prefix + QLatin1String("spreadsheetml.styles+xml")); 0047 } 0048 0049 void ContentTypes::addTheme() 0050 { 0051 addOverride(QStringLiteral("/xl/theme/theme1.xml"), m_document_prefix + QLatin1String("theme+xml")); 0052 } 0053 0054 void ContentTypes::addWorkbook() 0055 { 0056 addOverride(QStringLiteral("/xl/workbook.xml"), m_document_prefix + QLatin1String("spreadsheetml.sheet.main+xml")); 0057 } 0058 0059 void ContentTypes::addWorksheetName(const QString &name) 0060 { 0061 addOverride(QStringLiteral("/xl/worksheets/%1.xml").arg(name), m_document_prefix + QLatin1String("spreadsheetml.worksheet+xml")); 0062 } 0063 0064 void ContentTypes::addChartsheetName(const QString &name) 0065 { 0066 addOverride(QStringLiteral("/xl/chartsheets/%1.xml").arg(name), m_document_prefix + QLatin1String("spreadsheetml.chartsheet+xml")); 0067 } 0068 0069 void ContentTypes::addDrawingName(const QString &name) 0070 { 0071 addOverride(QStringLiteral("/xl/drawings/%1.xml").arg(name), m_document_prefix + QLatin1String("drawing+xml")); 0072 } 0073 0074 void ContentTypes::addChartName(const QString &name) 0075 { 0076 addOverride(QStringLiteral("/xl/charts/%1.xml").arg(name), m_document_prefix + QLatin1String("drawingml.chart+xml")); 0077 } 0078 0079 void ContentTypes::addCommentName(const QString &name) 0080 { 0081 addOverride(QStringLiteral("/xl/%1.xml").arg(name), m_document_prefix + QLatin1String("spreadsheetml.comments+xml")); 0082 } 0083 0084 void ContentTypes::addTableName(const QString &name) 0085 { 0086 addOverride(QStringLiteral("/xl/tables/%1.xml").arg(name), m_document_prefix + QLatin1String("spreadsheetml.table+xml")); 0087 } 0088 0089 void ContentTypes::addExternalLinkName(const QString &name) 0090 { 0091 addOverride(QStringLiteral("/xl/externalLinks/%1.xml").arg(name), m_document_prefix + QLatin1String("spreadsheetml.externalLink+xml")); 0092 } 0093 0094 void ContentTypes::addSharedString() 0095 { 0096 addOverride(QStringLiteral("/xl/sharedStrings.xml"), m_document_prefix + QLatin1String("spreadsheetml.sharedStrings+xml")); 0097 } 0098 0099 void ContentTypes::addVmlName() 0100 { 0101 addOverride(QStringLiteral("vml"), m_document_prefix + QLatin1String("vmlDrawing")); 0102 } 0103 0104 void ContentTypes::addCalcChain() 0105 { 0106 addOverride(QStringLiteral("/xl/calcChain.xml"), m_document_prefix + QLatin1String("spreadsheetml.calcChain+xml")); 0107 } 0108 0109 void ContentTypes::addVbaProject() 0110 { 0111 //:TODO 0112 addOverride(QStringLiteral("bin"), QStringLiteral("application/vnd.ms-office.vbaProject")); 0113 } 0114 0115 void ContentTypes::clearOverrides() 0116 { 0117 m_overrides.clear(); 0118 } 0119 0120 void ContentTypes::saveToXmlFile(QIODevice *device) const 0121 { 0122 QXmlStreamWriter writer(device); 0123 0124 writer.writeStartDocument(QStringLiteral("1.0"), true); 0125 writer.writeStartElement(QStringLiteral("Types")); 0126 writer.writeAttribute(QStringLiteral("xmlns"), QStringLiteral("http://schemas.openxmlformats.org/package/2006/content-types")); 0127 0128 { 0129 QMapIterator<QString, QString> it(m_defaults); 0130 while (it.hasNext()) { 0131 it.next(); 0132 writer.writeStartElement(QStringLiteral("Default")); 0133 writer.writeAttribute(QStringLiteral("Extension"), it.key()); 0134 writer.writeAttribute(QStringLiteral("ContentType"), it.value()); 0135 writer.writeEndElement();//Default 0136 } 0137 } 0138 0139 { 0140 QMapIterator<QString, QString> it(m_overrides); 0141 while (it.hasNext()) { 0142 it.next(); 0143 writer.writeStartElement(QStringLiteral("Override")); 0144 writer.writeAttribute(QStringLiteral("PartName"), it.key()); 0145 writer.writeAttribute(QStringLiteral("ContentType"), it.value()); 0146 writer.writeEndElement(); //Override 0147 } 0148 } 0149 0150 writer.writeEndElement();//Types 0151 writer.writeEndDocument(); 0152 0153 } 0154 0155 bool ContentTypes::loadFromXmlFile(QIODevice *device) 0156 { 0157 m_defaults.clear(); 0158 m_overrides.clear(); 0159 0160 QXmlStreamReader reader(device); 0161 while (!reader.atEnd()) { 0162 QXmlStreamReader::TokenType token = reader.readNext(); 0163 if (token == QXmlStreamReader::StartElement) { 0164 if (reader.name() == QLatin1String("Default")) { 0165 QXmlStreamAttributes attrs = reader.attributes(); 0166 QString extension = attrs.value(QLatin1String("Extension")).toString(); 0167 QString type = attrs.value(QLatin1String("ContentType")).toString(); 0168 m_defaults.insert(extension, type); 0169 } else if (reader.name() == QLatin1String("Override")) { 0170 QXmlStreamAttributes attrs = reader.attributes(); 0171 QString partName = attrs.value(QLatin1String("PartName")).toString(); 0172 QString type = attrs.value(QLatin1String("ContentType")).toString(); 0173 m_overrides.insert(partName, type); 0174 } 0175 } 0176 0177 if (reader.hasError()) { 0178 qDebug()<<reader.errorString(); 0179 } 0180 } 0181 return true; 0182 } 0183 0184 QT_END_NAMESPACE_XLSX