Browse Source

Code refactoring: relationships of workbook

master
Debao Zhang 11 years ago
parent
commit
ea339b2c73
  1. 23
      src/xlsx/xlsxdocument.cpp
  2. 18
      src/xlsx/xlsxworkbook.cpp
  3. 2
      src/xlsx/xlsxworkbook.h
  4. 3
      src/xlsx/xlsxworkbook_p.h

23
src/xlsx/xlsxdocument.cpp

@ -137,14 +137,12 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
QString xlworkbook_Path = rels_xl[0].target; QString xlworkbook_Path = rels_xl[0].target;
QStringList xlworkbook_PathList = splitPath(xlworkbook_Path); QStringList xlworkbook_PathList = splitPath(xlworkbook_Path);
QString xlworkbook_Dir = xlworkbook_PathList[0]; QString xlworkbook_Dir = xlworkbook_PathList[0];
QString xlworkbook_Name = xlworkbook_PathList[1]; workbook->relationships().loadFromXmlData(zipReader.fileData(getRelFilePath(xlworkbook_Path)));
workbook->loadFromXmlData(zipReader.fileData(xlworkbook_Path)); workbook->loadFromXmlData(zipReader.fileData(xlworkbook_Path));
QList<XlsxSheetItemInfo> sheetNameIdPairList = workbook->d_func()->sheetItemInfoList; QList<XlsxSheetItemInfo> sheetNameIdPairList = workbook->d_func()->sheetItemInfoList;
Relationships xlworkbook_Rels;
xlworkbook_Rels.loadFromXmlData(zipReader.fileData(xlworkbook_Dir+QStringLiteral("/_rels/")+xlworkbook_Name+QStringLiteral(".rels")));
//load styles //load styles
QList<XlsxRelationship> rels_styles = xlworkbook_Rels.documentRelationships(QStringLiteral("/styles")); QList<XlsxRelationship> rels_styles = workbook->relationships().documentRelationships(QStringLiteral("/styles"));
if (!rels_styles.isEmpty()) { if (!rels_styles.isEmpty()) {
//In normal case this should be styles.xml which in xl //In normal case this should be styles.xml which in xl
QString name = rels_styles[0].target; QString name = rels_styles[0].target;
@ -155,7 +153,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
} }
//load sharedStrings //load sharedStrings
QList<XlsxRelationship> rels_sharedStrings = xlworkbook_Rels.documentRelationships(QStringLiteral("/sharedStrings")); QList<XlsxRelationship> rels_sharedStrings = workbook->relationships().documentRelationships(QStringLiteral("/sharedStrings"));
if (!rels_sharedStrings.isEmpty()) { if (!rels_sharedStrings.isEmpty()) {
//In normal case this should be sharedStrings.xml which in xl //In normal case this should be sharedStrings.xml which in xl
QString name = rels_sharedStrings[0].target; QString name = rels_sharedStrings[0].target;
@ -164,7 +162,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
} }
//load theme //load theme
QList<XlsxRelationship> rels_theme = xlworkbook_Rels.documentRelationships(QStringLiteral("/theme")); QList<XlsxRelationship> rels_theme = workbook->relationships().documentRelationships(QStringLiteral("/theme"));
if (!rels_theme.isEmpty()) { if (!rels_theme.isEmpty()) {
//In normal case this should be theme/theme1.xml which in xl //In normal case this should be theme/theme1.xml which in xl
QString name = rels_theme[0].target; QString name = rels_theme[0].target;
@ -173,13 +171,13 @@ bool DocumentPrivate::loadPackage(QIODevice *device)
} }
//load worksheets //load worksheets
QList<XlsxRelationship> rels_worksheets = xlworkbook_Rels.documentRelationships(QStringLiteral("/worksheet")); QList<XlsxRelationship> rels_worksheets = workbook->relationships().documentRelationships(QStringLiteral("/worksheet"));
if (rels_worksheets.isEmpty()) if (rels_worksheets.isEmpty())
return false; return false;
for (int i=0; i<sheetNameIdPairList.size(); ++i) { for (int i=0; i<sheetNameIdPairList.size(); ++i) {
XlsxSheetItemInfo info = sheetNameIdPairList[i]; XlsxSheetItemInfo info = sheetNameIdPairList[i];
QString worksheet_path = xlworkbook_Dir + QLatin1String("/") + xlworkbook_Rels.getRelationshipById(info.rId).target; QString worksheet_path = xlworkbook_Dir + QLatin1String("/") + workbook->relationships().getRelationshipById(info.rId).target;
QString rel_path = getRelFilePath(worksheet_path); QString rel_path = getRelFilePath(worksheet_path);
Worksheet *sheet = workbook->addWorksheet(info.name, info.sheetId); Worksheet *sheet = workbook->addWorksheet(info.name, info.sheetId);
//If the .rel file exists, load it. //If the .rel file exists, load it.
@ -219,14 +217,7 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
// save workbook xml file // save workbook xml file
zipWriter.addFile(QStringLiteral("xl/workbook.xml"), workbook->saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/workbook.xml"), workbook->saveToXmlData());
Relationships rels; zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), workbook->relationships().saveToXmlData());
for (int i=0; i<workbook->worksheetCount(); ++i)
rels.addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1));
rels.addDocumentRelationship(QStringLiteral("/theme"), QStringLiteral("theme/theme1.xml"));
rels.addDocumentRelationship(QStringLiteral("/styles"), QStringLiteral("styles.xml"));
if (!workbook->sharedStrings()->isEmpty())
rels.addDocumentRelationship(QStringLiteral("/sharedStrings"), QStringLiteral("sharedStrings.xml"));
zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), rels.saveToXmlData());
// save drawing xml files // save drawing xml files
for (int i=0; i<workbook->drawings().size(); ++i) { for (int i=0; i<workbook->drawings().size(); ++i) {

18
src/xlsx/xlsxworkbook.cpp

@ -397,6 +397,15 @@ void Workbook::prepareDrawings()
void Workbook::saveToXmlFile(QIODevice *device) const void Workbook::saveToXmlFile(QIODevice *device) const
{ {
Q_D(const Workbook); Q_D(const Workbook);
d->relationships.clear();
for (int i=0; i<worksheetCount(); ++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"));
if (!sharedStrings()->isEmpty())
d->relationships.addDocumentRelationship(QStringLiteral("/sharedStrings"), QStringLiteral("sharedStrings.xml"));
QXmlStreamWriter writer(device); QXmlStreamWriter writer(device);
writer.writeStartDocument(QStringLiteral("1.0"), true); writer.writeStartDocument(QStringLiteral("1.0"), true);
@ -554,4 +563,13 @@ bool Workbook::loadFromXmlData(const QByteArray &data)
return loadFromXmlFile(&buffer); return loadFromXmlFile(&buffer);
} }
/*!
* \internal
*/
Relationships &Workbook::relationships()
{
Q_D(Workbook);
return d->relationships;
}
QT_END_NAMESPACE_XLSX QT_END_NAMESPACE_XLSX

2
src/xlsx/xlsxworkbook.h

@ -40,6 +40,7 @@ class Styles;
class Drawing; class Drawing;
class Document; class Document;
class Theme; class Theme;
class Relationships;
class DocumentPrivate; class DocumentPrivate;
class WorkbookPrivate; class WorkbookPrivate;
@ -84,6 +85,7 @@ private:
QByteArray saveToXmlData() const; QByteArray saveToXmlData() const;
bool loadFromXmlFile(QIODevice *device); bool loadFromXmlFile(QIODevice *device);
bool loadFromXmlData(const QByteArray &data); bool loadFromXmlData(const QByteArray &data);
Relationships &relationships();
SharedStrings *sharedStrings() const; SharedStrings *sharedStrings() const;
Styles *styles(); Styles *styles();

3
src/xlsx/xlsxworkbook_p.h

@ -38,6 +38,8 @@
#include "xlsxworkbook.h" #include "xlsxworkbook.h"
#include "xlsxtheme_p.h" #include "xlsxtheme_p.h"
#include "xlsxrelationships_p.h"
#include <QSharedPointer> #include <QSharedPointer>
#include <QPair> #include <QPair>
#include <QStringList> #include <QStringList>
@ -78,6 +80,7 @@ public:
WorkbookPrivate(Workbook *q); WorkbookPrivate(Workbook *q);
Workbook *q_ptr; Workbook *q_ptr;
mutable Relationships relationships;
QSharedPointer<SharedStrings> sharedStrings; QSharedPointer<SharedStrings> sharedStrings;
QList<QSharedPointer<Worksheet> > worksheets; QList<QSharedPointer<Worksheet> > worksheets;

Loading…
Cancel
Save