Browse Source

Make relationships as a property of OOXmlFile

master
Debao Zhang 11 years ago
parent
commit
14edb0f001
  1. 9
      src/xlsx/xlsxabstractsheet.cpp
  2. 2
      src/xlsx/xlsxabstractsheet.h
  3. 2
      src/xlsx/xlsxabstractsheet_p.h
  4. 24
      src/xlsx/xlsxdocument.cpp
  5. 2
      src/xlsx/xlsxdrawing.cpp
  6. 1
      src/xlsx/xlsxdrawing_p.h
  7. 12
      src/xlsx/xlsxdrawinganchor.cpp
  8. 15
      src/xlsx/xlsxooxmlfile.cpp
  9. 4
      src/xlsx/xlsxooxmlfile.h
  10. 4
      src/xlsx/xlsxooxmlfile_p.h
  11. 21
      src/xlsx/xlsxworkbook.cpp
  12. 1
      src/xlsx/xlsxworkbook.h
  13. 2
      src/xlsx/xlsxworkbook_p.h
  14. 14
      src/xlsx/xlsxworksheet.cpp

9
src/xlsx/xlsxabstractsheet.cpp

@ -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
src/xlsx/xlsxabstractsheet.h

@ -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
src/xlsx/xlsxabstractsheet_p.h

@ -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;

24
src/xlsx/xlsxdocument.cpp

@ -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

2
src/xlsx/xlsxdrawing.cpp

@ -46,7 +46,7 @@ Drawing::~Drawing()
void Drawing::saveToXmlFile(QIODevice *device) const
{
relationships.clear();
relationships()->clear();
QXmlStreamWriter writer(device);

1
src/xlsx/xlsxdrawing_p.h

@ -65,7 +65,6 @@ public:
Worksheet *worksheet;
Workbook *workbook;
QList<DrawingAnchor *> anchors;
mutable Relationships relationships;
};
} // namespace QXlsx

12
src/xlsx/xlsxdrawinganchor.cpp

@ -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

15
src/xlsx/xlsxooxmlfile.cpp

@ -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

4
src/xlsx/xlsxooxmlfile.h

@ -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:

4
src/xlsx/xlsxooxmlfile_p.h

@ -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;
};

21
src/xlsx/xlsxworkbook.cpp

@ -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
src/xlsx/xlsxworkbook.h

@ -93,7 +93,6 @@ private:
void saveToXmlFile(QIODevice *device) const;
bool loadFromXmlFile(QIODevice *device);
Relationships &relationships();
SharedStrings *sharedStrings() const;
Styles *styles();

2
src/xlsx/xlsxworkbook_p.h

@ -70,8 +70,6 @@ class WorkbookPrivate : public OOXmlFilePrivate
public:
WorkbookPrivate(Workbook *q);
mutable Relationships relationships;
QSharedPointer<SharedStrings> sharedStrings;
QList<QSharedPointer<AbstractSheet> > sheets;
QStringList sheetNames;

14
src/xlsx/xlsxworksheet.cpp

@ -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);

Loading…
Cancel
Save