diff --git a/src/xlsx/xlsxdocument.cpp b/src/xlsx/xlsxdocument.cpp index 9c99026..2576029 100644 --- a/src/xlsx/xlsxdocument.cpp +++ b/src/xlsx/xlsxdocument.cpp @@ -145,9 +145,9 @@ bool DocumentPrivate::loadPackage(QIODevice *device) if (rels_xl.isEmpty()) return false; QString xlworkbook_Path = rels_xl[0].target; - QStringList xlworkbook_PathList = splitPath(xlworkbook_Path); - QString xlworkbook_Dir = xlworkbook_PathList[0]; + QString xlworkbook_Dir = splitPath(xlworkbook_Path)[0]; workbook->relationships().loadFromXmlData(zipReader.fileData(getRelFilePath(xlworkbook_Path))); + workbook->setFilePath(xlworkbook_Path); workbook->loadFromXmlData(zipReader.fileData(xlworkbook_Path)); //load styles @@ -180,33 +180,22 @@ bool DocumentPrivate::loadPackage(QIODevice *device) } //load worksheets - QList rels_worksheets = workbook->relationships().documentRelationships(QStringLiteral("/worksheet")); - if (rels_worksheets.isEmpty()) - return false; - - QList sheetNameIdPairList = workbook->d_func()->sheetItemInfoList; - - for (int i=0; irelationships().getRelationshipById(info.rId).target; - QString rel_path = getRelFilePath(worksheet_path); - Worksheet *sheet = workbook->addWorksheet(info.name, info.sheetId); + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = workbook->worksheet(i); + QString rel_path = getRelFilePath(sheet->filePath()); //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)); - - //load drawing if exists - if (!sheet->drawingPath().isEmpty()) { - QString drawingPath = QDir::cleanPath(splitPath(worksheet_path)[0] + QLatin1String("/") + sheet->drawingPath()); - Drawing *drawing = new Drawing(workbook.data()); - drawing->pathInPackage = drawingPath; - QString drawing_rel_path = getRelFilePath(drawingPath); - if (zipReader.filePaths().contains(drawing_rel_path)) - drawing->relationships.loadFromXmlData(zipReader.fileData(drawing_rel_path)); - drawing->loadFromXmlData(zipReader.fileData(drawingPath)); - sheet->setDrawing(drawing); - } + sheet->loadFromXmlData(zipReader.fileData(sheet->filePath())); + } + + //load drawings + for (int i=0; idrawings().size(); ++i) { + Drawing *drawing = workbook->drawings()[i]; + QString rel_path = getRelFilePath(drawing->filePath()); + if (zipReader.filePaths().contains(rel_path)) + drawing->relationships.loadFromXmlData(zipReader.fileData(rel_path)); + drawing->loadFromXmlData(zipReader.fileData(drawing->filePath())); } //load charts diff --git a/src/xlsx/xlsxdrawing_p.h b/src/xlsx/xlsxdrawing_p.h index b53acd4..4016ae9 100644 --- a/src/xlsx/xlsxdrawing_p.h +++ b/src/xlsx/xlsxdrawing_p.h @@ -64,8 +64,6 @@ public: Workbook *workbook; QList anchors; mutable Relationships relationships; - - QString pathInPackage; }; } // namespace QXlsx diff --git a/src/xlsx/xlsxdrawinganchor.cpp b/src/xlsx/xlsxdrawinganchor.cpp index ee0fcd9..08dc267 100644 --- a/src/xlsx/xlsxdrawinganchor.cpp +++ b/src/xlsx/xlsxdrawinganchor.cpp @@ -181,7 +181,7 @@ void DrawingAnchor::loadXmlObjectGraphicFrame(QXmlStreamReader &reader) if (reader.name() == QLatin1String("chart")) { QString rId = reader.attributes().value(QLatin1String("r:id")).toString(); QString name = m_drawing->relationships.getRelationshipById(rId).target; - QString path = QDir::cleanPath(splitPath(m_drawing->pathInPackage)[0] + QLatin1String("/") + name); + QString path = QDir::cleanPath(splitPath(m_drawing->filePath())[0] + QLatin1String("/") + name); bool exist = false; QList > cfs = m_drawing->workbook->chartFiles(); @@ -222,7 +222,7 @@ void DrawingAnchor::loadXmlObjectPicture(QXmlStreamReader &reader) if (reader.name() == QLatin1String("blip")) { QString rId = reader.attributes().value(QLatin1String("r:embed")).toString(); QString name = m_drawing->relationships.getRelationshipById(rId).target; - QString path = QDir::cleanPath(splitPath(m_drawing->pathInPackage)[0] + QLatin1String("/") + name); + QString path = QDir::cleanPath(splitPath(m_drawing->filePath())[0] + QLatin1String("/") + name); bool exist = false; QList > mfs = m_drawing->workbook->mediaFiles(); diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index ec1064b..a352d4d 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -31,11 +31,13 @@ #include "xlsxworksheet_p.h" #include "xlsxformat_p.h" #include "xlsxmediafile_p.h" +#include "xlsxutility_p.h" #include #include #include #include +#include QT_BEGIN_NAMESPACE_XLSX @@ -485,14 +487,17 @@ bool Workbook::loadFromXmlFile(QIODevice *device) QXmlStreamReader::TokenType token = reader.readNext(); if (token == QXmlStreamReader::StartElement) { if (reader.name() == QLatin1String("sheet")) { - XlsxSheetItemInfo info; QXmlStreamAttributes attributes = reader.attributes(); - info.name = attributes.value(QLatin1String("name")).toString(); - info.sheetId = attributes.value(QLatin1String("sheetId")).toString().toInt(); - info.rId = attributes.value(QLatin1String("r:id")).toString(); - if (attributes.hasAttribute(QLatin1String("state"))) - info.state = attributes.value(QLatin1String("state")).toString(); - d->sheetItemInfoList.append(info); + const QString name = attributes.value(QLatin1String("name")).toString(); + int sheetId = attributes.value(QLatin1String("sheetId")).toString().toInt(); + const QString rId = attributes.value(QLatin1String("r:id")).toString(); +// if (attributes.hasAttribute(QLatin1String("state"))) +// QString state = attributes.value(QLatin1String("state")).toString(); + + Worksheet *sheet = addWorksheet(name, sheetId); + const QString path = d->relationships.getRelationshipById(rId).target; + const QString fullPath = QDir::cleanPath(splitPath(filePath())[0] +QLatin1String("/")+ path); + sheet->setFilePath(fullPath); } else if (reader.name() == QLatin1String("workbookPr")) { QXmlStreamAttributes attrs = reader.attributes(); if (attrs.hasAttribute(QLatin1String("date1904"))) diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index 0ed1df9..09d5cf8 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -60,8 +61,6 @@ WorksheetPrivate::WorksheetPrivate(Worksheet *p) , showZeros(true), rightToLeft(false), tabSelected(false), showRuler(false) , showOutlineSymbols(true), showWhiteSpace(true) { - drawing = 0; - previous_row = 0; outline_row_level = 0; @@ -75,8 +74,6 @@ WorksheetPrivate::WorksheetPrivate(Worksheet *p) WorksheetPrivate::~WorksheetPrivate() { - if (drawing) - delete drawing; } /* @@ -1026,9 +1023,9 @@ bool Worksheet::insertImage(int row, int column, const QImage &image) return false; if (!d->drawing) - d->drawing = new Drawing(d->workbook); + d->drawing = QSharedPointer(new Drawing(d->workbook)); - DrawingOneCellAnchor *anchor = new DrawingOneCellAnchor(d->drawing, DrawingAnchor::Picture); + DrawingOneCellAnchor *anchor = new DrawingOneCellAnchor(d->drawing.data(), DrawingAnchor::Picture); /* The size are expressed as English Metric Units (EMUs). There are @@ -1451,7 +1448,7 @@ void WorksheetPrivate::saveXmlDrawings(QXmlStreamWriter &writer) const if (!drawing) return; - int idx = workbook->drawings().indexOf(drawing); + int idx = workbook->drawings().indexOf(drawing.data()); relationships.addWorksheetRelationship(QStringLiteral("/drawing"), QStringLiteral("../drawings/drawing%1.xml").arg(idx+1)); writer.writeEmptyElement(QStringLiteral("drawing")); @@ -1699,32 +1696,7 @@ CellRange Worksheet::dimension() const Drawing *Worksheet::drawing() const { Q_D(const Worksheet); - return d->drawing; -} - -/*! - * \internal - * - * When loading the .xlsx package, the drawing{x}.xml file path - * is extracted when we parse the sheet{x}.xml file. - */ -QString Worksheet::drawingPath() const -{ - Q_D(const Worksheet); - return d->drawingPath_in_zip; -} - -/*! - * \internal - * - * Note, the object will be managed by this sheet. - */ -void Worksheet::setDrawing(Drawing *draw) -{ - Q_D(Worksheet); - Q_ASSERT(!d->drawing); - - d->drawing = draw; + return d->drawing.data(); } /* @@ -2114,7 +2086,10 @@ bool Worksheet::loadFromXmlFile(QIODevice *device) d->loadXmlHyperlinks(reader); } else if (reader.name() == QLatin1String("drawing")) { QString rId = reader.attributes().value(QStringLiteral("r:id")).toString(); - d->drawingPath_in_zip = d->relationships.getRelationshipById(rId).target; + QString name = d->relationships.getRelationshipById(rId).target; + QString path = QDir::cleanPath(splitPath(filePath())[0] + QLatin1String("/") + name); + d->drawing = QSharedPointer(new Drawing(d->workbook)); + d->drawing->filePath() = path; } } } diff --git a/src/xlsx/xlsxworksheet.h b/src/xlsx/xlsxworksheet.h index 92f130d..1fe7a57 100755 --- a/src/xlsx/xlsxworksheet.h +++ b/src/xlsx/xlsxworksheet.h @@ -151,8 +151,6 @@ private: int sheetId() const; Drawing *drawing() const; - void setDrawing(Drawing *d); - QString drawingPath() const; }; QT_END_NAMESPACE_XLSX diff --git a/src/xlsx/xlsxworksheet_p.h b/src/xlsx/xlsxworksheet_p.h index ae70372..e542f47 100644 --- a/src/xlsx/xlsxworksheet_p.h +++ b/src/xlsx/xlsxworksheet_p.h @@ -146,8 +146,7 @@ public: Workbook *workbook; mutable Relationships relationships; - Drawing *drawing; - QString drawingPath_in_zip; + QSharedPointer drawing; QMap > > cellTable; QMap > comments; QMap > > urlTable;