diff --git a/src/xlsx/xlsxdocument.cpp b/src/xlsx/xlsxdocument.cpp index 89b3ef1..a5f1048 100644 --- a/src/xlsx/xlsxdocument.cpp +++ b/src/xlsx/xlsxdocument.cpp @@ -137,14 +137,12 @@ bool DocumentPrivate::loadPackage(QIODevice *device) QString xlworkbook_Path = rels_xl[0].target; QStringList xlworkbook_PathList = splitPath(xlworkbook_Path); QString xlworkbook_Dir = xlworkbook_PathList[0]; - QString xlworkbook_Name = xlworkbook_PathList[1]; + workbook->relationships().loadFromXmlData(zipReader.fileData(getRelFilePath(xlworkbook_Path))); workbook->loadFromXmlData(zipReader.fileData(xlworkbook_Path)); QList sheetNameIdPairList = workbook->d_func()->sheetItemInfoList; - Relationships xlworkbook_Rels; - xlworkbook_Rels.loadFromXmlData(zipReader.fileData(xlworkbook_Dir+QStringLiteral("/_rels/")+xlworkbook_Name+QStringLiteral(".rels"))); //load styles - QList rels_styles = xlworkbook_Rels.documentRelationships(QStringLiteral("/styles")); + QList rels_styles = workbook->relationships().documentRelationships(QStringLiteral("/styles")); if (!rels_styles.isEmpty()) { //In normal case this should be styles.xml which in xl QString name = rels_styles[0].target; @@ -155,7 +153,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device) } //load sharedStrings - QList rels_sharedStrings = xlworkbook_Rels.documentRelationships(QStringLiteral("/sharedStrings")); + QList rels_sharedStrings = workbook->relationships().documentRelationships(QStringLiteral("/sharedStrings")); if (!rels_sharedStrings.isEmpty()) { //In normal case this should be sharedStrings.xml which in xl QString name = rels_sharedStrings[0].target; @@ -164,7 +162,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device) } //load theme - QList rels_theme = xlworkbook_Rels.documentRelationships(QStringLiteral("/theme")); + QList rels_theme = workbook->relationships().documentRelationships(QStringLiteral("/theme")); if (!rels_theme.isEmpty()) { //In normal case this should be theme/theme1.xml which in xl QString name = rels_theme[0].target; @@ -173,13 +171,13 @@ bool DocumentPrivate::loadPackage(QIODevice *device) } //load worksheets - QList rels_worksheets = xlworkbook_Rels.documentRelationships(QStringLiteral("/worksheet")); + QList rels_worksheets = workbook->relationships().documentRelationships(QStringLiteral("/worksheet")); if (rels_worksheets.isEmpty()) return false; for (int i=0; irelationships().getRelationshipById(info.rId).target; QString rel_path = getRelFilePath(worksheet_path); Worksheet *sheet = workbook->addWorksheet(info.name, info.sheetId); //If the .rel file exists, load it. @@ -219,14 +217,7 @@ bool DocumentPrivate::savePackage(QIODevice *device) const // save workbook xml file zipWriter.addFile(QStringLiteral("xl/workbook.xml"), workbook->saveToXmlData()); - Relationships rels; - for (int i=0; iworksheetCount(); ++i) - rels.addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1)); - rels.addDocumentRelationship(QStringLiteral("/theme"), QStringLiteral("theme/theme1.xml")); - rels.addDocumentRelationship(QStringLiteral("/styles"), QStringLiteral("styles.xml")); - if (!workbook->sharedStrings()->isEmpty()) - rels.addDocumentRelationship(QStringLiteral("/sharedStrings"), QStringLiteral("sharedStrings.xml")); - zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), rels.saveToXmlData()); + zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), workbook->relationships().saveToXmlData()); // save drawing xml files for (int i=0; idrawings().size(); ++i) { diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index 046c347..c02f75a 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -397,6 +397,15 @@ void Workbook::prepareDrawings() void Workbook::saveToXmlFile(QIODevice *device) const { Q_D(const Workbook); + d->relationships.clear(); + + for (int i=0; irelationships.addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1)); + d->relationships.addDocumentRelationship(QStringLiteral("/theme"), QStringLiteral("theme/theme1.xml")); + d->relationships.addDocumentRelationship(QStringLiteral("/styles"), QStringLiteral("styles.xml")); + if (!sharedStrings()->isEmpty()) + d->relationships.addDocumentRelationship(QStringLiteral("/sharedStrings"), QStringLiteral("sharedStrings.xml")); + QXmlStreamWriter writer(device); writer.writeStartDocument(QStringLiteral("1.0"), true); @@ -554,4 +563,13 @@ bool Workbook::loadFromXmlData(const QByteArray &data) return loadFromXmlFile(&buffer); } +/*! + * \internal + */ +Relationships &Workbook::relationships() +{ + Q_D(Workbook); + return d->relationships; +} + QT_END_NAMESPACE_XLSX diff --git a/src/xlsx/xlsxworkbook.h b/src/xlsx/xlsxworkbook.h index cd49942..0ab19b1 100755 --- a/src/xlsx/xlsxworkbook.h +++ b/src/xlsx/xlsxworkbook.h @@ -40,6 +40,7 @@ class Styles; class Drawing; class Document; class Theme; +class Relationships; class DocumentPrivate; class WorkbookPrivate; @@ -84,6 +85,7 @@ private: QByteArray saveToXmlData() const; bool loadFromXmlFile(QIODevice *device); bool loadFromXmlData(const QByteArray &data); + Relationships &relationships(); SharedStrings *sharedStrings() const; Styles *styles(); diff --git a/src/xlsx/xlsxworkbook_p.h b/src/xlsx/xlsxworkbook_p.h index 8978784..d858b69 100644 --- a/src/xlsx/xlsxworkbook_p.h +++ b/src/xlsx/xlsxworkbook_p.h @@ -38,6 +38,8 @@ #include "xlsxworkbook.h" #include "xlsxtheme_p.h" +#include "xlsxrelationships_p.h" + #include #include #include @@ -78,6 +80,7 @@ public: WorkbookPrivate(Workbook *q); Workbook *q_ptr; + mutable Relationships relationships; QSharedPointer sharedStrings; QList > worksheets;