Coding refactoring: Make worksheet relations part of the worksheet
sheet1.xml _rels/sheet1.xml.rels
This commit is contained in:
@@ -181,10 +181,12 @@ bool Package::parsePackage(QIODevice *packageDevice)
|
||||
|
||||
for (int i=0; i<sheetNameIdPairList.size(); ++i) {
|
||||
XlsxSheetItemInfo info = sheetNameIdPairList[i];
|
||||
QString worksheet_rId = info.rId;
|
||||
QString name = xlworkbook_Rels.getRelationshipById(worksheet_rId).target;
|
||||
QString worksheet_path = xlworkbook_Dir + QLatin1String("/") + name;
|
||||
QString worksheet_path = xlworkbook_Dir + QLatin1String("/") + xlworkbook_Rels.getRelationshipById(info.rId).target;
|
||||
QString rel_path = getRelFilePath(worksheet_path);
|
||||
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));
|
||||
}
|
||||
|
||||
@@ -215,8 +217,6 @@ bool Package::createPackage(QIODevice *package)
|
||||
writeThemeFile(zipWriter);
|
||||
writeRootRelsFile(zipWriter);
|
||||
writeWorkbookRelsFile(zipWriter);
|
||||
writeWorksheetRelsFiles(zipWriter);
|
||||
// writeChartsheetRelsFile(zipWriter);
|
||||
writeDrawingRelsFiles(zipWriter);
|
||||
writeImageFiles(zipWriter);
|
||||
// writeVbaProjectFiles(zipWriter);
|
||||
@@ -233,6 +233,7 @@ void Package::writeWorksheetFiles(ZipWriter &zipWriter)
|
||||
continue;
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
for (int i=0; i<m_workbook->worksheetCount(); ++i) {
|
||||
|
||||
@@ -76,8 +76,6 @@ private:
|
||||
void writeThemeFile(ZipWriter &zipWriter);
|
||||
void writeRootRelsFile(ZipWriter &zipWriter);
|
||||
void writeWorkbookRelsFile(ZipWriter &zipWriter);
|
||||
void writeWorksheetRelsFiles(ZipWriter &zipWriter);
|
||||
// void writeChartsheetRelsFile(ZipWriter &zipWriter);
|
||||
void writeDrawingRelsFiles(ZipWriter &zipWriter);
|
||||
void writeImageFiles(ZipWriter &zipWriter);
|
||||
// void writeVbaProjectFiles(ZipWriter &zipWriter);
|
||||
|
||||
@@ -54,6 +54,19 @@ QStringList splitPath(const QString &path)
|
||||
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)
|
||||
{
|
||||
//Note, for number 0, Excel2007 shown as 1900-1-0, which should be 1899-12-31
|
||||
|
||||
@@ -48,6 +48,8 @@ namespace QXlsx {
|
||||
|
||||
XLSX_AUTOTEST_EXPORT int intPow(int x, int p);
|
||||
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 QDateTime datetimeFromNumber(double num, bool is1904=false);
|
||||
XLSX_AUTOTEST_EXPORT double timeToNumber(const QTime &t);
|
||||
|
||||
@@ -373,7 +373,6 @@ QList<Drawing *> Workbook::drawings()
|
||||
void Workbook::prepareDrawings()
|
||||
{
|
||||
Q_D(Workbook);
|
||||
int drawing_id = 0;
|
||||
int image_ref_id = 0;
|
||||
d->images.clear();
|
||||
d->drawings.clear();
|
||||
@@ -386,10 +385,9 @@ void Workbook::prepareDrawings()
|
||||
sheet->clearExtraDrawingInfo();
|
||||
|
||||
//At present, only picture type supported
|
||||
drawing_id += 1;
|
||||
for (int idx = 0; idx < sheet->images().size(); ++idx) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
+18
-24
@@ -244,6 +244,12 @@ void Worksheet::setSheetName(const QString &sheetName)
|
||||
d->name = sheetName;
|
||||
}
|
||||
|
||||
Relationships &Worksheet::relationships()
|
||||
{
|
||||
Q_D(Worksheet);
|
||||
return d->relationships;
|
||||
}
|
||||
|
||||
bool Worksheet::isHidden() const
|
||||
{
|
||||
Q_D(const Worksheet);
|
||||
@@ -445,19 +451,6 @@ void Worksheet::setWhiteSpaceVisible(bool 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
|
||||
{
|
||||
Q_D(const Worksheet);
|
||||
@@ -1129,6 +1122,8 @@ int Worksheet::unmergeCells(const QString &range)
|
||||
void Worksheet::saveToXmlFile(QIODevice *device)
|
||||
{
|
||||
Q_D(Worksheet);
|
||||
d->relationships.clear();
|
||||
|
||||
QXmlStreamWriter writer(device);
|
||||
|
||||
writer.writeStartDocument(QStringLiteral("1.0"), true);
|
||||
@@ -1391,9 +1386,6 @@ void WorksheetPrivate::writeHyperlinks(QXmlStreamWriter &writer)
|
||||
if (urlTable.isEmpty())
|
||||
return;
|
||||
|
||||
int rel_count = 0;
|
||||
externUrlList.clear();
|
||||
|
||||
writer.writeStartElement(QStringLiteral("hyperlinks"));
|
||||
QMapIterator<int, QMap<int, XlsxUrlData *> > it(urlTable);
|
||||
while (it.hasNext()) {
|
||||
@@ -1408,9 +1400,11 @@ void WorksheetPrivate::writeHyperlinks(QXmlStreamWriter &writer)
|
||||
writer.writeEmptyElement(QStringLiteral("hyperlink"));
|
||||
writer.writeAttribute(QStringLiteral("ref"), ref);
|
||||
if (data->linkType == XlsxUrlData::External) {
|
||||
rel_count += 1;
|
||||
externUrlList.append(data->url);
|
||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(rel_count));
|
||||
|
||||
//Update relationships
|
||||
relationships.addWorksheetRelationship(QStringLiteral("/hyperlink"), data->url, QStringLiteral("External"));
|
||||
|
||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count()));
|
||||
if (!data->location.isEmpty())
|
||||
writer.writeAttribute(QStringLiteral("location"), data->location);
|
||||
if (!data->display.isEmpty())
|
||||
@@ -1434,9 +1428,11 @@ void WorksheetPrivate::writeDrawings(QXmlStreamWriter &writer)
|
||||
if (!drawing)
|
||||
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.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) {
|
||||
delete d->drawing;
|
||||
d->drawing = 0;
|
||||
d->externDrawingList.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);
|
||||
if (!d->drawing) {
|
||||
d->drawing = new Drawing;
|
||||
d->drawing->embedded = true;
|
||||
d->externDrawingList.append(QStringLiteral("../drawings/drawing%1.xml").arg(drawing_id));
|
||||
}
|
||||
|
||||
XlsxImageData *imageData = d->imageList[index];
|
||||
|
||||
@@ -49,6 +49,7 @@ class ConditionalFormatting;
|
||||
class CellRange;
|
||||
struct XlsxImageData;
|
||||
class RichString;
|
||||
class Relationships;
|
||||
|
||||
class WorksheetPrivate;
|
||||
class Q_XLSX_EXPORT Worksheet
|
||||
@@ -136,6 +137,7 @@ private:
|
||||
Worksheet(const QString &sheetName, int sheetId, Workbook *book);
|
||||
QSharedPointer<Worksheet> copy(const QString &distName, int distId) const;
|
||||
void setSheetName(const QString &sheetName);
|
||||
Relationships &relationships();
|
||||
|
||||
void saveToXmlFile(QIODevice *device);
|
||||
QByteArray saveToXmlData();
|
||||
@@ -146,12 +148,10 @@ private:
|
||||
bool isHidden() const;
|
||||
void setHidden(bool hidden);
|
||||
int sheetId() const;
|
||||
QStringList externUrlList() const;
|
||||
QStringList externDrawingList() const;
|
||||
QList<QPair<QString, QString> > drawingLinks() const;
|
||||
Drawing *drawing() const;
|
||||
QList<XlsxImageData *> images() const;
|
||||
void prepareImage(int index, int image_id, int drawing_id);
|
||||
void prepareImage(int index, int image_id);
|
||||
void clearExtraDrawingInfo();
|
||||
|
||||
WorksheetPrivate * const d_ptr;
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "xlsxcell.h"
|
||||
#include "xlsxdatavalidation.h"
|
||||
#include "xlsxconditionalformatting.h"
|
||||
#include "xlsxrelationships_p.h"
|
||||
|
||||
#include <QImage>
|
||||
#include <QSharedPointer>
|
||||
@@ -205,13 +206,12 @@ public:
|
||||
|
||||
Worksheet *q_ptr;
|
||||
Workbook *workbook;
|
||||
mutable Relationships relationships;
|
||||
Drawing *drawing;
|
||||
QMap<int, QMap<int, QSharedPointer<Cell> > > cellTable;
|
||||
QMap<int, QMap<int, QString> > comments;
|
||||
QMap<int, QMap<int, XlsxUrlData *> > urlTable;
|
||||
QList<CellRange> merges;
|
||||
QStringList externUrlList;
|
||||
QStringList externDrawingList;
|
||||
QList<XlsxImageData *> imageList;
|
||||
QMap<int, QSharedPointer<XlsxRowInfo> > rowsInfo;
|
||||
QMap<int, QSharedPointer<XlsxColumnInfo> > colsInfo;
|
||||
|
||||
Reference in New Issue
Block a user