Make relationships as a property of OOXmlFile

This commit is contained in:
Debao Zhang
2014-02-26 10:49:28 +08:00
parent 02e032152d
commit 14edb0f001
14 changed files with 52 additions and 61 deletions
-9
View File
@@ -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
-2
View File
@@ -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;
-2
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -46,7 +46,7 @@ Drawing::~Drawing()
void Drawing::saveToXmlFile(QIODevice *device) const
{
relationships.clear();
relationships()->clear();
QXmlStreamWriter writer(device);
-1
View File
@@ -65,7 +65,6 @@ public:
Worksheet *worksheet;
Workbook *workbook;
QList<DrawingAnchor *> anchors;
mutable Relationships relationships;
};
} // namespace QXlsx
+6 -6
View File
@@ -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
+14 -1
View File
@@ -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
+3 -1
View File
@@ -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:
+3 -1
View File
@@ -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;
};
+6 -15
View File
@@ -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
*/
-1
View File
@@ -93,7 +93,6 @@ private:
void saveToXmlFile(QIODevice *device) const;
bool loadFromXmlFile(QIODevice *device);
Relationships &relationships();
SharedStrings *sharedStrings() const;
Styles *styles();
-2
View File
@@ -70,8 +70,6 @@ class WorkbookPrivate : public OOXmlFilePrivate
public:
WorkbookPrivate(Workbook *q);
mutable Relationships relationships;
QSharedPointer<SharedStrings> sharedStrings;
QList<QSharedPointer<AbstractSheet> > sheets;
QStringList sheetNames;
+7 -7
View File
@@ -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);