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) {
|
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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+18
-24
@@ -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];
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user