Make relationships as a property of OOXmlFile
This commit is contained in:
@@ -147,13 +147,4 @@ Workbook *AbstractSheet::workbook() const
|
||||
return d->workbook;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
*/
|
||||
Relationships &AbstractSheet::relationships()
|
||||
{
|
||||
Q_D(AbstractSheet);
|
||||
return d->relationships;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE_XLSX
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
QT_BEGIN_NAMESPACE_XLSX
|
||||
class Workbook;
|
||||
class Drawing;
|
||||
class Relationships;
|
||||
class AbstractSheetPrivate;
|
||||
class Q_XLSX_EXPORT AbstractSheet : public OOXmlFile
|
||||
{
|
||||
@@ -50,7 +49,6 @@ public:
|
||||
QString sheetName() const;
|
||||
bool isHidden() const;
|
||||
Workbook *workbook() const;
|
||||
Relationships &relationships();
|
||||
|
||||
protected:
|
||||
friend class Workbook;
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
#include "xlsxglobal.h"
|
||||
#include "xlsxabstractsheet.h"
|
||||
#include "xlsxooxmlfile_p.h"
|
||||
#include "xlsxrelationships_p.h"
|
||||
|
||||
#include <QSharedPointer>
|
||||
|
||||
@@ -54,7 +53,6 @@ public:
|
||||
|
||||
Workbook *workbook;
|
||||
QSharedPointer<Drawing> drawing;
|
||||
mutable Relationships relationships;
|
||||
|
||||
QString name;
|
||||
int id;
|
||||
|
||||
+12
-12
@@ -146,12 +146,12 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
|
||||
return false;
|
||||
QString xlworkbook_Path = rels_xl[0].target;
|
||||
QString xlworkbook_Dir = splitPath(xlworkbook_Path)[0];
|
||||
workbook->relationships().loadFromXmlData(zipReader.fileData(getRelFilePath(xlworkbook_Path)));
|
||||
workbook->relationships()->loadFromXmlData(zipReader.fileData(getRelFilePath(xlworkbook_Path)));
|
||||
workbook->setFilePath(xlworkbook_Path);
|
||||
workbook->loadFromXmlData(zipReader.fileData(xlworkbook_Path));
|
||||
|
||||
//load styles
|
||||
QList<XlsxRelationship> rels_styles = workbook->relationships().documentRelationships(QStringLiteral("/styles"));
|
||||
QList<XlsxRelationship> 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;
|
||||
@@ -162,7 +162,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
|
||||
}
|
||||
|
||||
//load sharedStrings
|
||||
QList<XlsxRelationship> rels_sharedStrings = workbook->relationships().documentRelationships(QStringLiteral("/sharedStrings"));
|
||||
QList<XlsxRelationship> 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;
|
||||
@@ -171,7 +171,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
|
||||
}
|
||||
|
||||
//load theme
|
||||
QList<XlsxRelationship> rels_theme = workbook->relationships().documentRelationships(QStringLiteral("/theme"));
|
||||
QList<XlsxRelationship> 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;
|
||||
@@ -185,7 +185,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
|
||||
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->relationships()->loadFromXmlData(zipReader.fileData(rel_path));
|
||||
sheet->loadFromXmlData(zipReader.fileData(sheet->filePath()));
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
|
||||
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->relationships()->loadFromXmlData(zipReader.fileData(rel_path));
|
||||
drawing->loadFromXmlData(zipReader.fileData(drawing->filePath()));
|
||||
}
|
||||
|
||||
@@ -237,16 +237,16 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
|
||||
docPropsApp.addPartTitle(sheet->sheetName());
|
||||
|
||||
zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData());
|
||||
Relationships &rel = sheet->relationships();
|
||||
if (!rel.isEmpty())
|
||||
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel.saveToXmlData());
|
||||
Relationships *rel = sheet->relationships();
|
||||
if (!rel->isEmpty())
|
||||
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData());
|
||||
}
|
||||
}
|
||||
|
||||
// save workbook xml file
|
||||
contentTypes.addWorkbook();
|
||||
zipWriter.addFile(QStringLiteral("xl/workbook.xml"), workbook->saveToXmlData());
|
||||
zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), workbook->relationships().saveToXmlData());
|
||||
zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), workbook->relationships()->saveToXmlData());
|
||||
|
||||
// save drawing xml files
|
||||
for (int i=0; i<workbook->drawings().size(); ++i) {
|
||||
@@ -254,8 +254,8 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
|
||||
|
||||
Drawing *drawing = workbook->drawings()[i];
|
||||
zipWriter.addFile(QStringLiteral("xl/drawings/drawing%1.xml").arg(i+1), drawing->saveToXmlData());
|
||||
if (!drawing->relationships.isEmpty())
|
||||
zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(i+1), drawing->relationships.saveToXmlData());
|
||||
if (!drawing->relationships()->isEmpty())
|
||||
zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(i+1), drawing->relationships()->saveToXmlData());
|
||||
}
|
||||
|
||||
// save docProps app/core xml file
|
||||
|
||||
@@ -46,7 +46,7 @@ Drawing::~Drawing()
|
||||
|
||||
void Drawing::saveToXmlFile(QIODevice *device) const
|
||||
{
|
||||
relationships.clear();
|
||||
relationships()->clear();
|
||||
|
||||
QXmlStreamWriter writer(device);
|
||||
|
||||
|
||||
@@ -65,7 +65,6 @@ public:
|
||||
Worksheet *worksheet;
|
||||
Workbook *workbook;
|
||||
QList<DrawingAnchor *> anchors;
|
||||
mutable Relationships relationships;
|
||||
};
|
||||
|
||||
} // namespace QXlsx
|
||||
|
||||
@@ -193,7 +193,7 @@ void DrawingAnchor::loadXmlObjectGraphicFrame(QXmlStreamReader &reader)
|
||||
if (reader.tokenType() == QXmlStreamReader::StartElement) {
|
||||
if (reader.name() == QLatin1String("chart")) {
|
||||
QString rId = reader.attributes().value(QLatin1String("r:id")).toString();
|
||||
QString name = m_drawing->relationships.getRelationshipById(rId).target;
|
||||
QString name = m_drawing->relationships()->getRelationshipById(rId).target;
|
||||
QString path = QDir::cleanPath(splitPath(m_drawing->filePath())[0] + QLatin1String("/") + name);
|
||||
|
||||
bool exist = false;
|
||||
@@ -234,7 +234,7 @@ void DrawingAnchor::loadXmlObjectPicture(QXmlStreamReader &reader)
|
||||
if (reader.tokenType() == QXmlStreamReader::StartElement) {
|
||||
if (reader.name() == QLatin1String("blip")) {
|
||||
QString rId = reader.attributes().value(QLatin1String("r:embed")).toString();
|
||||
QString name = m_drawing->relationships.getRelationshipById(rId).target;
|
||||
QString name = m_drawing->relationships()->getRelationshipById(rId).target;
|
||||
QString path = QDir::cleanPath(splitPath(m_drawing->filePath())[0] + QLatin1String("/") + name);
|
||||
|
||||
bool exist = false;
|
||||
@@ -329,12 +329,12 @@ void DrawingAnchor::saveXmlObjectGraphicFrame(QXmlStreamWriter &writer) const
|
||||
writer.writeAttribute(QStringLiteral("uri"), QStringLiteral("http://schemas.openxmlformats.org/drawingml/2006/chart"));
|
||||
|
||||
int idx = m_drawing->workbook->chartFiles().indexOf(m_chartFile);
|
||||
m_drawing->relationships.addDocumentRelationship(QStringLiteral("/chart"), QStringLiteral("../charts/chart%1.xml").arg(idx+1));
|
||||
m_drawing->relationships()->addDocumentRelationship(QStringLiteral("/chart"), QStringLiteral("../charts/chart%1.xml").arg(idx+1));
|
||||
|
||||
writer.writeEmptyElement(QStringLiteral("c:chart"));
|
||||
writer.writeAttribute(QStringLiteral("xmlns:c"), QStringLiteral("http://schemas.openxmlformats.org/drawingml/2006/chart"));
|
||||
writer.writeAttribute(QStringLiteral("xmlns:r"), QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships"));
|
||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(m_drawing->relationships.count()));
|
||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(m_drawing->relationships()->count()));
|
||||
|
||||
writer.writeEndElement(); //a:graphicData
|
||||
writer.writeEndElement(); //a:graphic
|
||||
@@ -364,14 +364,14 @@ void DrawingAnchor::saveXmlObjectPicture(QXmlStreamWriter &writer) const
|
||||
|
||||
writer.writeEndElement(); //xdr:nvPicPr
|
||||
|
||||
m_drawing->relationships.addDocumentRelationship(QStringLiteral("/image"), QStringLiteral("../media/image%1.%2")
|
||||
m_drawing->relationships()->addDocumentRelationship(QStringLiteral("/image"), QStringLiteral("../media/image%1.%2")
|
||||
.arg(m_pictureFile->index()+1)
|
||||
.arg(m_pictureFile->suffix()));
|
||||
|
||||
writer.writeStartElement(QStringLiteral("xdr:blipFill"));
|
||||
writer.writeEmptyElement(QStringLiteral("a:blip"));
|
||||
writer.writeAttribute(QStringLiteral("xmlns:r"), QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships"));
|
||||
writer.writeAttribute(QStringLiteral("r:embed"), QStringLiteral("rId%1").arg(m_drawing->relationships.count()));
|
||||
writer.writeAttribute(QStringLiteral("r:embed"), QStringLiteral("rId%1").arg(m_drawing->relationships()->count()));
|
||||
writer.writeStartElement(QStringLiteral("a:stretch"));
|
||||
writer.writeEmptyElement(QStringLiteral("a:fillRect"));
|
||||
writer.writeEndElement(); //a:stretch
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
QT_BEGIN_NAMESPACE_XLSX
|
||||
|
||||
OOXmlFilePrivate::OOXmlFilePrivate(OOXmlFile *q)
|
||||
:q_ptr(q)
|
||||
:q_ptr(q), relationships(new Relationships)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -63,6 +63,8 @@ OOXmlFile::OOXmlFile(OOXmlFilePrivate *d)
|
||||
|
||||
OOXmlFile::~OOXmlFile()
|
||||
{
|
||||
if (d_ptr->relationships)
|
||||
delete d_ptr->relationships;
|
||||
delete d_ptr;
|
||||
}
|
||||
|
||||
@@ -103,4 +105,15 @@ QString OOXmlFile::filePath() const
|
||||
return d->filePathInPackage;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
*/
|
||||
Relationships *OOXmlFile::relationships() const
|
||||
{
|
||||
Q_D(const OOXmlFile);
|
||||
return d->relationships;
|
||||
}
|
||||
|
||||
|
||||
QT_END_NAMESPACE_XLSX
|
||||
|
||||
@@ -32,7 +32,7 @@ class QIODevice;
|
||||
class QByteArray;
|
||||
|
||||
QT_BEGIN_NAMESPACE_XLSX
|
||||
|
||||
class Relationships;
|
||||
class OOXmlFilePrivate;
|
||||
|
||||
class Q_XLSX_EXPORT OOXmlFile
|
||||
@@ -47,6 +47,8 @@ public:
|
||||
virtual QByteArray saveToXmlData() const;
|
||||
virtual bool loadFromXmlData(const QByteArray &data);
|
||||
|
||||
Relationships *relationships() const;
|
||||
|
||||
void setFilePath(const QString path);
|
||||
QString filePath() const;
|
||||
protected:
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
//
|
||||
|
||||
#include "xlsxooxmlfile.h"
|
||||
#include "xlsxrelationships_p.h"
|
||||
|
||||
#include <QString>
|
||||
|
||||
QT_BEGIN_NAMESPACE_XLSX
|
||||
@@ -52,7 +54,7 @@ public:
|
||||
|
||||
QString filePathInPackage;//such as "xl/worksheets/sheet1.xml"
|
||||
//used when load the .xlsx file
|
||||
|
||||
Relationships *relationships;
|
||||
OOXmlFile *q_ptr;
|
||||
};
|
||||
|
||||
|
||||
@@ -387,14 +387,14 @@ QList<Drawing *> Workbook::drawings()
|
||||
void Workbook::saveToXmlFile(QIODevice *device) const
|
||||
{
|
||||
Q_D(const Workbook);
|
||||
d->relationships.clear();
|
||||
d->relationships->clear();
|
||||
|
||||
for (int i=0; i<sheetCount(); ++i)
|
||||
d->relationships.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"));
|
||||
d->relationships->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"));
|
||||
d->relationships->addDocumentRelationship(QStringLiteral("/sharedStrings"), QStringLiteral("sharedStrings.xml"));
|
||||
|
||||
QXmlStreamWriter writer(device);
|
||||
|
||||
@@ -488,7 +488,7 @@ bool Workbook::loadFromXmlFile(QIODevice *device)
|
||||
// if (attributes.hasAttribute(QLatin1String("state")))
|
||||
// QString state = attributes.value(QLatin1String("state")).toString();
|
||||
|
||||
XlsxRelationship relationship = d->relationships.getRelationshipById(rId);
|
||||
XlsxRelationship relationship = d->relationships->getRelationshipById(rId);
|
||||
|
||||
AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet;
|
||||
if (relationship.type.endsWith(QLatin1String("/worksheet")))
|
||||
@@ -550,15 +550,6 @@ bool Workbook::loadFromXmlFile(QIODevice *device)
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
*/
|
||||
Relationships &Workbook::relationships()
|
||||
{
|
||||
Q_D(Workbook);
|
||||
return d->relationships;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
*/
|
||||
|
||||
@@ -93,7 +93,6 @@ private:
|
||||
|
||||
void saveToXmlFile(QIODevice *device) const;
|
||||
bool loadFromXmlFile(QIODevice *device);
|
||||
Relationships &relationships();
|
||||
|
||||
SharedStrings *sharedStrings() const;
|
||||
Styles *styles();
|
||||
|
||||
@@ -70,8 +70,6 @@ class WorkbookPrivate : public OOXmlFilePrivate
|
||||
public:
|
||||
WorkbookPrivate(Workbook *q);
|
||||
|
||||
mutable Relationships relationships;
|
||||
|
||||
QSharedPointer<SharedStrings> sharedStrings;
|
||||
QList<QSharedPointer<AbstractSheet> > sheets;
|
||||
QStringList sheetNames;
|
||||
|
||||
@@ -1188,7 +1188,7 @@ QList<CellRange> Worksheet::mergedCells() const
|
||||
void Worksheet::saveToXmlFile(QIODevice *device) const
|
||||
{
|
||||
Q_D(const Worksheet);
|
||||
d->relationships.clear();
|
||||
d->relationships->clear();
|
||||
|
||||
QXmlStreamWriter writer(device);
|
||||
|
||||
@@ -1467,9 +1467,9 @@ void WorksheetPrivate::saveXmlHyperlinks(QXmlStreamWriter &writer) const
|
||||
writer.writeAttribute(QStringLiteral("ref"), ref);
|
||||
if (data->linkType == XlsxHyperlinkData::External) {
|
||||
//Update relationships
|
||||
relationships.addWorksheetRelationship(QStringLiteral("/hyperlink"), data->target, QStringLiteral("External"));
|
||||
relationships->addWorksheetRelationship(QStringLiteral("/hyperlink"), data->target, QStringLiteral("External"));
|
||||
|
||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count()));
|
||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships->count()));
|
||||
}
|
||||
|
||||
if (!data->location.isEmpty())
|
||||
@@ -1490,10 +1490,10 @@ void WorksheetPrivate::saveXmlDrawings(QXmlStreamWriter &writer) const
|
||||
return;
|
||||
|
||||
int idx = workbook->drawings().indexOf(drawing.data());
|
||||
relationships.addWorksheetRelationship(QStringLiteral("/drawing"), QStringLiteral("../drawings/drawing%1.xml").arg(idx+1));
|
||||
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(relationships.count()));
|
||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships->count()));
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -2083,7 +2083,7 @@ void WorksheetPrivate::loadXmlHyperlinks(QXmlStreamReader &reader)
|
||||
|
||||
if (attrs.hasAttribute(QLatin1String("r:id"))) {
|
||||
link->linkType = XlsxHyperlinkData::External;
|
||||
XlsxRelationship ship = relationships.getRelationshipById(attrs.value(QLatin1String("r:id")).toString());
|
||||
XlsxRelationship ship = relationships->getRelationshipById(attrs.value(QLatin1String("r:id")).toString());
|
||||
link->target = ship.target;
|
||||
} else {
|
||||
link->linkType = XlsxHyperlinkData::Internal;
|
||||
@@ -2127,7 +2127,7 @@ bool Worksheet::loadFromXmlFile(QIODevice *device)
|
||||
d->loadXmlHyperlinks(reader);
|
||||
} else if (reader.name() == QLatin1String("drawing")) {
|
||||
QString rId = reader.attributes().value(QStringLiteral("r:id")).toString();
|
||||
QString name = d->relationships.getRelationshipById(rId).target;
|
||||
QString name = d->relationships->getRelationshipById(rId).target;
|
||||
QString path = QDir::cleanPath(splitPath(filePath())[0] + QLatin1String("/") + name);
|
||||
d->drawing = QSharedPointer<Drawing>(new Drawing(this));
|
||||
d->drawing->setFilePath(path);
|
||||
|
||||
Reference in New Issue
Block a user