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