From 336a9ff1a96fd505214f163d6b051a57aa1058b4 Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Sat, 4 Jan 2014 17:29:42 +0800 Subject: [PATCH] Coding refactoring: Make worksheet relations part of the worksheet sheet1.xml _rels/sheet1.xml.rels --- src/xlsx/xlsxpackage.cpp | 28 ++++++------------------- src/xlsx/xlsxpackage_p.h | 2 -- src/xlsx/xlsxutility.cpp | 13 ++++++++++++ src/xlsx/xlsxutility_p.h | 2 ++ src/xlsx/xlsxworkbook.cpp | 4 +--- src/xlsx/xlsxworksheet.cpp | 42 ++++++++++++++++---------------------- src/xlsx/xlsxworksheet.h | 6 +++--- src/xlsx/xlsxworksheet_p.h | 4 ++-- 8 files changed, 45 insertions(+), 56 deletions(-) diff --git a/src/xlsx/xlsxpackage.cpp b/src/xlsx/xlsxpackage.cpp index 06f5730..6c4bb8b 100644 --- a/src/xlsx/xlsxpackage.cpp +++ b/src/xlsx/xlsxpackage.cpp @@ -181,10 +181,12 @@ bool Package::parsePackage(QIODevice *packageDevice) for (int i=0; iworkbook()->addWorksheet(info.name, info.sheetId); + //If the .rel file exists, load it. + if (zipReader.filePaths().contains(rel_path)) + sheet->relationships().loadFromXmlData(zipReader.fileData(rel_path)); sheet->loadFromXmlData(zipReader.fileData(worksheet_path)); } @@ -215,8 +217,6 @@ bool Package::createPackage(QIODevice *package) writeThemeFile(zipWriter); writeRootRelsFile(zipWriter); writeWorkbookRelsFile(zipWriter); - writeWorksheetRelsFiles(zipWriter); -// writeChartsheetRelsFile(zipWriter); writeDrawingRelsFiles(zipWriter); writeImageFiles(zipWriter); // writeVbaProjectFiles(zipWriter); @@ -233,6 +233,7 @@ void Package::writeWorksheetFiles(ZipWriter &zipWriter) continue; zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData()); + zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), sheet->relationships().saveToXmlData()); } } @@ -377,23 +378,6 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter) zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), rels.saveToXmlData()); } -void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter) -{ - for (int i=0; iworksheetCount(); ++i) { - Worksheet *sheet = m_workbook->worksheet(i); - if (sheet->isChartsheet()) - continue; - Relationships rels; - - foreach (QString link, sheet->externUrlList()) - rels.addWorksheetRelationship(QStringLiteral("/hyperlink"), link, QStringLiteral("External")); - foreach (QString link, sheet->externDrawingList()) - rels.addWorksheetRelationship(QStringLiteral("/drawing"), link); - - zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rels.saveToXmlData()); - } -} - void Package::writeDrawingRelsFiles(ZipWriter &zipWriter) { for (int i=0; iworksheetCount(); ++i) { diff --git a/src/xlsx/xlsxpackage_p.h b/src/xlsx/xlsxpackage_p.h index a9018e9..c4620d2 100644 --- a/src/xlsx/xlsxpackage_p.h +++ b/src/xlsx/xlsxpackage_p.h @@ -76,8 +76,6 @@ private: void writeThemeFile(ZipWriter &zipWriter); void writeRootRelsFile(ZipWriter &zipWriter); void writeWorkbookRelsFile(ZipWriter &zipWriter); - void writeWorksheetRelsFiles(ZipWriter &zipWriter); -// void writeChartsheetRelsFile(ZipWriter &zipWriter); void writeDrawingRelsFiles(ZipWriter &zipWriter); void writeImageFiles(ZipWriter &zipWriter); // void writeVbaProjectFiles(ZipWriter &zipWriter); diff --git a/src/xlsx/xlsxutility.cpp b/src/xlsx/xlsxutility.cpp index 15f7c05..30b783f 100755 --- a/src/xlsx/xlsxutility.cpp +++ b/src/xlsx/xlsxutility.cpp @@ -54,6 +54,19 @@ QStringList splitPath(const QString &path) return QStringList()< Workbook::drawings() void Workbook::prepareDrawings() { Q_D(Workbook); - int drawing_id = 0; int image_ref_id = 0; d->images.clear(); d->drawings.clear(); @@ -386,10 +385,9 @@ void Workbook::prepareDrawings() sheet->clearExtraDrawingInfo(); //At present, only picture type supported - drawing_id += 1; for (int idx = 0; idx < sheet->images().size(); ++idx) { image_ref_id += 1; - sheet->prepareImage(idx, image_ref_id, drawing_id); + sheet->prepareImage(idx, image_ref_id); d->images.append(sheet->images()[idx]->image); } diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index 408a9c5..42ba1af 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -244,6 +244,12 @@ void Worksheet::setSheetName(const QString &sheetName) d->name = sheetName; } +Relationships &Worksheet::relationships() +{ + Q_D(Worksheet); + return d->relationships; +} + bool Worksheet::isHidden() const { Q_D(const Worksheet); @@ -445,19 +451,6 @@ void Worksheet::setWhiteSpaceVisible(bool visible) d->showWhiteSpace = visible; } - -QStringList Worksheet::externUrlList() const -{ - Q_D(const Worksheet); - return d->externUrlList; -} - -QStringList Worksheet::externDrawingList() const -{ - Q_D(const Worksheet); - return d->externDrawingList; -} - QList > Worksheet::drawingLinks() const { Q_D(const Worksheet); @@ -1129,6 +1122,8 @@ int Worksheet::unmergeCells(const QString &range) void Worksheet::saveToXmlFile(QIODevice *device) { Q_D(Worksheet); + d->relationships.clear(); + QXmlStreamWriter writer(device); writer.writeStartDocument(QStringLiteral("1.0"), true); @@ -1391,9 +1386,6 @@ void WorksheetPrivate::writeHyperlinks(QXmlStreamWriter &writer) if (urlTable.isEmpty()) return; - int rel_count = 0; - externUrlList.clear(); - writer.writeStartElement(QStringLiteral("hyperlinks")); QMapIterator > it(urlTable); while (it.hasNext()) { @@ -1408,9 +1400,11 @@ void WorksheetPrivate::writeHyperlinks(QXmlStreamWriter &writer) writer.writeEmptyElement(QStringLiteral("hyperlink")); writer.writeAttribute(QStringLiteral("ref"), ref); if (data->linkType == XlsxUrlData::External) { - rel_count += 1; - externUrlList.append(data->url); - writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(rel_count)); + + //Update relationships + relationships.addWorksheetRelationship(QStringLiteral("/hyperlink"), data->url, QStringLiteral("External")); + + writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count())); if (!data->location.isEmpty()) writer.writeAttribute(QStringLiteral("location"), data->location); if (!data->display.isEmpty()) @@ -1434,9 +1428,11 @@ void WorksheetPrivate::writeDrawings(QXmlStreamWriter &writer) if (!drawing) return; - int index = externUrlList.size() + 1; + int idx = workbook->drawings().indexOf(drawing); + relationships.addWorksheetRelationship(QStringLiteral("/drawing"), QStringLiteral("../drawings/drawing%1.xml").arg(idx+1)); + writer.writeEmptyElement(QStringLiteral("drawing")); - writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(index)); + writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count())); } /*! @@ -1692,18 +1688,16 @@ void Worksheet::clearExtraDrawingInfo() if (d->drawing) { delete d->drawing; d->drawing = 0; - d->externDrawingList.clear(); d->drawingLinks.clear(); } } -void Worksheet::prepareImage(int index, int image_id, int drawing_id) +void Worksheet::prepareImage(int index, int image_id) { Q_D(Worksheet); if (!d->drawing) { d->drawing = new Drawing; d->drawing->embedded = true; - d->externDrawingList.append(QStringLiteral("../drawings/drawing%1.xml").arg(drawing_id)); } XlsxImageData *imageData = d->imageList[index]; diff --git a/src/xlsx/xlsxworksheet.h b/src/xlsx/xlsxworksheet.h index f350b7a..e05928f 100755 --- a/src/xlsx/xlsxworksheet.h +++ b/src/xlsx/xlsxworksheet.h @@ -49,6 +49,7 @@ class ConditionalFormatting; class CellRange; struct XlsxImageData; class RichString; +class Relationships; class WorksheetPrivate; class Q_XLSX_EXPORT Worksheet @@ -136,6 +137,7 @@ private: Worksheet(const QString &sheetName, int sheetId, Workbook *book); QSharedPointer copy(const QString &distName, int distId) const; void setSheetName(const QString &sheetName); + Relationships &relationships(); void saveToXmlFile(QIODevice *device); QByteArray saveToXmlData(); @@ -146,12 +148,10 @@ private: bool isHidden() const; void setHidden(bool hidden); int sheetId() const; - QStringList externUrlList() const; - QStringList externDrawingList() const; QList > drawingLinks() const; Drawing *drawing() const; QList images() const; - void prepareImage(int index, int image_id, int drawing_id); + void prepareImage(int index, int image_id); void clearExtraDrawingInfo(); WorksheetPrivate * const d_ptr; diff --git a/src/xlsx/xlsxworksheet_p.h b/src/xlsx/xlsxworksheet_p.h index ec0140d..6780af9 100644 --- a/src/xlsx/xlsxworksheet_p.h +++ b/src/xlsx/xlsxworksheet_p.h @@ -41,6 +41,7 @@ #include "xlsxcell.h" #include "xlsxdatavalidation.h" #include "xlsxconditionalformatting.h" +#include "xlsxrelationships_p.h" #include #include @@ -205,13 +206,12 @@ public: Worksheet *q_ptr; Workbook *workbook; + mutable Relationships relationships; Drawing *drawing; QMap > > cellTable; QMap > comments; QMap > urlTable; QList merges; - QStringList externUrlList; - QStringList externDrawingList; QList imageList; QMap > rowsInfo; QMap > colsInfo;