diff --git a/src/xlsx/qtxlsx.pri b/src/xlsx/qtxlsx.pri index 34ecc22..e993f9e 100755 --- a/src/xlsx/qtxlsx.pri +++ b/src/xlsx/qtxlsx.pri @@ -38,7 +38,8 @@ HEADERS += $$PWD/xlsxdocpropscore_p.h \ $$PWD/xlsxdrawinganchor_p.h \ $$PWD/xlsxmediafile_p.h \ $$PWD/xlsxooxmlfile.h \ - $$PWD/xlsxooxmlfile_p.h + $$PWD/xlsxooxmlfile_p.h \ + $$PWD/xlsxchartfile_p.h SOURCES += $$PWD/xlsxdocpropscore.cpp \ $$PWD/xlsxdocpropsapp.cpp \ @@ -64,4 +65,5 @@ SOURCES += $$PWD/xlsxdocpropscore.cpp \ $$PWD/xlsxnumformatparser.cpp \ $$PWD/xlsxdrawinganchor.cpp \ $$PWD/xlsxmediafile.cpp \ - $$PWD/xlsxooxmlfile.cpp + $$PWD/xlsxooxmlfile.cpp \ + $$PWD/xlsxchartfile.cpp diff --git a/src/xlsx/xlsxchartfile.cpp b/src/xlsx/xlsxchartfile.cpp new file mode 100644 index 0000000..5649e6a --- /dev/null +++ b/src/xlsx/xlsxchartfile.cpp @@ -0,0 +1,49 @@ +/**************************************************************************** +** Copyright (c) 2013-2014 Debao Zhang +** All right reserved. +** +** Permission is hereby granted, free of charge, to any person obtaining +** a copy of this software and associated documentation files (the +** "Software"), to deal in the Software without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Software, and to +** permit persons to whom the Software is furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +** NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +** LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +** OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +** WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +****************************************************************************/ + +#include "xlsxchartfile_p.h" + +#include +#include +#include + +namespace QXlsx { + +ChartFile::ChartFile() +{ +} + +void ChartFile::saveToXmlFile(QIODevice *device) const +{ + +} + +bool ChartFile::loadFromXmlFile(QIODevice *device) +{ + + return false; +} + +} // namespace QXlsx diff --git a/src/xlsx/xlsxchartfile_p.h b/src/xlsx/xlsxchartfile_p.h new file mode 100644 index 0000000..5a3779f --- /dev/null +++ b/src/xlsx/xlsxchartfile_p.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** Copyright (c) 2013-2014 Debao Zhang +** All right reserved. +** +** Permission is hereby granted, free of charge, to any person obtaining +** a copy of this software and associated documentation files (the +** "Software"), to deal in the Software without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Software, and to +** permit persons to whom the Software is furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be +** included in all copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +** NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +** LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +** OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +** WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +** +****************************************************************************/ + +#ifndef QXLSX_CHARTFILE_P_H +#define QXLSX_CHARTFILE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt Xlsx API. It exists for the convenience +// of the Qt Xlsx. This header file may change from +// version to version without notice, or even be removed. +// +// We mean it. +// + +#include "xlsxooxmlfile.h" + +namespace QXlsx { + +class ChartFile : public OOXmlFile +{ +public: + ChartFile(); + + void saveToXmlFile(QIODevice *device) const; + bool loadFromXmlFile(QIODevice *device); +}; + +} // namespace QXlsx + +#endif // QXLSX_CHARTFILE_P_H diff --git a/src/xlsx/xlsxdocument.cpp b/src/xlsx/xlsxdocument.cpp index 4b19cd1..9c99026 100644 --- a/src/xlsx/xlsxdocument.cpp +++ b/src/xlsx/xlsxdocument.cpp @@ -38,6 +38,7 @@ #include "xlsxworkbook_p.h" #include "xlsxdrawing_p.h" #include "xlsxmediafile_p.h" +#include "xlsxchartfile_p.h" #include "xlsxzipreader_p.h" #include "xlsxzipwriter_p.h" @@ -208,6 +209,13 @@ bool DocumentPrivate::loadPackage(QIODevice *device) } } + //load charts + QList > chartFileToLoad = workbook->chartFiles(); + for (int i=0; i cf = chartFileToLoad[i]; + cf->loadFromXmlData(zipReader.fileData(cf->filePath())); + } + //load media files QList > mediaFileToLoad = workbook->mediaFiles(); for (int i=0; itheme()->saveToXmlData()); + // save chart xml files + for (int i=0; ichartFiles().size(); ++i) { + QSharedPointer cf = workbook->chartFiles()[i]; + zipWriter.addFile(QStringLiteral("xl/charts/chart%1.xml").arg(i+1), cf->saveToXmlData()); + } + // save image files for (int i=0; imediaFiles().size(); ++i) { QSharedPointer mf = workbook->mediaFiles()[i]; diff --git a/src/xlsx/xlsxdrawinganchor.cpp b/src/xlsx/xlsxdrawinganchor.cpp index 87e532f..ee0fcd9 100644 --- a/src/xlsx/xlsxdrawinganchor.cpp +++ b/src/xlsx/xlsxdrawinganchor.cpp @@ -26,6 +26,7 @@ #include "xlsxdrawinganchor_p.h" #include "xlsxdrawing_p.h" #include "xlsxmediafile_p.h" +#include "xlsxchartfile_p.h" #include "xlsxworkbook.h" #include "xlsxutility_p.h" @@ -172,7 +173,38 @@ void DrawingAnchor::loadXmlObjectConnectionShape(QXmlStreamReader &reader) void DrawingAnchor::loadXmlObjectGraphicFrame(QXmlStreamReader &reader) { - Q_UNUSED(reader) + Q_ASSERT(reader.name() == QLatin1String("graphicFrame")); + + while (!reader.atEnd()) { + reader.readNextStartElement(); + 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 path = QDir::cleanPath(splitPath(m_drawing->pathInPackage)[0] + QLatin1String("/") + name); + + bool exist = false; + QList > cfs = m_drawing->workbook->chartFiles(); + for (int i=0; ifilePath() == path) { + //already exist + exist = true; + m_chartFile = cfs[i]; + } + } + if (!exist) { + m_chartFile = QSharedPointer (new ChartFile); + m_chartFile->setFilePath(path); + m_drawing->workbook->addChartFile(m_chartFile); + } + } + } else if (reader.tokenType() == QXmlStreamReader::EndElement + && reader.name() == QLatin1String("graphicFrame")) { + break; + } + } + + return; } void DrawingAnchor::loadXmlObjectGroupShape(QXmlStreamReader &reader) @@ -266,7 +298,32 @@ void DrawingAnchor::saveXmlObjectConnectionShape(QXmlStreamWriter &writer) const void DrawingAnchor::saveXmlObjectGraphicFrame(QXmlStreamWriter &writer) const { - Q_UNUSED(writer) + writer.writeStartElement(QStringLiteral("xdr:graphicFrame")); + writer.writeAttribute(QStringLiteral("macro"), QString()); + + writer.writeStartElement(QStringLiteral("xdr:nvGraphicFramePr")); + writer.writeEmptyElement(QStringLiteral("xdr:cNvPr")); + writer.writeAttribute(QStringLiteral("id"), QString::number(m_id)); + writer.writeAttribute(QStringLiteral("name"),QStringLiteral("Chart %1").arg(m_id)); + writer.writeEmptyElement(QStringLiteral("xdr:cNvGraphicFramePr")); + writer.writeEndElement();//xdr:nvGraphicFramePr + + writer.writeStartElement(QStringLiteral("xdr:xfrm")); + writer.writeEndElement(); //xdr:xfrm + + writer.writeStartElement(QStringLiteral("a:graphic")); + writer.writeStartElement(QStringLiteral("a:graphicData")); + 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)); + + 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.writeEndElement(); //xdr:graphicFrame } void DrawingAnchor::saveXmlObjectGroupShape(QXmlStreamWriter &writer) const diff --git a/src/xlsx/xlsxdrawinganchor_p.h b/src/xlsx/xlsxdrawinganchor_p.h index be83688..73aa035 100644 --- a/src/xlsx/xlsxdrawinganchor_p.h +++ b/src/xlsx/xlsxdrawinganchor_p.h @@ -40,6 +40,7 @@ namespace QXlsx { class Drawing; class MediaFile; +class ChartFile; //Helper class struct XlsxMarker @@ -103,6 +104,7 @@ protected: Drawing *m_drawing; ObjectType m_objectType; QSharedPointer m_pictureFile; + QSharedPointer m_chartFile; int m_id; }; diff --git a/src/xlsx/xlsxmediafile_p.h b/src/xlsx/xlsxmediafile_p.h index 6978fc3..e9f120c 100644 --- a/src/xlsx/xlsxmediafile_p.h +++ b/src/xlsx/xlsxmediafile_p.h @@ -26,6 +26,18 @@ #ifndef QXLSX_XLSXMEDIAFILE_H #define QXLSX_XLSXMEDIAFILE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt Xlsx API. It exists for the convenience +// of the Qt Xlsx. This header file may change from +// version to version without notice, or even be removed. +// +// We mean it. +// + #include "xlsxglobal.h" #include diff --git a/src/xlsx/xlsxooxmlfile.cpp b/src/xlsx/xlsxooxmlfile.cpp index 334f4a9..6ba85ac 100644 --- a/src/xlsx/xlsxooxmlfile.cpp +++ b/src/xlsx/xlsxooxmlfile.cpp @@ -80,4 +80,22 @@ bool OOXmlFile::loadFromXmlData(const QByteArray &data) return loadFromXmlFile(&buffer); } +/*! + * \internal + */ +void OOXmlFile::setFilePath(const QString path) +{ + Q_D(OOXmlFile); + d->filePathInPackage = path; +} + +/*! + * \internal + */ +QString OOXmlFile::filePath() const +{ + Q_D(const OOXmlFile); + return d->filePathInPackage; +} + QT_END_NAMESPACE_XLSX diff --git a/src/xlsx/xlsxooxmlfile.h b/src/xlsx/xlsxooxmlfile.h index fbcb677..8ffb775 100644 --- a/src/xlsx/xlsxooxmlfile.h +++ b/src/xlsx/xlsxooxmlfile.h @@ -37,6 +37,7 @@ class OOXmlFilePrivate; class Q_XLSX_EXPORT OOXmlFile { + Q_DECLARE_PRIVATE(OOXmlFile) public: virtual ~OOXmlFile(); @@ -46,6 +47,8 @@ public: virtual QByteArray saveToXmlData() const; virtual bool loadFromXmlData(const QByteArray &data); + void setFilePath(const QString path); + QString filePath() const; protected: OOXmlFile(); OOXmlFile(OOXmlFilePrivate *d); diff --git a/src/xlsx/xlsxooxmlfile_p.h b/src/xlsx/xlsxooxmlfile_p.h index e79b4c5..4f16524 100644 --- a/src/xlsx/xlsxooxmlfile_p.h +++ b/src/xlsx/xlsxooxmlfile_p.h @@ -38,6 +38,7 @@ // #include "xlsxooxmlfile.h" +#include QT_BEGIN_NAMESPACE_XLSX @@ -48,6 +49,9 @@ class XLSX_AUTOTEST_EXPORT OOXmlFilePrivate public: OOXmlFilePrivate(OOXmlFile *q); + QString filePathInPackage;//such as "xl/worksheets/sheet1.xml" + //used when load the .xlsx file + OOXmlFile *q_ptr; }; diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index 6db0af3..ec1064b 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -575,4 +575,25 @@ void Workbook::addMediaFile(QSharedPointer media, bool force) d->mediaFiles.append(media); } +/*! + * \internal + */ +QList > Workbook::chartFiles() const +{ + Q_D(const Workbook); + + return d->chartFiles; +} + +/*! + * \internal + */ +void Workbook::addChartFile(QSharedPointer chart) +{ + Q_D(Workbook); + + if (!d->chartFiles.contains(chart)) + d->chartFiles.append(chart); +} + QT_END_NAMESPACE_XLSX diff --git a/src/xlsx/xlsxworkbook.h b/src/xlsx/xlsxworkbook.h index ebdc1ac..4ccb213 100755 --- a/src/xlsx/xlsxworkbook.h +++ b/src/xlsx/xlsxworkbook.h @@ -44,6 +44,7 @@ class Theme; class Relationships; class DocumentPrivate; class MediaFile; +class ChartFile; class WorkbookPrivate; class Q_XLSX_EXPORT Workbook : public OOXmlFile @@ -80,6 +81,8 @@ public: //internal used member void addMediaFile(QSharedPointer media, bool force=false); QList > mediaFiles() const; + void addChartFile(QSharedPointer chartFile); + QList > chartFiles() const; private: friend class Worksheet; diff --git a/src/xlsx/xlsxworkbook_p.h b/src/xlsx/xlsxworkbook_p.h index ccd67e8..9e8c12a 100644 --- a/src/xlsx/xlsxworkbook_p.h +++ b/src/xlsx/xlsxworkbook_p.h @@ -88,6 +88,7 @@ public: QSharedPointer styles; QSharedPointer theme; QList > mediaFiles; + QList > chartFiles; QList definedNamesList; QList sheetItemInfoList;//Data from xml file