Browse Source

Coding refactoring: Make worksheet relations part of the worksheet

sheet1.xml
_rels/sheet1.xml.rels
master
Debao Zhang 11 years ago
parent
commit
336a9ff1a9
  1. 28
      src/xlsx/xlsxpackage.cpp
  2. 2
      src/xlsx/xlsxpackage_p.h
  3. 13
      src/xlsx/xlsxutility.cpp
  4. 2
      src/xlsx/xlsxutility_p.h
  5. 4
      src/xlsx/xlsxworkbook.cpp
  6. 42
      src/xlsx/xlsxworksheet.cpp
  7. 6
      src/xlsx/xlsxworksheet.h
  8. 4
      src/xlsx/xlsxworksheet_p.h

28
src/xlsx/xlsxpackage.cpp

@ -181,10 +181,12 @@ bool Package::parsePackage(QIODevice *packageDevice)
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_rId = info.rId; QString worksheet_path = xlworkbook_Dir + QLatin1String("/") + xlworkbook_Rels.getRelationshipById(info.rId).target;
QString name = xlworkbook_Rels.getRelationshipById(worksheet_rId).target; QString rel_path = getRelFilePath(worksheet_path);
QString worksheet_path = xlworkbook_Dir + QLatin1String("/") + name;
Worksheet *sheet = m_document->workbook()->addWorksheet(info.name, info.sheetId); Worksheet *sheet = m_document->workbook()->addWorksheet(info.name, info.sheetId);
//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)); sheet->loadFromXmlData(zipReader.fileData(worksheet_path));
} }
@ -215,8 +217,6 @@ bool Package::createPackage(QIODevice *package)
writeThemeFile(zipWriter); writeThemeFile(zipWriter);
writeRootRelsFile(zipWriter); writeRootRelsFile(zipWriter);
writeWorkbookRelsFile(zipWriter); writeWorkbookRelsFile(zipWriter);
writeWorksheetRelsFiles(zipWriter);
// writeChartsheetRelsFile(zipWriter);
writeDrawingRelsFiles(zipWriter); writeDrawingRelsFiles(zipWriter);
writeImageFiles(zipWriter); writeImageFiles(zipWriter);
// writeVbaProjectFiles(zipWriter); // writeVbaProjectFiles(zipWriter);
@ -233,6 +233,7 @@ void Package::writeWorksheetFiles(ZipWriter &zipWriter)
continue; continue;
zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData());
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), sheet->relationships().saveToXmlData());
} }
} }
@ -377,23 +378,6 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter)
zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), rels.saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), rels.saveToXmlData());
} }
void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter)
{
for (int i=0; i<m_workbook->worksheetCount(); ++i) {
Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->isChartsheet())
continue;
Relationships rels;
foreach (QString link, sheet->externUrlList())
rels.addWorksheetRelationship(QStringLiteral("/hyperlink"), link, QStringLiteral("External"));
foreach (QString link, sheet->externDrawingList())
rels.addWorksheetRelationship(QStringLiteral("/drawing"), link);
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rels.saveToXmlData());
}
}
void Package::writeDrawingRelsFiles(ZipWriter &zipWriter) void Package::writeDrawingRelsFiles(ZipWriter &zipWriter)
{ {
for (int i=0; i<m_workbook->worksheetCount(); ++i) { for (int i=0; i<m_workbook->worksheetCount(); ++i) {

2
src/xlsx/xlsxpackage_p.h

@ -76,8 +76,6 @@ private:
void writeThemeFile(ZipWriter &zipWriter); void writeThemeFile(ZipWriter &zipWriter);
void writeRootRelsFile(ZipWriter &zipWriter); void writeRootRelsFile(ZipWriter &zipWriter);
void writeWorkbookRelsFile(ZipWriter &zipWriter); void writeWorkbookRelsFile(ZipWriter &zipWriter);
void writeWorksheetRelsFiles(ZipWriter &zipWriter);
// void writeChartsheetRelsFile(ZipWriter &zipWriter);
void writeDrawingRelsFiles(ZipWriter &zipWriter); void writeDrawingRelsFiles(ZipWriter &zipWriter);
void writeImageFiles(ZipWriter &zipWriter); void writeImageFiles(ZipWriter &zipWriter);
// void writeVbaProjectFiles(ZipWriter &zipWriter); // void writeVbaProjectFiles(ZipWriter &zipWriter);

13
src/xlsx/xlsxutility.cpp

@ -54,6 +54,19 @@ QStringList splitPath(const QString &path)
return QStringList()<<path.left(idx)<<path.mid(idx+1); return QStringList()<<path.left(idx)<<path.mid(idx+1);
} }
/*
* Return the .rel file path based on filePath
*/
QString getRelFilePath(const QString &filePath)
{
int idx = filePath.lastIndexOf(QLatin1Char('/'));
if (idx == -1)
return QString();
return QString(filePath.left(idx) + QLatin1String("/_rel/")
+ filePath.mid(idx+1) + QLatin1String(".rel"));
}
double datetimeToNumber(const QDateTime &dt, bool is1904) double datetimeToNumber(const QDateTime &dt, bool is1904)
{ {
//Note, for number 0, Excel2007 shown as 1900-1-0, which should be 1899-12-31 //Note, for number 0, Excel2007 shown as 1900-1-0, which should be 1899-12-31

2
src/xlsx/xlsxutility_p.h

@ -48,6 +48,8 @@ namespace QXlsx {
XLSX_AUTOTEST_EXPORT int intPow(int x, int p); XLSX_AUTOTEST_EXPORT int intPow(int x, int p);
XLSX_AUTOTEST_EXPORT QStringList splitPath(const QString &path); XLSX_AUTOTEST_EXPORT QStringList splitPath(const QString &path);
XLSX_AUTOTEST_EXPORT QString getRelFilePath(const QString &filePath);
XLSX_AUTOTEST_EXPORT double datetimeToNumber(const QDateTime &dt, bool is1904=false); XLSX_AUTOTEST_EXPORT double datetimeToNumber(const QDateTime &dt, bool is1904=false);
XLSX_AUTOTEST_EXPORT QDateTime datetimeFromNumber(double num, bool is1904=false); XLSX_AUTOTEST_EXPORT QDateTime datetimeFromNumber(double num, bool is1904=false);
XLSX_AUTOTEST_EXPORT double timeToNumber(const QTime &t); XLSX_AUTOTEST_EXPORT double timeToNumber(const QTime &t);

4
src/xlsx/xlsxworkbook.cpp

@ -373,7 +373,6 @@ QList<Drawing *> Workbook::drawings()
void Workbook::prepareDrawings() void Workbook::prepareDrawings()
{ {
Q_D(Workbook); Q_D(Workbook);
int drawing_id = 0;
int image_ref_id = 0; int image_ref_id = 0;
d->images.clear(); d->images.clear();
d->drawings.clear(); d->drawings.clear();
@ -386,10 +385,9 @@ void Workbook::prepareDrawings()
sheet->clearExtraDrawingInfo(); sheet->clearExtraDrawingInfo();
//At present, only picture type supported //At present, only picture type supported
drawing_id += 1;
for (int idx = 0; idx < sheet->images().size(); ++idx) { for (int idx = 0; idx < sheet->images().size(); ++idx) {
image_ref_id += 1; image_ref_id += 1;
sheet->prepareImage(idx, image_ref_id, drawing_id); sheet->prepareImage(idx, image_ref_id);
d->images.append(sheet->images()[idx]->image); d->images.append(sheet->images()[idx]->image);
} }

42
src/xlsx/xlsxworksheet.cpp

@ -244,6 +244,12 @@ void Worksheet::setSheetName(const QString &sheetName)
d->name = sheetName; d->name = sheetName;
} }
Relationships &Worksheet::relationships()
{
Q_D(Worksheet);
return d->relationships;
}
bool Worksheet::isHidden() const bool Worksheet::isHidden() const
{ {
Q_D(const Worksheet); Q_D(const Worksheet);
@ -445,19 +451,6 @@ void Worksheet::setWhiteSpaceVisible(bool visible)
d->showWhiteSpace = visible; d->showWhiteSpace = visible;
} }
QStringList Worksheet::externUrlList() const
{
Q_D(const Worksheet);
return d->externUrlList;
}
QStringList Worksheet::externDrawingList() const
{
Q_D(const Worksheet);
return d->externDrawingList;
}
QList<QPair<QString, QString> > Worksheet::drawingLinks() const QList<QPair<QString, QString> > Worksheet::drawingLinks() const
{ {
Q_D(const Worksheet); Q_D(const Worksheet);
@ -1129,6 +1122,8 @@ int Worksheet::unmergeCells(const QString &range)
void Worksheet::saveToXmlFile(QIODevice *device) void Worksheet::saveToXmlFile(QIODevice *device)
{ {
Q_D(Worksheet); Q_D(Worksheet);
d->relationships.clear();
QXmlStreamWriter writer(device); QXmlStreamWriter writer(device);
writer.writeStartDocument(QStringLiteral("1.0"), true); writer.writeStartDocument(QStringLiteral("1.0"), true);
@ -1391,9 +1386,6 @@ void WorksheetPrivate::writeHyperlinks(QXmlStreamWriter &writer)
if (urlTable.isEmpty()) if (urlTable.isEmpty())
return; return;
int rel_count = 0;
externUrlList.clear();
writer.writeStartElement(QStringLiteral("hyperlinks")); writer.writeStartElement(QStringLiteral("hyperlinks"));
QMapIterator<int, QMap<int, XlsxUrlData *> > it(urlTable); QMapIterator<int, QMap<int, XlsxUrlData *> > it(urlTable);
while (it.hasNext()) { while (it.hasNext()) {
@ -1408,9 +1400,11 @@ void WorksheetPrivate::writeHyperlinks(QXmlStreamWriter &writer)
writer.writeEmptyElement(QStringLiteral("hyperlink")); writer.writeEmptyElement(QStringLiteral("hyperlink"));
writer.writeAttribute(QStringLiteral("ref"), ref); writer.writeAttribute(QStringLiteral("ref"), ref);
if (data->linkType == XlsxUrlData::External) { if (data->linkType == XlsxUrlData::External) {
rel_count += 1;
externUrlList.append(data->url); //Update relationships
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(rel_count)); relationships.addWorksheetRelationship(QStringLiteral("/hyperlink"), data->url, QStringLiteral("External"));
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count()));
if (!data->location.isEmpty()) if (!data->location.isEmpty())
writer.writeAttribute(QStringLiteral("location"), data->location); writer.writeAttribute(QStringLiteral("location"), data->location);
if (!data->display.isEmpty()) if (!data->display.isEmpty())
@ -1434,9 +1428,11 @@ void WorksheetPrivate::writeDrawings(QXmlStreamWriter &writer)
if (!drawing) if (!drawing)
return; return;
int index = externUrlList.size() + 1; int idx = workbook->drawings().indexOf(drawing);
relationships.addWorksheetRelationship(QStringLiteral("/drawing"), QStringLiteral("../drawings/drawing%1.xml").arg(idx+1));
writer.writeEmptyElement(QStringLiteral("drawing")); writer.writeEmptyElement(QStringLiteral("drawing"));
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(index)); writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count()));
} }
/*! /*!
@ -1692,18 +1688,16 @@ void Worksheet::clearExtraDrawingInfo()
if (d->drawing) { if (d->drawing) {
delete d->drawing; delete d->drawing;
d->drawing = 0; d->drawing = 0;
d->externDrawingList.clear();
d->drawingLinks.clear(); d->drawingLinks.clear();
} }
} }
void Worksheet::prepareImage(int index, int image_id, int drawing_id) void Worksheet::prepareImage(int index, int image_id)
{ {
Q_D(Worksheet); Q_D(Worksheet);
if (!d->drawing) { if (!d->drawing) {
d->drawing = new Drawing; d->drawing = new Drawing;
d->drawing->embedded = true; d->drawing->embedded = true;
d->externDrawingList.append(QStringLiteral("../drawings/drawing%1.xml").arg(drawing_id));
} }
XlsxImageData *imageData = d->imageList[index]; XlsxImageData *imageData = d->imageList[index];

6
src/xlsx/xlsxworksheet.h

@ -49,6 +49,7 @@ class ConditionalFormatting;
class CellRange; class CellRange;
struct XlsxImageData; struct XlsxImageData;
class RichString; class RichString;
class Relationships;
class WorksheetPrivate; class WorksheetPrivate;
class Q_XLSX_EXPORT Worksheet class Q_XLSX_EXPORT Worksheet
@ -136,6 +137,7 @@ private:
Worksheet(const QString &sheetName, int sheetId, Workbook *book); Worksheet(const QString &sheetName, int sheetId, Workbook *book);
QSharedPointer<Worksheet> copy(const QString &distName, int distId) const; QSharedPointer<Worksheet> copy(const QString &distName, int distId) const;
void setSheetName(const QString &sheetName); void setSheetName(const QString &sheetName);
Relationships &relationships();
void saveToXmlFile(QIODevice *device); void saveToXmlFile(QIODevice *device);
QByteArray saveToXmlData(); QByteArray saveToXmlData();
@ -146,12 +148,10 @@ private:
bool isHidden() const; bool isHidden() const;
void setHidden(bool hidden); void setHidden(bool hidden);
int sheetId() const; int sheetId() const;
QStringList externUrlList() const;
QStringList externDrawingList() const;
QList<QPair<QString, QString> > drawingLinks() const; QList<QPair<QString, QString> > drawingLinks() const;
Drawing *drawing() const; Drawing *drawing() const;
QList<XlsxImageData *> images() const; QList<XlsxImageData *> images() const;
void prepareImage(int index, int image_id, int drawing_id); void prepareImage(int index, int image_id);
void clearExtraDrawingInfo(); void clearExtraDrawingInfo();
WorksheetPrivate * const d_ptr; WorksheetPrivate * const d_ptr;

4
src/xlsx/xlsxworksheet_p.h

@ -41,6 +41,7 @@
#include "xlsxcell.h" #include "xlsxcell.h"
#include "xlsxdatavalidation.h" #include "xlsxdatavalidation.h"
#include "xlsxconditionalformatting.h" #include "xlsxconditionalformatting.h"
#include "xlsxrelationships_p.h"
#include <QImage> #include <QImage>
#include <QSharedPointer> #include <QSharedPointer>
@ -205,13 +206,12 @@ public:
Worksheet *q_ptr; Worksheet *q_ptr;
Workbook *workbook; Workbook *workbook;
mutable Relationships relationships;
Drawing *drawing; Drawing *drawing;
QMap<int, QMap<int, QSharedPointer<Cell> > > cellTable; QMap<int, QMap<int, QSharedPointer<Cell> > > cellTable;
QMap<int, QMap<int, QString> > comments; QMap<int, QMap<int, QString> > comments;
QMap<int, QMap<int, XlsxUrlData *> > urlTable; QMap<int, QMap<int, XlsxUrlData *> > urlTable;
QList<CellRange> merges; QList<CellRange> merges;
QStringList externUrlList;
QStringList externDrawingList;
QList<XlsxImageData *> imageList; QList<XlsxImageData *> imageList;
QMap<int, QSharedPointer<XlsxRowInfo> > rowsInfo; QMap<int, QSharedPointer<XlsxRowInfo> > rowsInfo;
QMap<int, QSharedPointer<XlsxColumnInfo> > colsInfo; QMap<int, QSharedPointer<XlsxColumnInfo> > colsInfo;

Loading…
Cancel
Save