commit
4ec93ecb41
34 changed files with 3074 additions and 0 deletions
@ -0,0 +1,43 @@ |
|||
syntax: glob |
|||
*.pro.user* |
|||
*.autosave |
|||
*.app |
|||
*.moc |
|||
*.prl |
|||
Makefile* |
|||
doc/html/ |
|||
*.framework/ |
|||
*.xcodeproj/ |
|||
debug/ |
|||
release/ |
|||
qtc-gdbmacros/ |
|||
*.rej |
|||
*.orig |
|||
*.obj |
|||
*.swp |
|||
*.dll |
|||
*.exp |
|||
*.ilk |
|||
*.pdb |
|||
*.lib |
|||
Thumbs.db |
|||
moc_*.cpp |
|||
qrc_*.cpp |
|||
*.o |
|||
*.so.* |
|||
*.so |
|||
*.pdb |
|||
ui_*.h |
|||
*~ |
|||
.qmake.cache |
|||
lib/* |
|||
*.orig |
|||
*.exe |
|||
*.vcproj |
|||
*.vcproj.*.user |
|||
*_resource.rc |
|||
*.sln |
|||
*.idb |
|||
*.ncb |
|||
*.suo |
|||
|
@ -0,0 +1,3 @@ |
|||
TEMPLATE = subdirs |
|||
SUBDIRS = hello |
|||
|
@ -0,0 +1,5 @@ |
|||
TARGET = hello |
|||
|
|||
include(../../src/qtxlsxwriter.pri) |
|||
|
|||
SOURCES += main.cpp |
@ -0,0 +1,16 @@ |
|||
#include <QtCore> |
|||
#include "xlsxworkbook.h" |
|||
#include "xlsxworksheet.h" |
|||
|
|||
int main(int argc, char* argv[]) |
|||
{ |
|||
#ifdef Q_OS_MAC |
|||
QXlsx::Workbook workbook("../../../Test.xlsx"); |
|||
#else |
|||
QXlsx::Workbook workbook("Test.xlsx"); |
|||
#endif |
|||
QXlsx::Worksheet *sheet = workbook.addWorksheet(); |
|||
sheet->write("A1", "Hello Qt!"); |
|||
workbook.close(); |
|||
return 0; |
|||
} |
@ -0,0 +1,32 @@ |
|||
INCLUDEPATH += $$PWD |
|||
DEPENDPATH += $$PWD |
|||
|
|||
QT += core gui gui-private |
|||
|
|||
HEADERS += $$PWD/xlsxdocprops_p.h \ |
|||
$$PWD/xlsxrelationships_p.h \ |
|||
$$PWD/xlsxutility_p.h \ |
|||
$$PWD/xlsxsharedstrings_p.h \ |
|||
$$PWD/xmlstreamwriter_p.h \ |
|||
$$PWD/xlsxcontenttypes_p.h \ |
|||
$$PWD/xlsxtheme_p.h \ |
|||
$$PWD/xlsxformat.h \ |
|||
$$PWD/xlsxworkbook.h \ |
|||
$$PWD/xlsxstyles_p.h \ |
|||
$$PWD/xlsxworksheet.h \ |
|||
$$PWD/zipwriter_p.h \ |
|||
$$PWD/xlsxpackage_p.h |
|||
|
|||
SOURCES += $$PWD/xlsxdocprops.cpp \ |
|||
$$PWD/xlsxrelationships.cpp \ |
|||
$$PWD/xlsxutility.cpp \ |
|||
$$PWD/xlsxsharedstrings.cpp \ |
|||
$$PWD/xmlstreamwriter.cpp \ |
|||
$$PWD/xlsxcontenttypes.cpp \ |
|||
$$PWD/xlsxtheme.cpp \ |
|||
$$PWD/xlsxformat.cpp \ |
|||
$$PWD/xlsxstyles.cpp \ |
|||
$$PWD/xlsxworkbook.cpp \ |
|||
$$PWD/xlsxworksheet.cpp \ |
|||
$$PWD/zipwriter.cpp \ |
|||
$$PWD/xlsxpackage.cpp |
@ -0,0 +1,6 @@ |
|||
#include "qxlsxwriter.h" |
|||
|
|||
QXlsxWriter::QXlsxWriter(QObject *parent) : |
|||
QObject(parent) |
|||
{ |
|||
} |
@ -0,0 +1,23 @@ |
|||
#ifndef QXLSXWRITER_H |
|||
#define QXLSXWRITER_H |
|||
|
|||
#include <QObject> |
|||
|
|||
class QXlsxWriter : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
explicit QXlsxWriter(QObject *parent = 0); |
|||
|
|||
// void worksheets();
|
|||
|
|||
signals: |
|||
|
|||
public slots: |
|||
// void addWorksheet(QString name);
|
|||
// void addFormat();
|
|||
// void addChart();
|
|||
// void setProperties();
|
|||
}; |
|||
|
|||
#endif // QXLSXWRITER_H
|
@ -0,0 +1,144 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxcontenttypes_p.h" |
|||
#include "xmlstreamwriter_p.h" |
|||
#include <QFile> |
|||
#include <QMapIterator> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
ContentTypes::ContentTypes() |
|||
{ |
|||
m_package_prefix = "application/vnd.openxmlformats-package."; |
|||
m_document_prefix = "application/vnd.openxmlformats-officedocument."; |
|||
|
|||
m_defaults.insert("rels", m_package_prefix + "relationships+xml"); |
|||
m_defaults.insert("xml", "application/xml"); |
|||
|
|||
m_overrides.insert("/docProps/app.xml", m_document_prefix + "extended-properties+xml"); |
|||
m_overrides.insert("/docProps/core.xml", m_package_prefix + "core-properties+xml"); |
|||
m_overrides.insert("/xl/styles.xml", m_document_prefix + "spreadsheetml.styles+xml"); |
|||
m_overrides.insert("/xl/theme/theme1.xml", m_document_prefix + "theme+xml"); |
|||
m_overrides.insert("/xl/workbook.xml", m_document_prefix + "spreadsheetml.sheet.main+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addDefault(const QString &key, const QString &value) |
|||
{ |
|||
m_defaults.insert(key, value); |
|||
} |
|||
|
|||
void ContentTypes::addOverride(const QString &key, const QString &value) |
|||
{ |
|||
m_overrides.insert(key, value); |
|||
} |
|||
|
|||
void ContentTypes::addWorksheetName(const QString &name) |
|||
{ |
|||
addOverride(QString("/xl/worksheets/%1.xml").arg(name), m_document_prefix + "spreadsheetml.worksheet+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addChartsheetName(const QString &name) |
|||
{ |
|||
addOverride(QString("/xl/chartsheets/%1.xml").arg(name), m_document_prefix + "spreadsheetml.chartsheet+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addChartName(const QString &name) |
|||
{ |
|||
addOverride(QString("/xl/charts/%1.xml").arg(name), m_document_prefix + "drawingml.chart+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addCommentName(const QString &name) |
|||
{ |
|||
addOverride(QString("/xl/%1.xml").arg(name), m_document_prefix + "spreadsheetml.comments+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addImageTypes(const QStringList &imageTypes) |
|||
{ |
|||
foreach (QString type, imageTypes) |
|||
addOverride(type, "image/" + type); |
|||
} |
|||
|
|||
void ContentTypes::addTableName(const QString &name) |
|||
{ |
|||
addOverride(QString("/xl/tables/%1.xml").arg(name), m_document_prefix + "spreadsheetml.table+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addSharedString() |
|||
{ |
|||
addOverride("/xl/sharedStrings.xml", m_document_prefix + "spreadsheetml.sharedStrings+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addVmlName() |
|||
{ |
|||
addOverride("vml", m_document_prefix + "vmlDrawing"); |
|||
} |
|||
|
|||
void ContentTypes::addCalcChain() |
|||
{ |
|||
addOverride("/xl/calcChain.xml", m_document_prefix + "spreadsheetml.calcChain+xml"); |
|||
} |
|||
|
|||
void ContentTypes::addVbaProject() |
|||
{ |
|||
//:TODO
|
|||
addOverride("bin", "application/vnd.ms-office.vbaProject"); |
|||
} |
|||
|
|||
void ContentTypes::saveToXmlFile(QIODevice *device) |
|||
{ |
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("Types"); |
|||
writer.writeAttribute("xmlns", "http://schemas.openxmlformats.org/package/2006/content-types"); |
|||
|
|||
{ |
|||
QMapIterator<QString, QString> it(m_defaults); |
|||
while(it.hasNext()) { |
|||
it.next(); |
|||
writer.writeStartElement("Default"); |
|||
writer.writeAttribute("Extension", it.key()); |
|||
writer.writeAttribute("ContentType", it.value()); |
|||
writer.writeEndElement();//Default
|
|||
} |
|||
} |
|||
|
|||
{ |
|||
QMapIterator<QString, QString> it(m_overrides); |
|||
while(it.hasNext()) { |
|||
it.next(); |
|||
writer.writeStartElement("Override"); |
|||
writer.writeAttribute("PartName", it.key()); |
|||
writer.writeAttribute("ContentType", it.value()); |
|||
writer.writeEndElement(); //Override
|
|||
} |
|||
} |
|||
|
|||
writer.writeEndElement();//Types
|
|||
writer.writeEndDocument(); |
|||
|
|||
} |
|||
|
|||
} //namespace QXlsx
|
@ -0,0 +1,68 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXCONTENTTYPES_H |
|||
#define XLSXCONTENTTYPES_H |
|||
|
|||
#include <QString> |
|||
#include <QStringList> |
|||
#include <QMap> |
|||
|
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class ContentTypes |
|||
{ |
|||
public: |
|||
ContentTypes(); |
|||
|
|||
void addDefault(const QString &key, const QString &value); |
|||
void addOverride(const QString &key, const QString &value); |
|||
|
|||
//Convenient funcation for addOverride()
|
|||
void addWorksheetName(const QString &name); |
|||
void addChartsheetName(const QString &name); |
|||
void addChartName(const QString &name); |
|||
void addDrawingName(const QString &name); |
|||
void addCommentName(const QString &name); |
|||
void addImageTypes(const QStringList &imageTypes); |
|||
void addTableName(const QString &name); |
|||
void addSharedString(); |
|||
void addVmlName(); |
|||
void addCalcChain(); |
|||
void addVbaProject(); |
|||
|
|||
void saveToXmlFile(QIODevice *device); |
|||
|
|||
private: |
|||
QMap<QString, QString> m_defaults; |
|||
QMap<QString, QString> m_overrides; |
|||
|
|||
QString m_package_prefix; |
|||
QString m_document_prefix; |
|||
}; |
|||
|
|||
} |
|||
#endif // XLSXCONTENTTYPES_H
|
@ -0,0 +1,129 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxdocprops_p.h" |
|||
#include "xmlstreamwriter_p.h" |
|||
|
|||
#include <QDir> |
|||
#include <QFile> |
|||
#include <QDateTime> |
|||
namespace QXlsx { |
|||
|
|||
DocProps::DocProps(QObject *parent) : |
|||
QObject(parent) |
|||
{ |
|||
} |
|||
|
|||
void DocProps::addPartTitle(const QString &title) |
|||
{ |
|||
m_titlesOfPartsList.append(title); |
|||
} |
|||
|
|||
void DocProps::addHeadingPair(const QString &name, int value) |
|||
{ |
|||
m_headingPairsList.append(qMakePair(name, value)); |
|||
} |
|||
|
|||
|
|||
void DocProps::saveToXmlFile_App(QIODevice *device) |
|||
{ |
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("Properties"); |
|||
writer.writeAttribute("xmlns", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"); |
|||
writer.writeAttribute("xmlns:vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); |
|||
writer.writeTextElement("Application", "Microsoft Excel"); |
|||
writer.writeTextElement("DocSecurity", "0"); |
|||
writer.writeTextElement("ScaleCrop", "false"); |
|||
|
|||
writer.writeStartElement("HeadingPairs"); |
|||
writer.writeStartElement("vt:vector"); |
|||
writer.writeAttribute("size", QString::number(m_headingPairsList.size()*2)); |
|||
writer.writeAttribute("baseType", "variant"); |
|||
typedef QPair<QString,int> PairType; //Make foreach happy
|
|||
foreach (PairType pair, m_headingPairsList) { |
|||
writer.writeStartElement("vt:variant"); |
|||
writer.writeTextElement("vt:lpstr", pair.first); |
|||
writer.writeEndElement(); //vt:variant
|
|||
writer.writeStartElement("vt:variant"); |
|||
writer.writeTextElement("vt:i4", QString::number(pair.second)); |
|||
writer.writeEndElement(); //vt:variant
|
|||
} |
|||
writer.writeEndElement();//vt:vector
|
|||
writer.writeEndElement();//HeadingPairs
|
|||
|
|||
writer.writeStartElement("TitlesOfParts"); |
|||
writer.writeStartElement("vt:vector"); |
|||
writer.writeAttribute("size", QString::number(m_titlesOfPartsList.size())); |
|||
writer.writeAttribute("baseType", "lpstr"); |
|||
foreach (QString title, m_titlesOfPartsList) |
|||
writer.writeTextElement("vt:lpstr", title); |
|||
writer.writeEndElement();//vt:vector
|
|||
writer.writeEndElement();//TitlesOfParts
|
|||
|
|||
writer.writeTextElement("Company", ""); |
|||
writer.writeTextElement("LinksUpToDate", "false"); |
|||
writer.writeTextElement("SharedDoc", "false"); |
|||
writer.writeTextElement("HyperlinksChanged", "false"); |
|||
writer.writeTextElement("AppVersion", "12.0000"); |
|||
writer.writeEndElement(); //Properties
|
|||
writer.writeEndDocument(); |
|||
} |
|||
|
|||
void DocProps::saveToXmlFile_Core(QIODevice *device) |
|||
{ |
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("cp:coreProperties"); |
|||
writer.writeAttribute("xmlns:cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"); |
|||
writer.writeAttribute("xmlns:dc", "http://purl.org/dc/elements/1.1/"); |
|||
writer.writeAttribute("xmlns:dcterms", "http://purl.org/dc/terms/"); |
|||
writer.writeAttribute("xmlns:dcmitype", "http://purl.org/dc/dcmitype/"); |
|||
writer.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); |
|||
writer.writeTextElement("dc:title", ""); |
|||
writer.writeTextElement("dc:subject", ""); |
|||
writer.writeTextElement("dc:creator", "QXlsxWriter"); |
|||
writer.writeTextElement("cp:keywords", ""); |
|||
writer.writeTextElement("dc:description", ""); |
|||
writer.writeTextElement("cp:lastModifiedBy", ""); |
|||
|
|||
writer.writeStartElement("dcterms:created"); |
|||
writer.writeAttribute("xsi:type", "dcterms:W3CDTF"); |
|||
writer.writeCharacters(QDateTime::currentDateTime().toString(Qt::ISODate)); |
|||
writer.writeEndElement();//dcterms:created
|
|||
|
|||
writer.writeStartElement("dcterms:modified"); |
|||
writer.writeAttribute("xsi:type", "dcterms:W3CDTF"); |
|||
writer.writeCharacters(QDateTime::currentDateTime().toString(Qt::ISODate)); |
|||
writer.writeEndElement();//dcterms:created
|
|||
|
|||
writer.writeTextElement("cp", "category", ""); |
|||
writer.writeTextElement("cp", "contentStatus", ""); |
|||
writer.writeEndElement(); //cp:coreProperties
|
|||
writer.writeEndDocument(); |
|||
} |
|||
|
|||
} //namespace
|
@ -0,0 +1,57 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXDOCPROPS_H |
|||
#define XLSXDOCPROPS_H |
|||
|
|||
#include <QObject> |
|||
#include <QList> |
|||
#include <QPair> |
|||
#include <QStringList> |
|||
|
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class DocProps : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
explicit DocProps(QObject *parent = 0); |
|||
|
|||
signals: |
|||
|
|||
public slots: |
|||
void addPartTitle(const QString &title); |
|||
void addHeadingPair(const QString &name, int value); |
|||
void saveToXmlFile_App(QIODevice *device); |
|||
void saveToXmlFile_Core(QIODevice *device); |
|||
|
|||
private: |
|||
QStringList m_titlesOfPartsList; |
|||
QList<QPair<QString, int> > m_headingPairsList; |
|||
}; |
|||
|
|||
} |
|||
#endif // XLSXDOCPROPS_H
|
@ -0,0 +1,123 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxformat.h" |
|||
|
|||
namespace QXlsx { |
|||
|
|||
Format::Format(QObject *parent) : |
|||
QObject(parent) |
|||
{ |
|||
m_is_dxf_fomat = false; |
|||
|
|||
m_xf_index = 0; |
|||
m_dxf_index = 0; |
|||
|
|||
m_num_format_index = 0; |
|||
|
|||
m_has_font = false; |
|||
m_font_index = 0; |
|||
m_font_family = 2; |
|||
m_font_scheme = "minor"; |
|||
|
|||
m_font.setFamily("Calibri"); |
|||
m_font.setPointSize(11); |
|||
|
|||
m_theme = 0; |
|||
m_color_indexed = 0; |
|||
|
|||
m_has_fill = false; |
|||
m_fill_index = 0; |
|||
|
|||
m_has_borders = false; |
|||
m_border_index = false; |
|||
} |
|||
|
|||
bool Format::isDxfFormat() const |
|||
{ |
|||
return m_is_dxf_fomat; |
|||
} |
|||
|
|||
void Format::setFont(const QFont &font) |
|||
{ |
|||
m_font = font; |
|||
} |
|||
|
|||
void Format::setForegroundColor(const QColor &color) |
|||
{ |
|||
m_fg_color = color; |
|||
} |
|||
|
|||
void Format::setBackgroundColor(const QColor &color) |
|||
{ |
|||
m_bg_color = color; |
|||
} |
|||
|
|||
QString Format::fontName() const |
|||
{ |
|||
return m_font.family(); |
|||
} |
|||
|
|||
bool Format::bold() const |
|||
{ |
|||
return m_font.weight() == QFont::Bold; |
|||
} |
|||
|
|||
bool Format::italic() const |
|||
{ |
|||
return m_font.italic(); |
|||
} |
|||
|
|||
bool Format::fontOutline() const |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
bool Format::fontShadow() const |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
bool Format::fontStrikout() const |
|||
{ |
|||
return m_font.strikeOut(); |
|||
} |
|||
|
|||
bool Format::fontUnderline() const |
|||
{ |
|||
return m_font.underline(); |
|||
} |
|||
|
|||
QColor Format::fontColor() const |
|||
{ |
|||
return m_font_color; |
|||
} |
|||
|
|||
int Format::fontSize() const |
|||
{ |
|||
return m_font.pointSize(); |
|||
} |
|||
|
|||
|
|||
} // namespace QXlsx
|
@ -0,0 +1,107 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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_FORMAT_H |
|||
#define QXLSX_FORMAT_H |
|||
|
|||
#include <QObject> |
|||
#include <QFont> |
|||
#include <QColor> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class Styles; |
|||
|
|||
class Format : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
void setFont(const QFont &font); |
|||
void setForegroundColor(const QColor &color); |
|||
void setBackgroundColor(const QColor &color); |
|||
|
|||
private: |
|||
friend class Styles; |
|||
explicit Format(QObject *parent = 0); |
|||
|
|||
bool isDxfFormat() const; |
|||
|
|||
//num
|
|||
int numFormatIndex() const {return m_num_format_index;} |
|||
|
|||
//fonts
|
|||
bool hasFont() const {return m_has_font;} |
|||
int fontIndex() const {return m_font_index;} |
|||
QString fontName() const; |
|||
bool bold() const; |
|||
bool italic() const; |
|||
bool fontStrikout() const; |
|||
bool fontOutline() const; |
|||
bool fontShadow() const; |
|||
bool fontUnderline() const; |
|||
QColor fontColor() const; |
|||
int fontSize() const; |
|||
int fontFamily() const{return m_font_family;} |
|||
int theme() const {return m_theme;} |
|||
int colorIndexed() const {return m_color_indexed;} |
|||
QString fontScheme() const {return m_font_scheme;} |
|||
void setHasFont(bool has) {m_has_font=has;} |
|||
|
|||
//fills
|
|||
bool hasFill() const {return m_has_fill;} |
|||
int fillIndex() const {return m_fill_index;} |
|||
|
|||
//borders
|
|||
bool hasBorders() const {return m_has_borders;} |
|||
void setHasBorder(bool has) {m_has_borders=has;} |
|||
int borderIndex() const {return m_border_index;} |
|||
|
|||
bool m_is_dxf_fomat; |
|||
|
|||
int m_xf_index; |
|||
int m_dxf_index; |
|||
|
|||
int m_num_format_index; |
|||
|
|||
bool m_has_font; |
|||
int m_font_index; |
|||
QFont m_font; |
|||
int m_font_family; |
|||
QString m_font_scheme; |
|||
QColor m_font_color; |
|||
QColor m_bg_color; |
|||
QColor m_fg_color; |
|||
int m_theme; |
|||
int m_color_indexed; |
|||
|
|||
bool m_has_fill; |
|||
int m_fill_index; |
|||
|
|||
bool m_has_borders; |
|||
int m_border_index; |
|||
}; |
|||
|
|||
} // namespace QXlsx
|
|||
|
|||
#endif // QXLSX_FORMAT_H
|
@ -0,0 +1,274 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxpackage_p.h" |
|||
#include "xlsxworkbook.h" |
|||
#include "xlsxworksheet.h" |
|||
#include "xlsxcontenttypes_p.h" |
|||
#include "xlsxsharedstrings_p.h" |
|||
#include "xlsxdocprops_p.h" |
|||
#include "xlsxtheme_p.h" |
|||
#include "xlsxstyles_p.h" |
|||
#include "xlsxrelationships_p.h" |
|||
#include "zipwriter_p.h" |
|||
#include <QBuffer> |
|||
#include <QDebug> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
/*
|
|||
From Wikipedia: The Open Packaging Conventions (OPC) is a |
|||
container-file technology initially created by Microsoft to store |
|||
a combination of XML and non-XML files that together form a single |
|||
entity such as an Open XML Paper Specification (OpenXPS) |
|||
document. http://en.wikipedia.org/wiki/Open_Packaging_Conventions.
|
|||
|
|||
At its simplest an Excel XLSX file contains the following elements: |
|||
|
|||
____ [Content_Types].xml |
|||
| |
|||
|____ docProps |
|||
| |____ app.xml |
|||
| |____ core.xml |
|||
| |
|||
|____ xl |
|||
| |____ workbook.xml |
|||
| |____ worksheets |
|||
| | |____ sheet1.xml |
|||
| | |
|||
| |____ styles.xml |
|||
| | |
|||
| |____ theme |
|||
| | |____ theme1.xml |
|||
| | |
|||
| |_____rels |
|||
| |____ workbook.xml.rels |
|||
| |
|||
|_____rels |
|||
|____ .rels |
|||
|
|||
The Packager class coordinates the classes that represent the |
|||
elements of the package and writes them into the XLSX file. |
|||
*/ |
|||
|
|||
Package::Package(Workbook *workbook) : |
|||
m_workbook(workbook) |
|||
{ |
|||
m_worksheet_count = 0; |
|||
m_chartsheet_count = 0; |
|||
foreach (Worksheet *sheet, m_workbook->worksheets()) { |
|||
if (sheet->isChartsheet()) |
|||
m_chartsheet_count += 1; |
|||
else |
|||
m_worksheet_count += 1; |
|||
} |
|||
} |
|||
|
|||
bool Package::createPackage(const QString &packageName) |
|||
{ |
|||
QString fileName = packageName.isEmpty() ? m_workbook->fileName() : packageName; |
|||
ZipWriter zipWriter(fileName); |
|||
|
|||
writeWorksheetFiles(zipWriter); |
|||
// writeChartsheetFiles(zipWriter);
|
|||
writeWorkbookFile(zipWriter); |
|||
// writeChartFiles(zipWriter);
|
|||
// writeDrawingFiles(zipWriter);
|
|||
// writeVmlFiles(zipWriter);
|
|||
// writeCommentFiles(zipWriter);
|
|||
// writeTableFiles(zipWriter);
|
|||
writeSharedStringsFile(zipWriter); |
|||
writeDocPropsFiles(zipWriter); |
|||
writeContentTypesFiles(zipWriter); |
|||
writeStylesFiles(zipWriter); |
|||
writeThemeFile(zipWriter); |
|||
writeRootRelsFile(zipWriter); |
|||
writeWorkbookRelsFile(zipWriter); |
|||
writeWorksheetRelsFile(zipWriter); |
|||
// writeChartsheetRelsFile(zipWriter);
|
|||
// writeImageFiles(zipWriter);
|
|||
// writeVbaProjectFiles(zipWriter);
|
|||
|
|||
zipWriter.close(); |
|||
return true; |
|||
} |
|||
|
|||
void Package::writeWorksheetFiles(ZipWriter &zipWriter) |
|||
{ |
|||
int index = 1; |
|||
foreach (Worksheet *sheet, m_workbook->worksheets()) { |
|||
if (sheet->isChartsheet()) |
|||
continue; |
|||
|
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
sheet->saveToXmlFile(&buffer); |
|||
zipWriter.addFile(QString("xl/worksheets/sheet%1.xml").arg(index), data); |
|||
index += 1; |
|||
} |
|||
} |
|||
|
|||
void Package::writeWorkbookFile(ZipWriter &zipWriter) |
|||
{ |
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
m_workbook->saveToXmlFile(&buffer); |
|||
zipWriter.addFile("xl/workbook.xml", data); |
|||
} |
|||
|
|||
void Package::writeContentTypesFiles(ZipWriter &zipWriter) |
|||
{ |
|||
ContentTypes content; |
|||
|
|||
int worksheet_index = 1; |
|||
foreach (Worksheet *sheet, m_workbook->worksheets()) { |
|||
if (sheet->isChartsheet()) { |
|||
|
|||
} else { |
|||
content.addWorksheetName(QString("sheet%1").arg(worksheet_index)); |
|||
worksheet_index += 1; |
|||
} |
|||
} |
|||
|
|||
if (m_workbook->sharedStrings()->count()) |
|||
content.addSharedString(); |
|||
|
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
content.saveToXmlFile(&buffer); |
|||
zipWriter.addFile("[Content_Types].xml", data); |
|||
} |
|||
|
|||
void Package::writeDocPropsFiles(ZipWriter &zipWriter) |
|||
{ |
|||
DocProps props; |
|||
|
|||
if (m_worksheet_count) |
|||
props.addHeadingPair("Worksheets", m_worksheet_count); |
|||
if (m_chartsheet_count) |
|||
props.addHeadingPair("Chartsheets", m_chartsheet_count); |
|||
|
|||
//Add worksheet parts
|
|||
foreach (Worksheet *sheet, m_workbook->worksheets()){ |
|||
if (!sheet->isChartsheet()) |
|||
props.addPartTitle(sheet->name()); |
|||
} |
|||
|
|||
//Add the chartsheet parts
|
|||
foreach (Worksheet *sheet, m_workbook->worksheets()){ |
|||
if (sheet->isChartsheet()) |
|||
props.addPartTitle(sheet->name()); |
|||
} |
|||
|
|||
QByteArray data1; |
|||
QBuffer buffer1(&data1); |
|||
buffer1.open(QIODevice::WriteOnly); |
|||
props.saveToXmlFile_App(&buffer1); |
|||
zipWriter.addFile("docProps/app.xml", data1); |
|||
|
|||
QByteArray data2; |
|||
QBuffer buffer2(&data2); |
|||
buffer2.open(QIODevice::WriteOnly); |
|||
props.saveToXmlFile_Core(&buffer2); |
|||
zipWriter.addFile("docProps/core.xml", data2); |
|||
} |
|||
|
|||
void Package::writeSharedStringsFile(ZipWriter &zipWriter) |
|||
{ |
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
m_workbook->sharedStrings()->saveToXmlFile(&buffer); |
|||
zipWriter.addFile("xl/sharedStrings.xml", data); |
|||
} |
|||
|
|||
void Package::writeStylesFiles(ZipWriter &zipWriter) |
|||
{ |
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
m_workbook->styles()->saveToXmlFile(&buffer); |
|||
zipWriter.addFile("xl/styles.xml", data); |
|||
} |
|||
|
|||
void Package::writeThemeFile(ZipWriter &zipWriter) |
|||
{ |
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
Theme().saveToXmlFile(&buffer); |
|||
zipWriter.addFile("xl/theme/theme1.xml", data); |
|||
} |
|||
|
|||
void Package::writeRootRelsFile(ZipWriter &zipWriter) |
|||
{ |
|||
Relationships rels; |
|||
rels.addDocumentRelationship("/officeDocument", "xl/workbook.xml"); |
|||
rels.addPackageRelationship("/metadata/core-properties", "docProps/core.xml"); |
|||
rels.addDocumentRelationship("/extended-properties", "docProps/app.xml"); |
|||
|
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
rels.saveToXmlFile(&buffer); |
|||
zipWriter.addFile("_rels/.rels", data); |
|||
} |
|||
|
|||
void Package::writeWorkbookRelsFile(ZipWriter &zipWriter) |
|||
{ |
|||
Relationships rels; |
|||
|
|||
int worksheet_index = 1; |
|||
int chartsheet_index = 1; |
|||
foreach (Worksheet *sheet, m_workbook->worksheets()) { |
|||
if (sheet->isChartsheet()) { |
|||
rels.addDocumentRelationship("/chartsheet", QString("chartsheets/sheet%1.xml").arg(chartsheet_index)); |
|||
chartsheet_index += 1; |
|||
} else { |
|||
rels.addDocumentRelationship("/worksheet", QString("worksheets/sheet%1.xml").arg(worksheet_index)); |
|||
worksheet_index += 1; |
|||
} |
|||
} |
|||
|
|||
rels.addDocumentRelationship("/theme", "theme/theme1.xml"); |
|||
rels.addDocumentRelationship("/styles", "styles.xml"); |
|||
|
|||
if (m_workbook->sharedStrings()->count()) |
|||
rels.addDocumentRelationship("/sharedStrings", "sharedStrings.xml"); |
|||
|
|||
QByteArray data; |
|||
QBuffer buffer(&data); |
|||
buffer.open(QIODevice::WriteOnly); |
|||
rels.saveToXmlFile(&buffer); |
|||
zipWriter.addFile("xl/_rels/workbook.xml.rels", data); |
|||
} |
|||
|
|||
void Package::writeWorksheetRelsFile(ZipWriter &zipWriter) |
|||
{ |
|||
|
|||
} |
|||
} // namespace QXlsx
|
@ -0,0 +1,70 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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_PACKAGE_H |
|||
#define QXLSX_PACKAGE_H |
|||
|
|||
#include <QString> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class Workbook; |
|||
class ZipWriter; |
|||
|
|||
class Package |
|||
{ |
|||
public: |
|||
Package(Workbook *workbook); |
|||
|
|||
bool createPackage(const QString &packageName=QString()); |
|||
|
|||
private: |
|||
void writeWorksheetFiles(ZipWriter &zipWriter); |
|||
// void writeChartsheetFiles(ZipWriter &zipWriter);
|
|||
void writeWorkbookFile(ZipWriter &zipWriter); |
|||
// void writeChartFiles(ZipWriter &zipWriter);
|
|||
// void writeDrawingFiles(ZipWriter &zipWriter);
|
|||
// void writeVmlFiles(ZipWriter &zipWriter);
|
|||
// void writeCommentFiles(ZipWriter &zipWriter);
|
|||
// void writeTableFiles(ZipWriter &zipWriter);
|
|||
void writeSharedStringsFile(ZipWriter &zipWriter); |
|||
void writeDocPropsFiles(ZipWriter &zipWriter); |
|||
void writeContentTypesFiles(ZipWriter &zipWriter); |
|||
void writeStylesFiles(ZipWriter &zipWriter); |
|||
void writeThemeFile(ZipWriter &zipWriter); |
|||
void writeRootRelsFile(ZipWriter &zipWriter); |
|||
void writeWorkbookRelsFile(ZipWriter &zipWriter); |
|||
void writeWorksheetRelsFile(ZipWriter &zipWriter); |
|||
// void writeChartsheetRelsFile(ZipWriter &zipWriter);
|
|||
// void writeImageFiles(ZipWriter &zipWriter);
|
|||
// void writeVbaProjectFiles(ZipWriter &zipWriter);
|
|||
|
|||
Workbook * m_workbook; |
|||
int m_worksheet_count; |
|||
int m_chartsheet_count; |
|||
}; |
|||
|
|||
} // namespace QXlsx
|
|||
|
|||
#endif // QXLSX_PACKAGE_H
|
@ -0,0 +1,92 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxrelationships_p.h" |
|||
#include "xmlstreamwriter_p.h" |
|||
#include <QDir> |
|||
#include <QFile> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
Relationships::Relationships(QObject *parent) : |
|||
QObject(parent) |
|||
{ |
|||
} |
|||
|
|||
void Relationships::addDocumentRelationship(const QString &relativeType, const QString &target) |
|||
{ |
|||
QString type = "http://schemas.openxmlformats.org/officeDocument/2006/relationships" + relativeType; |
|||
addRelationship(type, target); |
|||
} |
|||
|
|||
void Relationships::addMsPackageRelationship(const QString &relativeType, const QString &target) |
|||
{ |
|||
QString type = "http://schemas.microsoft.com/office/2006/relationships" + relativeType; |
|||
addRelationship(type, target); |
|||
} |
|||
|
|||
void Relationships::addPackageRelationship(const QString &relativeType, const QString &target) |
|||
{ |
|||
QString type = "http://schemas.openxmlformats.org/package/2006/relationships" + relativeType; |
|||
addRelationship(type, target); |
|||
} |
|||
|
|||
void Relationships::addWorksheetRelationship(const QString &relativeType, const QString &target, const QString &targetMode) |
|||
{ |
|||
QString type = "http://schemas.openxmlformats.org/officeDocument/2006/relationships" + relativeType; |
|||
addRelationship(type, target, targetMode); |
|||
} |
|||
|
|||
void Relationships::addRelationship(const QString &type, const QString &target, const QString &targetMode) |
|||
{ |
|||
XlsxRelationship relation; |
|||
relation.id = QString("rId%1").arg(m_relationships.size()+1); |
|||
relation.type = type; |
|||
relation.target = target; |
|||
relation.targetMode = targetMode; |
|||
|
|||
m_relationships.append(relation); |
|||
} |
|||
|
|||
void Relationships::saveToXmlFile(QIODevice *device) |
|||
{ |
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("Relationships"); |
|||
writer.writeAttribute("xmlns", "http://schemas.openxmlformats.org/package/2006/relationships"); |
|||
foreach (XlsxRelationship relation, m_relationships) { |
|||
writer.writeStartElement("Relationship"); |
|||
writer.writeAttribute("Id", relation.id); |
|||
writer.writeAttribute("Type", relation.type); |
|||
writer.writeAttribute("Target", relation.target); |
|||
if (!relation.targetMode.isNull()) |
|||
writer.writeAttribute("TargetMode", relation.targetMode); |
|||
writer.writeEndElement(); |
|||
} |
|||
writer.writeEndElement();//Relationships
|
|||
writer.writeEndDocument(); |
|||
} |
|||
|
|||
} //namespace
|
@ -0,0 +1,63 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXRELATIONSHIPS_H |
|||
#define XLSXRELATIONSHIPS_H |
|||
|
|||
#include <QObject> |
|||
#include <QList> |
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
struct XlsxRelationship |
|||
{ |
|||
QString id; |
|||
QString type; |
|||
QString target; |
|||
QString targetMode; |
|||
}; |
|||
|
|||
class Relationships : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
explicit Relationships(QObject *parent = 0); |
|||
|
|||
signals: |
|||
|
|||
public slots: |
|||
void addDocumentRelationship(const QString &relativeType, const QString &target); |
|||
void addPackageRelationship(const QString &relativeType, const QString &target); |
|||
void addMsPackageRelationship(const QString &relativeType, const QString &target); |
|||
void addWorksheetRelationship(const QString &relativeType, const QString &target, const QString &targetMode=QString()); |
|||
|
|||
void saveToXmlFile(QIODevice *device); |
|||
private: |
|||
void addRelationship(const QString &type, const QString &target, const QString &targetMode=QString()); |
|||
QList<XlsxRelationship> m_relationships; |
|||
}; |
|||
|
|||
} |
|||
#endif // XLSXRELATIONSHIPS_H
|
@ -0,0 +1,102 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxsharedstrings_p.h" |
|||
#include "xmlstreamwriter_p.h" |
|||
#include <QDir> |
|||
#include <QFile> |
|||
#include <QRegularExpression> |
|||
#include <QDebug> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
SharedStrings::SharedStrings(QObject *parent) : |
|||
QObject(parent) |
|||
{ |
|||
m_stringCount = 0; |
|||
} |
|||
|
|||
int SharedStrings::count() const |
|||
{ |
|||
return m_stringCount; |
|||
} |
|||
|
|||
int SharedStrings::addSharedString(const QString &string) |
|||
{ |
|||
m_stringCount += 1; |
|||
|
|||
if (m_stringTable.contains(string)) |
|||
return m_stringTable[string]; |
|||
|
|||
int index = m_stringTable.size(); |
|||
m_stringTable[string] = index; |
|||
m_stringList.append(string); |
|||
return index; |
|||
} |
|||
|
|||
int SharedStrings::getSharedStringIndex(const QString &string) const |
|||
{ |
|||
return m_stringTable[string]; |
|||
} |
|||
|
|||
QString SharedStrings::getSharedString(int index) const |
|||
{ |
|||
return m_stringList[index]; |
|||
} |
|||
|
|||
QStringList SharedStrings::getSharedStrings() const |
|||
{ |
|||
return m_stringList; |
|||
} |
|||
|
|||
void SharedStrings::saveToXmlFile(QIODevice *device) const |
|||
{ |
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("sst"); |
|||
writer.writeAttribute("xmlns", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); |
|||
writer.writeAttribute("count", QString::number(m_stringCount)); |
|||
writer.writeAttribute("uniqueCount", QString::number(m_stringTable.size())); |
|||
|
|||
foreach (QString string, m_stringList) { |
|||
writer.writeStartElement("si"); |
|||
if (string.contains(QRegularExpression("^<r>")) || string.contains(QRegularExpression("</r>$"))) { |
|||
//Rich text string,
|
|||
// writer.writeCharacters(string);
|
|||
} else { |
|||
writer.writeStartElement("t"); |
|||
if (string.contains(QRegularExpression("^\\s")) || string.contains(QRegularExpression("\\s$"))) |
|||
writer.writeAttribute("xml:space", "preserve"); |
|||
writer.writeCharacters(string); |
|||
writer.writeEndElement();//t
|
|||
} |
|||
writer.writeEndElement();//si
|
|||
} |
|||
|
|||
writer.writeEndElement(); //sst
|
|||
writer.writeEndDocument(); |
|||
} |
|||
|
|||
} //namespace
|
@ -0,0 +1,58 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXSHAREDSTRINGS_H |
|||
#define XLSXSHAREDSTRINGS_H |
|||
|
|||
#include <QObject> |
|||
#include <QHash> |
|||
#include <QStringList> |
|||
|
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class SharedStrings : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
explicit SharedStrings(QObject *parent = 0); |
|||
int count() const; |
|||
|
|||
public slots: |
|||
int addSharedString(const QString &string); |
|||
int getSharedStringIndex(const QString &string) const; |
|||
QString getSharedString(int index) const; |
|||
QStringList getSharedStrings() const; |
|||
|
|||
void saveToXmlFile(QIODevice *device) const; |
|||
|
|||
private: |
|||
QHash<QString, int> m_stringTable; //for fast lookup
|
|||
QStringList m_stringList; |
|||
int m_stringCount; |
|||
}; |
|||
|
|||
} |
|||
#endif // XLSXSHAREDSTRINGS_H
|
@ -0,0 +1,240 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxstyles_p.h" |
|||
#include "xlsxformat.h" |
|||
#include "xmlstreamwriter_p.h" |
|||
#include <QFile> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
|
|||
Styles::Styles(QObject *parent) : |
|||
QObject(parent) |
|||
{ |
|||
m_fill_count = 2; //Starts from 2
|
|||
m_borders_count = 1; |
|||
m_font_count = 1; |
|||
|
|||
//Add the default cell format
|
|||
Format *format = addFormat(); |
|||
format->setHasFont(true); |
|||
format->setHasBorder(true); |
|||
} |
|||
|
|||
Format *Styles::addFormat() |
|||
{ |
|||
Format *format = new Format(this); |
|||
m_formats.append(format); |
|||
return format; |
|||
} |
|||
|
|||
void Styles::saveToXmlFile(QIODevice *device) |
|||
{ |
|||
//Todo
|
|||
m_xf_formats = m_formats; |
|||
|
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("styleSheet"); |
|||
writer.writeAttribute("xmlns", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); |
|||
|
|||
// writer.writeStartElement("numFmts");
|
|||
// writer.writeEndElement();//numFmts
|
|||
|
|||
writeFonts(writer); |
|||
writeFills(writer); |
|||
writeBorders(writer); |
|||
|
|||
writer.writeStartElement("cellStyleXfs"); |
|||
writer.writeAttribute("count", "1"); |
|||
writer.writeStartElement("xf"); |
|||
writer.writeAttribute("numFmtId", "0"); |
|||
writer.writeAttribute("fontId", "0"); |
|||
writer.writeAttribute("fillId", "0"); |
|||
writer.writeAttribute("borderId", "0"); |
|||
writer.writeEndElement();//xf
|
|||
writer.writeEndElement();//cellStyleXfs
|
|||
|
|||
writeCellXfs(writer); |
|||
|
|||
writer.writeStartElement("cellStyles"); |
|||
writer.writeAttribute("count", "1"); |
|||
writer.writeStartElement("cellStyle"); |
|||
writer.writeAttribute("name", "Normal"); |
|||
writer.writeAttribute("xfId", "0"); |
|||
writer.writeAttribute("builtinId", "0"); |
|||
writer.writeEndElement();//cellStyle
|
|||
writer.writeEndElement();//cellStyles
|
|||
|
|||
writeDxfs(writer); |
|||
|
|||
writer.writeStartElement("tableStyles"); |
|||
writer.writeAttribute("count", "0"); |
|||
writer.writeAttribute("defaultTableStyle", "TableStyleMedium9"); |
|||
writer.writeAttribute("defaultPivotStyle", "PivotStyleLight16"); |
|||
writer.writeEndElement();//tableStyles
|
|||
|
|||
writer.writeEndElement();//styleSheet
|
|||
writer.writeEndDocument(); |
|||
} |
|||
|
|||
void Styles::writeFonts(XmlStreamWriter &writer) |
|||
{ |
|||
|
|||
writer.writeStartElement("fonts"); |
|||
writer.writeAttribute("count", QString::number(m_font_count)); |
|||
foreach (Format *format, m_xf_formats) { |
|||
if (format->hasFont()) { |
|||
writer.writeStartElement("font"); |
|||
if (format->bold()) |
|||
writer.writeEmptyElement("b"); |
|||
if (format->italic()) |
|||
writer.writeEmptyElement("i"); |
|||
if (format->fontStrikout()) |
|||
writer.writeEmptyElement("strike"); |
|||
if (format->fontOutline()) |
|||
writer.writeEmptyElement("outline"); |
|||
if (format->fontShadow()) |
|||
writer.writeEmptyElement("shadow"); |
|||
if (format->fontUnderline()) //More option
|
|||
writer.writeEmptyElement("u"); |
|||
if (!format->isDxfFormat()) { |
|||
writer.writeEmptyElement("sz"); |
|||
writer.writeAttribute("val", QString::number(format->fontSize())); |
|||
} |
|||
|
|||
//font color
|
|||
if (format->theme()) { |
|||
writer.writeEmptyElement("color"); |
|||
writer.writeAttribute("theme", QString::number(format->theme())); |
|||
} else if (format->colorIndexed()) { |
|||
writer.writeEmptyElement("color"); |
|||
writer.writeAttribute("indexed", QString::number(format->colorIndexed())); |
|||
} else if (format->fontColor().isValid()) { |
|||
writer.writeEmptyElement("color"); |
|||
QString color = format->fontColor().name(); |
|||
writer.writeAttribute("rgb", "FF"+color.mid(1));//remove #
|
|||
} else if (!format->isDxfFormat()) { |
|||
writer.writeEmptyElement("color"); |
|||
writer.writeAttribute("theme", "1"); |
|||
} |
|||
|
|||
if (!format->isDxfFormat()) { |
|||
writer.writeEmptyElement("name"); |
|||
writer.writeAttribute("val", format->fontName()); |
|||
writer.writeEmptyElement("family"); |
|||
writer.writeAttribute("val", QString::number(format->fontFamily())); |
|||
if (format->fontName() == "Calibri") { |
|||
writer.writeEmptyElement("scheme"); |
|||
writer.writeAttribute("val", format->fontScheme()); |
|||
} |
|||
} |
|||
|
|||
writer.writeEndElement(); //font
|
|||
} |
|||
} |
|||
writer.writeEndElement();//fonts
|
|||
} |
|||
|
|||
void Styles::writeFills(XmlStreamWriter &writer) |
|||
{ |
|||
writer.writeStartElement("fills"); |
|||
writer.writeAttribute("count", QString::number(m_fill_count)); |
|||
writer.writeStartElement("fill"); |
|||
writer.writeEmptyElement("patternFill"); |
|||
writer.writeAttribute("patternType", "none"); |
|||
writer.writeEndElement();//fill
|
|||
writer.writeStartElement("fill"); |
|||
writer.writeEmptyElement("patternFill"); |
|||
writer.writeAttribute("patternType", "gray125"); |
|||
writer.writeEndElement();//fill
|
|||
foreach (Format *format, m_xf_formats) { |
|||
if (format->hasFill()) { |
|||
//:TODO
|
|||
} |
|||
} |
|||
writer.writeEndElement(); //fills
|
|||
} |
|||
|
|||
void Styles::writeBorders(XmlStreamWriter &writer) |
|||
{ |
|||
writer.writeStartElement("borders"); |
|||
writer.writeAttribute("count", QString::number(m_borders_count)); |
|||
foreach (Format *format, m_xf_formats) { |
|||
if (format->hasBorders()) { |
|||
writer.writeStartElement("border"); |
|||
writer.writeEmptyElement("left"); |
|||
writer.writeEmptyElement("right"); |
|||
writer.writeEmptyElement("top"); |
|||
writer.writeEmptyElement("bottom"); |
|||
if (!format->isDxfFormat()) { |
|||
writer.writeEmptyElement("diagonal"); |
|||
} |
|||
writer.writeEndElement();//border
|
|||
} |
|||
} |
|||
writer.writeEndElement();//borders
|
|||
} |
|||
|
|||
void Styles::writeCellXfs(XmlStreamWriter &writer) |
|||
{ |
|||
writer.writeStartElement("cellXfs"); |
|||
writer.writeAttribute("count", QString::number(m_xf_formats.size())); |
|||
foreach (Format *format, m_xf_formats) { |
|||
int num_fmt_id = format->numFormatIndex(); |
|||
int font_id = format->fontIndex(); |
|||
int fill_id = format->fillIndex(); |
|||
int border_id = format->borderIndex(); |
|||
int xf_id = 0; |
|||
writer.writeStartElement("xf"); |
|||
writer.writeAttribute("numFmtId", QString::number(num_fmt_id)); |
|||
writer.writeAttribute("fontId", QString::number(font_id)); |
|||
writer.writeAttribute("fillId", QString::number(fill_id)); |
|||
writer.writeAttribute("borderId", QString::number(border_id)); |
|||
writer.writeAttribute("xfId", QString::number(xf_id)); |
|||
if (format->numFormatIndex() > 0) |
|||
writer.writeAttribute("applyNumberFormat", "1"); |
|||
if (format->fontIndex() > 0) |
|||
writer.writeAttribute("applyFont", "1"); |
|||
if (format->fillIndex() > 0) |
|||
writer.writeAttribute("applyBorder", "1"); |
|||
writer.writeEndElement();//xf
|
|||
} |
|||
writer.writeEndElement();//cellXfs
|
|||
} |
|||
|
|||
void Styles::writeDxfs(XmlStreamWriter &writer) |
|||
{ |
|||
writer.writeStartElement("dxfs"); |
|||
writer.writeAttribute("count", QString::number(m_dxf_formats.size())); |
|||
foreach (Format *format, m_dxf_formats) { |
|||
writer.writeStartElement("dxf"); |
|||
writer.writeEndElement();//dxf
|
|||
} |
|||
writer.writeEndElement(); //dxfs
|
|||
} |
|||
|
|||
} //namespace QXlsx
|
@ -0,0 +1,63 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXSTYLES_H |
|||
#define XLSXSTYLES_H |
|||
|
|||
#include <QObject> |
|||
|
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class Format; |
|||
class XmlStreamWriter; |
|||
|
|||
class Styles : public QObject |
|||
{ |
|||
public: |
|||
explicit Styles(QObject *parent=0); |
|||
Format *addFormat(); |
|||
|
|||
void saveToXmlFile(QIODevice *device); |
|||
|
|||
private: |
|||
void writeFonts(XmlStreamWriter &writer); |
|||
void writeFills(XmlStreamWriter &writer); |
|||
void writeBorders(XmlStreamWriter &writer); |
|||
void writeCellXfs(XmlStreamWriter &writer); |
|||
void writeDxfs(XmlStreamWriter &writer); |
|||
|
|||
|
|||
QList<Format *> m_formats; |
|||
QList<Format *> m_xf_formats; |
|||
QList<Format *> m_dxf_formats; |
|||
|
|||
int m_font_count; |
|||
int m_fill_count; |
|||
int m_borders_count; |
|||
}; |
|||
|
|||
} |
|||
#endif // XLSXSTYLES_H
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,42 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXTHEME_H |
|||
#define XLSXTHEME_H |
|||
|
|||
#include <QString> |
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class Theme |
|||
{ |
|||
public: |
|||
Theme(); |
|||
|
|||
void saveToXmlFile(QIODevice *device); |
|||
}; |
|||
|
|||
} |
|||
#endif // XLSXTHEME_H
|
@ -0,0 +1,111 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxutility_p.h" |
|||
|
|||
#include <QString> |
|||
#include <QPoint> |
|||
#include <QRegularExpression> |
|||
#include <QMap> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
int intPow(int x, int p) |
|||
{ |
|||
if (p == 0) return 1; |
|||
if (p == 1) return x; |
|||
|
|||
int tmp = intPow(x, p/2); |
|||
if (p%2 == 0) return tmp * tmp; |
|||
else return x * tmp * tmp; |
|||
} |
|||
|
|||
QPoint xl_cell_to_rowcol(const QString &cell_str) |
|||
{ |
|||
if (cell_str.isEmpty()) |
|||
return QPoint(0, 0); |
|||
QRegularExpression re("^([A-Z]{1,3})(\\d+)$"); |
|||
QRegularExpressionMatch match = re.match(cell_str); |
|||
if (match.hasMatch()) { |
|||
QString col_str = match.captured(1); |
|||
QString row_str = match.captured(2); |
|||
int col = 0; |
|||
int expn = 0; |
|||
for (int i=col_str.size()-1; i>-1; --i) { |
|||
col += (col_str[i].unicode() - 'A' + 1) * intPow(26, expn); |
|||
expn++; |
|||
} |
|||
|
|||
col--; |
|||
int row = row_str.toInt() - 1; |
|||
return QPoint(row, col); |
|||
} else { |
|||
return QPoint(-1, -1); //...
|
|||
} |
|||
} |
|||
|
|||
QString xl_col_to_name(int col_num) |
|||
{ |
|||
col_num += 1; //Change to 1-index
|
|||
QString col_str; |
|||
|
|||
int remainder; |
|||
while (col_num) { |
|||
remainder = col_num % 26; |
|||
if (remainder == 0) |
|||
remainder = 26; |
|||
col_str.prepend(QChar('A'+remainder-1)); |
|||
col_num = (col_num - 1) / 26; |
|||
} |
|||
|
|||
return col_str; |
|||
} |
|||
|
|||
QString xl_rowcol_to_cell(int row, int col, bool row_abs, bool col_abs) |
|||
{ |
|||
row += 1; //Change to 1-index
|
|||
QString cell_str; |
|||
if (col_abs) |
|||
cell_str.append("$"); |
|||
cell_str.append(xl_col_to_name(col)); |
|||
if (row_abs) |
|||
cell_str.append("$"); |
|||
cell_str.append(QString::number(row)); |
|||
return cell_str; |
|||
} |
|||
|
|||
QString xl_rowcol_to_cell_fast(int row, int col) |
|||
{ |
|||
static QMap<int, QString> col_cache; |
|||
QString col_str; |
|||
if (col_cache.contains(col)) { |
|||
col_str = col_cache[col]; |
|||
} else { |
|||
col_str = xl_col_to_name(col); |
|||
col_cache[col] = col_str; |
|||
} |
|||
return col_str + QString::number(row+1); |
|||
} |
|||
|
|||
} //namespace QXlsx
|
@ -0,0 +1,39 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXUTILITY_H |
|||
#define XLSXUTILITY_H |
|||
|
|||
class QPoint; |
|||
class QString; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
int intPow(int x, int p); |
|||
QPoint xl_cell_to_rowcol(const QString &cell_str); |
|||
QString xl_col_to_name(int col_num); |
|||
QString xl_rowcol_to_cell(int row, int col, bool row_abs=false, bool col_abs=false); |
|||
QString xl_rowcol_to_cell_fast(int row, int col); |
|||
} //QXlsx
|
|||
#endif // XLSXUTILITY_H
|
@ -0,0 +1,234 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxworkbook.h" |
|||
#include "xlsxsharedstrings_p.h" |
|||
#include "xlsxworksheet.h" |
|||
#include "xlsxstyles_p.h" |
|||
#include "xlsxformat.h" |
|||
#include "xlsxpackage_p.h" |
|||
#include "xmlstreamwriter_p.h" |
|||
|
|||
namespace QXlsx { |
|||
|
|||
Workbook::Workbook(const QString &name, QObject *parent) : |
|||
QObject(parent), m_fileName(name) |
|||
{ |
|||
m_sharedStrings = new SharedStrings(this); |
|||
m_styles = new Styles(this); |
|||
|
|||
|
|||
m_x_window = 240; |
|||
m_y_window = 15; |
|||
m_window_width = 16095; |
|||
m_window_height = 9660; |
|||
|
|||
m_optimization_enabled = false; |
|||
m_strings_to_numbers_enabled = false; |
|||
m_activesheet = 0; |
|||
m_firstsheet = 0; |
|||
m_table_count = 0; |
|||
m_closed = false; |
|||
} |
|||
|
|||
Workbook::~Workbook() |
|||
{ |
|||
close(); |
|||
} |
|||
|
|||
void Workbook::close() |
|||
{ |
|||
if (m_closed) |
|||
return; |
|||
|
|||
m_closed = true; |
|||
saveWorkbook(); |
|||
} |
|||
|
|||
void Workbook::saveWorkbook() |
|||
{ |
|||
//Add a default worksheet if non have been added.
|
|||
if (m_worksheets.size() == 0) |
|||
addWorksheet(); |
|||
|
|||
//Ensure that at least one worksheet has been selected.
|
|||
if (m_activesheet == 0) { |
|||
m_worksheets[0]->setHidden(false); |
|||
m_worksheets[0]->setSelected(true); |
|||
} |
|||
|
|||
//Set the active sheet
|
|||
foreach (Worksheet *sheet, m_worksheets) { |
|||
if (sheet->index() == m_activesheet) |
|||
sheet->setActived(true); |
|||
} |
|||
|
|||
|
|||
//Create the package based on current workbook
|
|||
Package package(this); |
|||
package.createPackage(); |
|||
} |
|||
|
|||
QString Workbook::fileName() const |
|||
{ |
|||
return m_fileName; |
|||
} |
|||
|
|||
/*!
|
|||
Reduces the amount of data stored in memory so |
|||
that large files can be written efficiently |
|||
|
|||
Note, in this mode a row of data is written and |
|||
then discarded when a cell in a new row is added |
|||
via one of the worksheet write_() methods. As such |
|||
data should be written in sequential row order once |
|||
this mode is on. |
|||
|
|||
It is used to optimise speed and reduce memory usage. |
|||
However, these design goals meant that it wasn’t easy |
|||
to implement features that many users requested such as |
|||
writing formatting and data separately. |
|||
|
|||
This feature is disabled by default. |
|||
*/ |
|||
void Workbook::setOptimizationEnabled(bool enable) |
|||
{ |
|||
m_optimization_enabled = enable; |
|||
} |
|||
|
|||
bool Workbook::isOptimizationEnabled() const |
|||
{ |
|||
return m_optimization_enabled; |
|||
} |
|||
|
|||
/*
|
|||
Enable the worksheet.write() method to convert strings |
|||
to numbers, where possible, using float() in order to avoid |
|||
an Excel warning about “Numbers Stored as Text”. |
|||
|
|||
The default is false |
|||
*/ |
|||
void Workbook::setStringsToNumbersEnabled(bool enable) |
|||
{ |
|||
m_strings_to_numbers_enabled = enable; |
|||
} |
|||
|
|||
bool Workbook::isStringsToNumbersEnabled() const |
|||
{ |
|||
return m_strings_to_numbers_enabled; |
|||
} |
|||
|
|||
void Workbook::defineName(const QString &name, const QString &formula) |
|||
{ |
|||
|
|||
} |
|||
|
|||
Worksheet *Workbook::addWorksheet(const QString &name) |
|||
{ |
|||
QString worksheetName = name; |
|||
int index = m_worksheets.size()+1; |
|||
if (name.isEmpty()) |
|||
worksheetName = QString("Sheet%1").arg(index); |
|||
|
|||
Worksheet *sheet = new Worksheet(worksheetName, index, this); |
|||
m_worksheets.append(sheet); |
|||
return sheet; |
|||
} |
|||
|
|||
Format *Workbook::addFormat() |
|||
{ |
|||
return m_styles->addFormat(); |
|||
} |
|||
|
|||
QList<Worksheet *> Workbook::worksheets() const |
|||
{ |
|||
return m_worksheets; |
|||
} |
|||
|
|||
SharedStrings *Workbook::sharedStrings() |
|||
{ |
|||
return m_sharedStrings; |
|||
} |
|||
|
|||
Styles *Workbook::styles() |
|||
{ |
|||
return m_styles; |
|||
} |
|||
|
|||
void Workbook::saveToXmlFile(QIODevice *device) |
|||
{ |
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("workbook"); |
|||
writer.writeAttribute("xmlns", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); |
|||
writer.writeAttribute("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); |
|||
|
|||
writer.writeEmptyElement("fileVersion"); |
|||
writer.writeAttribute("appName", "xl"); |
|||
writer.writeAttribute("lastEdited", "4"); |
|||
writer.writeAttribute("lowestEdited", "4"); |
|||
writer.writeAttribute("rupBuild", "4505"); |
|||
// writer.writeAttribute("codeName", "{37E998C4-C9E5-D4B9-71C8-EB1FF731991C}");
|
|||
|
|||
writer.writeEmptyElement("workbookPr"); |
|||
writer.writeAttribute("defaultThemeVersion", "124226"); |
|||
|
|||
writer.writeStartElement("bookViews"); |
|||
writer.writeEmptyElement("workbookView"); |
|||
writer.writeAttribute("xWindow", QString::number(m_x_window)); |
|||
writer.writeAttribute("yWindow", QString::number(m_y_window)); |
|||
writer.writeAttribute("windowWidth", QString::number(m_window_width)); |
|||
writer.writeAttribute("windowHeight", QString::number(m_window_height)); |
|||
//Store the firstSheet when it isn't the default
|
|||
if (m_firstsheet > 0) |
|||
writer.writeAttribute("firstSheet", QString::number(m_firstsheet + 1)); |
|||
//Store the activeTab when it isn't the first sheet
|
|||
if (m_activesheet > 0) |
|||
writer.writeAttribute("activeTab", QString::number(m_activesheet)); |
|||
writer.writeEndElement();//bookviews
|
|||
|
|||
writer.writeStartElement("sheets"); |
|||
foreach (Worksheet *sheet, m_worksheets) { |
|||
writer.writeEmptyElement("sheet"); |
|||
writer.writeAttribute("name", sheet->name()); |
|||
writer.writeAttribute("sheetId", QString::number(sheet->index())); |
|||
if (sheet->isHidden()) |
|||
writer.writeAttribute("state", "hidden"); |
|||
writer.writeAttribute("r:id", QString("rId%1").arg(sheet->index())); |
|||
} |
|||
writer.writeEndElement();//sheets
|
|||
|
|||
// writer.writeStartElement("definedNames");
|
|||
// writer.writeEndElement();//definedNames
|
|||
|
|||
writer.writeStartElement("calcPr"); |
|||
writer.writeAttribute("calcId", "124519"); |
|||
writer.writeEndElement(); //calcPr
|
|||
|
|||
writer.writeEndElement();//workbook
|
|||
writer.writeEndDocument(); |
|||
} |
|||
|
|||
} //namespace
|
@ -0,0 +1,90 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXWORKBOOK_H |
|||
#define XLSXWORKBOOK_H |
|||
|
|||
#include <QObject> |
|||
#include <QList> |
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class Worksheet; |
|||
class Format; |
|||
class SharedStrings; |
|||
class Styles; |
|||
class Package; |
|||
|
|||
class Workbook : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
Workbook(const QString &name, QObject *parent=0); |
|||
~Workbook(); |
|||
|
|||
Worksheet *addWorksheet(const QString &name = QString()); |
|||
Format *addFormat(); |
|||
// void addChart();
|
|||
void defineName(const QString &name, const QString &formula); |
|||
void setOptimizationEnabled(bool enable=true); |
|||
void setStringsToNumbersEnabled(bool enable=true); |
|||
|
|||
void close(); |
|||
|
|||
private: |
|||
friend class Package; |
|||
friend class Worksheet; |
|||
|
|||
QList<Worksheet *> worksheets() const; |
|||
SharedStrings *sharedStrings(); |
|||
Styles *styles(); |
|||
QString fileName() const; |
|||
bool isOptimizationEnabled() const; |
|||
bool isStringsToNumbersEnabled() const; |
|||
void saveToXmlFile(QIODevice *device); |
|||
void saveWorkbook(); |
|||
|
|||
QString m_fileName; |
|||
bool m_closed; |
|||
|
|||
SharedStrings *m_sharedStrings; |
|||
QList<Worksheet *> m_worksheets; |
|||
Styles *m_styles; |
|||
bool m_optimization_enabled; //constant_memory
|
|||
bool m_strings_to_numbers_enabled; |
|||
|
|||
int m_x_window; |
|||
int m_y_window; |
|||
int m_window_width; |
|||
int m_window_height; |
|||
|
|||
int m_activesheet; |
|||
int m_firstsheet; |
|||
int m_table_count; |
|||
}; |
|||
|
|||
} //QXlsx
|
|||
|
|||
#endif // XLSXWORKBOOK_H
|
@ -0,0 +1,479 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xlsxworksheet.h" |
|||
#include "xlsxworkbook.h" |
|||
#include "xlsxutility_p.h" |
|||
#include "xlsxsharedstrings_p.h" |
|||
#include "xmlstreamwriter_p.h" |
|||
|
|||
#include <QVariant> |
|||
#include <QDateTime> |
|||
#include <QPoint> |
|||
#include <QFile> |
|||
|
|||
#include <stdint.h> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
/*!
|
|||
* \brief Worksheet::Worksheet |
|||
* \param name Name of the worksheet |
|||
* \param index Index of the worksheet in the workbook |
|||
* \param parent |
|||
*/ |
|||
Worksheet::Worksheet(const QString &name, int index, Workbook *parent) : |
|||
QObject(parent), m_workbook(parent), m_name(name), m_index(index) |
|||
{ |
|||
m_xls_rowmax = 1048576; |
|||
m_xls_colmax = 16384; |
|||
m_xls_strmax = 32767; |
|||
m_dim_rowmin = INT32_MAX; |
|||
m_dim_rowmax = INT32_MIN; |
|||
m_dim_colmin = INT32_MAX; |
|||
m_dim_colmax = INT32_MIN; |
|||
|
|||
m_previous_row = 0; |
|||
|
|||
m_outline_row_level = 0; |
|||
m_outline_col_level = 0; |
|||
|
|||
m_default_row_height = 15; |
|||
m_default_row_zeroed = false; |
|||
|
|||
m_hidden = false; |
|||
m_selected = false; |
|||
m_actived = false; |
|||
m_right_to_left = false; |
|||
m_show_zeros = true; |
|||
} |
|||
|
|||
bool Worksheet::isChartsheet() const |
|||
{ |
|||
return false; |
|||
} |
|||
|
|||
QString Worksheet::name() const |
|||
{ |
|||
return m_name; |
|||
} |
|||
|
|||
int Worksheet::index() const |
|||
{ |
|||
return m_index; |
|||
} |
|||
|
|||
bool Worksheet::isHidden() const |
|||
{ |
|||
return m_hidden; |
|||
} |
|||
|
|||
bool Worksheet::isSelected() const |
|||
{ |
|||
return m_selected; |
|||
} |
|||
|
|||
bool Worksheet::isActived() const |
|||
{ |
|||
return m_actived; |
|||
} |
|||
|
|||
void Worksheet::setHidden(bool hidden) |
|||
{ |
|||
m_hidden = hidden; |
|||
} |
|||
|
|||
void Worksheet::setSelected(bool select) |
|||
{ |
|||
m_selected = select; |
|||
} |
|||
|
|||
void Worksheet::setActived(bool act) |
|||
{ |
|||
m_actived = act; |
|||
} |
|||
|
|||
void Worksheet::setRightToLeft(bool enable) |
|||
{ |
|||
m_right_to_left = enable; |
|||
} |
|||
|
|||
void Worksheet::setZeroValuesHidden(bool enable) |
|||
{ |
|||
m_show_zeros = !enable; |
|||
} |
|||
|
|||
int Worksheet::write(int row, int column, const QVariant &value) |
|||
{ |
|||
bool ok; |
|||
int ret = 0; |
|||
|
|||
if (value.isNull()) { //blank
|
|||
ret = writeBlank(row, column); |
|||
} else if (value.type() == QMetaType::Bool) { //Bool
|
|||
ret = writeBool(row,column, value.toBool()); |
|||
} else if (value.toDateTime().isValid()) { //DateTime
|
|||
|
|||
} else if (value.toDouble(&ok), ok) { //Number
|
|||
if (!m_workbook->isStringsToNumbersEnabled() && value.type() == QMetaType::QString) { |
|||
//Don't convert string to number if the flag not enabled.
|
|||
ret = writeString(row, column, value.toString()); |
|||
} else { |
|||
ret = writeNumber(row, column, value.toDouble()); |
|||
} |
|||
} else if (value.type() == QMetaType::QUrl) { //url
|
|||
|
|||
} else if (value.type() == QMetaType::QString) { //string
|
|||
QString token = value.toString(); |
|||
if (token.startsWith("=")) { |
|||
ret = writeFormula(row, column, token); |
|||
} else if (token.startsWith("{") && token.endsWith("}")) { |
|||
|
|||
} else { |
|||
ret = writeString(row, column, token); |
|||
} |
|||
} else { //Wrong type
|
|||
|
|||
return -1; |
|||
} |
|||
|
|||
return ret; |
|||
} |
|||
|
|||
//convert the "A1" notation to row/column notation
|
|||
int Worksheet::write(const QString row_column, const QVariant &value) |
|||
{ |
|||
QPoint pos = xl_cell_to_rowcol(row_column); |
|||
if (pos == QPoint(-1, -1)) { |
|||
return -1; |
|||
} |
|||
return write(pos.x(), pos.y(), value); |
|||
} |
|||
|
|||
int Worksheet::writeString(int row, int column, const QString &value) |
|||
{ |
|||
int error = 0; |
|||
QString content = value; |
|||
if (checkDimensions(row, column)) |
|||
return -1; |
|||
|
|||
if (value.size() > m_xls_strmax) { |
|||
content = value.left(m_xls_strmax); |
|||
error = -2; |
|||
} |
|||
|
|||
SharedStrings *sharedStrings = m_workbook->sharedStrings(); |
|||
int index = sharedStrings->addSharedString(content); |
|||
|
|||
m_table[row][column] = XlsxCellData(index, XlsxCellData::String); |
|||
return error; |
|||
} |
|||
|
|||
int Worksheet::writeNumber(int row, int column, double value) |
|||
{ |
|||
if (checkDimensions(row, column)) |
|||
return -1; |
|||
|
|||
m_table[row][column] = XlsxCellData(value, XlsxCellData::Number); |
|||
return 0; |
|||
} |
|||
|
|||
int Worksheet::writeFormula(int row, int column, const QString &content, double result) |
|||
{ |
|||
int error = 0; |
|||
QString formula = content; |
|||
if (checkDimensions(row, column)) |
|||
return -1; |
|||
|
|||
//Remove the formula '=' sign if exists
|
|||
if (formula.startsWith("=")) |
|||
formula.remove(0,1); |
|||
|
|||
XlsxCellData data(result, XlsxCellData::Formula); |
|||
data.formula = formula; |
|||
m_table[row][column] = data; |
|||
|
|||
return error; |
|||
} |
|||
|
|||
int Worksheet::writeBlank(int row, int column) |
|||
{ |
|||
if (checkDimensions(row, column)) |
|||
return -1; |
|||
|
|||
m_table[row][column] = XlsxCellData(QVariant(), XlsxCellData::Blank); |
|||
return 0; |
|||
} |
|||
|
|||
int Worksheet::writeBool(int row, int column, bool value) |
|||
{ |
|||
if (checkDimensions(row, column)) |
|||
return -1; |
|||
|
|||
m_table[row][column] = XlsxCellData(value, XlsxCellData::Boolean); |
|||
return 0; |
|||
} |
|||
|
|||
/*
|
|||
Check that row and col are valid and store the max and min |
|||
values for use in other methods/elements. The ignore_row / |
|||
ignore_col flags is used to indicate that we wish to perform |
|||
the dimension check without storing the value. The ignore |
|||
flags are use by setRow() and dataValidate. |
|||
*/ |
|||
int Worksheet::checkDimensions(int row, int col, bool ignore_row, bool ignore_col) |
|||
{ |
|||
if (row >= m_xls_rowmax || col >= m_xls_colmax) |
|||
return -1; |
|||
|
|||
// // In optimization mode we don't change dimensions for rows
|
|||
// // that are already written.
|
|||
// if (!ignore_row && !ignore_col && m_optimization == 1) {
|
|||
// if (row < m_previous_row)
|
|||
// return -1;
|
|||
// }
|
|||
|
|||
if (!ignore_row) { |
|||
if (row < m_dim_rowmin) m_dim_rowmin = row; |
|||
if (row > m_dim_rowmax) m_dim_rowmax = row; |
|||
} |
|||
if (!ignore_col) { |
|||
if (col < m_dim_colmin) m_dim_colmin = col; |
|||
if (col > m_dim_colmax) m_dim_colmax = col; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
void Worksheet::saveToXmlFile(QIODevice *device) |
|||
{ |
|||
XmlStreamWriter writer(device); |
|||
|
|||
writer.writeStartDocument("1.0", true); |
|||
writer.writeStartElement("worksheet"); |
|||
writer.writeAttribute("xmlns", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); |
|||
writer.writeAttribute("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); |
|||
|
|||
//for Excel 2010
|
|||
// writer.writeAttribute("xmlns:mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
|
|||
// writer.writeAttribute("xmlns:x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
|
|||
// writer.writeAttribute("mc:Ignorable", "x14ac");
|
|||
|
|||
writer.writeStartElement("dimension"); |
|||
writer.writeAttribute("ref", generateDimensionString()); |
|||
writer.writeEndElement();//dimension
|
|||
|
|||
writer.writeStartElement("sheetViews"); |
|||
writer.writeStartElement("sheetView"); |
|||
if (!m_show_zeros) |
|||
writer.writeAttribute("showZeros", "0"); |
|||
if (m_right_to_left) |
|||
writer.writeAttribute("rightToLeft", "1"); |
|||
if (m_selected) |
|||
writer.writeAttribute("tabSelected", "1"); |
|||
writer.writeAttribute("workbookViewId", "0"); |
|||
writer.writeEndElement();//sheetView
|
|||
writer.writeEndElement();//sheetViews
|
|||
|
|||
writer.writeStartElement("sheetFormatPr"); |
|||
writer.writeAttribute("defaultRowHeight", QString::number(m_default_row_height)); |
|||
if (m_default_row_height != 15) |
|||
writer.writeAttribute("customHeight", "1"); |
|||
if (m_default_row_zeroed) |
|||
writer.writeAttribute("zeroHeight", "1"); |
|||
if (m_outline_row_level) |
|||
writer.writeAttribute("outlineLevelRow", QString::number(m_outline_row_level)); |
|||
if (m_outline_col_level) |
|||
writer.writeAttribute("outlineLevelCol", QString::number(m_outline_col_level)); |
|||
//for Excel 2010
|
|||
// writer.writeAttribute("x14ac:dyDescent", "0.25");
|
|||
writer.writeEndElement();//sheetFormatPr
|
|||
|
|||
writer.writeStartElement("sheetData"); |
|||
if (m_dim_rowmax == INT32_MIN) { |
|||
//If the max dimensions are equal to INT32_MIN, then there is no data to write
|
|||
} else { |
|||
writeSheetData(writer); |
|||
} |
|||
writer.writeEndElement();//sheetData
|
|||
|
|||
writer.writeEndElement();//worksheet
|
|||
writer.writeEndDocument(); |
|||
} |
|||
|
|||
QString Worksheet::generateDimensionString() |
|||
{ |
|||
if (m_dim_rowmax == INT32_MIN && m_dim_colmax == INT32_MIN) { |
|||
//If the max dimensions are equal to INT32_MIN, then no dimension have been set
|
|||
//and we use the default "A1"
|
|||
return "A1"; |
|||
} |
|||
|
|||
if (m_dim_rowmax == INT32_MIN) { |
|||
//row dimensions aren't set but the column dimensions are set
|
|||
if (m_dim_colmin == m_dim_colmax) { |
|||
//The dimensions are a single cell and not a range
|
|||
return xl_rowcol_to_cell(0, m_dim_colmin); |
|||
} else { |
|||
const QString cell_1 = xl_rowcol_to_cell(0, m_dim_colmin); |
|||
const QString cell_2 = xl_rowcol_to_cell(0, m_dim_colmax); |
|||
return cell_1 + ":" + cell_2; |
|||
} |
|||
} |
|||
|
|||
if (m_dim_rowmin == m_dim_rowmax && m_dim_colmin == m_dim_colmax) { |
|||
//Single cell
|
|||
return xl_rowcol_to_cell(m_dim_rowmin, m_dim_rowmin); |
|||
} |
|||
|
|||
QString cell_1 = xl_rowcol_to_cell(m_dim_rowmin, m_dim_colmin); |
|||
QString cell_2 = xl_rowcol_to_cell(m_dim_rowmax, m_dim_colmax); |
|||
return cell_1 + ":" + cell_2; |
|||
} |
|||
|
|||
void Worksheet::writeSheetData(XmlStreamWriter &writer) |
|||
{ |
|||
calculateSpans(); |
|||
for (int row_num = m_dim_rowmin; row_num <= m_dim_rowmax; row_num++) { |
|||
if (!(m_table.contains(row_num) || m_comments.contains(row_num))) { |
|||
//Only process rows with cell data / comments / formatting
|
|||
continue; |
|||
} |
|||
|
|||
int span_index = row_num / 16; |
|||
QString span; |
|||
if (m_row_spans.contains(span_index)) |
|||
span = m_row_spans[span_index]; |
|||
|
|||
if (m_table.contains(row_num)) { |
|||
writer.writeStartElement("row"); |
|||
writer.writeAttribute("r", QString::number(row_num + 1)); |
|||
if (!span.isEmpty()) |
|||
writer.writeAttribute("spans", span); |
|||
for (int col_num = m_dim_colmin; col_num <= m_dim_colmax; col_num++) { |
|||
if (m_table[row_num].contains(col_num)) { |
|||
writeCellData(writer, row_num, col_num, m_table[row_num][col_num]); |
|||
} |
|||
} |
|||
writer.writeEndElement(); //row
|
|||
} else if (m_comments.contains(row_num)){ |
|||
|
|||
} else { |
|||
|
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
void Worksheet::writeCellData(XmlStreamWriter &writer, int row, int col, const XlsxCellData &data) |
|||
{ |
|||
//This is the innermost loop so efficiency is important.
|
|||
QString cell_range = xl_rowcol_to_cell_fast(row, col); |
|||
|
|||
writer.writeStartElement("c"); |
|||
writer.writeAttribute("r", cell_range); |
|||
//Style used by the cell, row /col
|
|||
// writer.writeAttribute("s", QString::number(""));
|
|||
|
|||
if (data.dataType == XlsxCellData::String) { |
|||
//data.data: Index of the string in sharedStringTable
|
|||
writer.writeAttribute("t", "s"); |
|||
writer.writeTextElement("v", data.value.toString()); |
|||
} else if (data.dataType == XlsxCellData::Number){ |
|||
writer.writeTextElement("v", data.value.toString()); |
|||
} else if (data.dataType == XlsxCellData::Formula) { |
|||
bool ok = true; |
|||
data.formula.toDouble(&ok); |
|||
if (!ok) //is string
|
|||
writer.writeAttribute("t", "str"); |
|||
writer.writeTextElement("f", data.formula); |
|||
writer.writeTextElement("v", data.value.toString()); |
|||
} else if (data.dataType == XlsxCellData::ArrayFormula) { |
|||
|
|||
} else if (data.dataType == XlsxCellData::Boolean) { |
|||
writer.writeAttribute("t", "b"); |
|||
writer.writeTextElement("v", data.value.toBool() ? "True" : "False"); |
|||
} else if (data.dataType == XlsxCellData::Blank) { |
|||
//Ok, empty here.
|
|||
} |
|||
writer.writeEndElement(); //c
|
|||
} |
|||
|
|||
/*
|
|||
Calculate the "spans" attribute of the <row> tag. This is an |
|||
XLSX optimisation and isn't strictly required. However, it |
|||
makes comparing files easier. The span is the same for each |
|||
block of 16 rows. |
|||
*/ |
|||
void Worksheet::calculateSpans() |
|||
{ |
|||
m_row_spans.clear(); |
|||
int span_min = INT32_MAX; |
|||
int span_max = INT32_MIN; |
|||
|
|||
for (int row_num = m_dim_rowmin; row_num <= m_dim_rowmax; row_num++) { |
|||
if (m_table.contains(row_num)) { |
|||
for (int col_num = m_dim_colmin; col_num <= m_dim_colmax; col_num++) { |
|||
if (m_table[row_num].contains(col_num)) { |
|||
if (span_max == INT32_MIN) { |
|||
span_min = col_num; |
|||
span_max = col_num; |
|||
} else { |
|||
if (col_num < span_min) |
|||
span_min = col_num; |
|||
if (col_num > span_max) |
|||
span_max = col_num; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
if (m_comments.contains(row_num)) { |
|||
for (int col_num = m_dim_colmin; col_num <= m_dim_colmax; col_num++) { |
|||
if (m_comments[row_num].contains(col_num)) { |
|||
if (span_max == INT32_MIN) { |
|||
span_min = col_num; |
|||
span_max = col_num; |
|||
} else { |
|||
if (col_num < span_min) |
|||
span_min = col_num; |
|||
if (col_num > span_max) |
|||
span_max = col_num; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ((row_num + 1)%16 == 0 || row_num == m_dim_rowmax) { |
|||
int span_index = row_num / 16; |
|||
if (span_max != INT32_MIN) { |
|||
span_min += 1; |
|||
span_max += 1; |
|||
m_row_spans[span_index] = QString("%1:%2").arg(span_min).arg(span_max); |
|||
span_max = INT32_MIN; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
} //namespace
|
@ -0,0 +1,131 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XLSXWORKSHEET_H |
|||
#define XLSXWORKSHEET_H |
|||
|
|||
#include <QObject> |
|||
#include <QStringList> |
|||
#include <QMap> |
|||
#include <QVariant> |
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
class Package; |
|||
class Workbook; |
|||
class XmlStreamWriter; |
|||
class Format; |
|||
|
|||
struct XlsxCellData |
|||
{ |
|||
enum CellDataType { |
|||
Blank, |
|||
String, |
|||
Number, |
|||
Formula, |
|||
ArrayFormula, |
|||
Boolean |
|||
}; |
|||
XlsxCellData(const QVariant &data=QVariant(), CellDataType type=Blank) : |
|||
value(data), dataType(type), format(0) |
|||
{ |
|||
|
|||
} |
|||
|
|||
QVariant value; |
|||
QString formula; |
|||
CellDataType dataType; |
|||
Format *format; |
|||
}; |
|||
|
|||
class Worksheet : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
int write(const QString row_column, const QVariant &value); |
|||
int write(int row, int column, const QVariant &value); |
|||
int writeString(int row, int column, const QString &value); |
|||
int writeNumber(int row, int column, double value); |
|||
int writeFormula(int row, int column, const QString &formula, double result=0); |
|||
int writeBlank(int row, int column); |
|||
int writeBool(int row, int column, bool value); |
|||
|
|||
void setRightToLeft(bool enable); |
|||
void setZeroValuesHidden(bool enable); |
|||
|
|||
private: |
|||
friend class Package; |
|||
friend class Workbook; |
|||
explicit Worksheet(const QString &sheetName, int sheetIndex, Workbook *parent=0); |
|||
virtual bool isChartsheet() const; |
|||
QString name() const; |
|||
int index() const; |
|||
bool isHidden() const; |
|||
bool isSelected() const; |
|||
bool isActived() const; |
|||
void setHidden(bool hidden); |
|||
void setSelected(bool select); |
|||
void setActived(bool act); |
|||
void saveToXmlFile(QIODevice *device); |
|||
int checkDimensions(int row, int col, bool ignore_row=false, bool ignore_col=false); |
|||
QString generateDimensionString(); |
|||
void writeSheetData(XmlStreamWriter &writer); |
|||
void writeCellData(XmlStreamWriter &writer, int row, int col, const XlsxCellData &data); |
|||
void calculateSpans(); |
|||
|
|||
Workbook *m_workbook; |
|||
QMap<int, QMap<int, XlsxCellData> > m_table; |
|||
QMap<int, QMap<int, QString> > m_comments; |
|||
|
|||
int m_xls_rowmax; |
|||
int m_xls_colmax; |
|||
int m_xls_strmax; |
|||
int m_dim_rowmin; |
|||
int m_dim_rowmax; |
|||
int m_dim_colmin; |
|||
int m_dim_colmax; |
|||
int m_previous_row; |
|||
|
|||
QMap<int, QString> m_row_spans; |
|||
|
|||
int m_outline_row_level; |
|||
int m_outline_col_level; |
|||
|
|||
int m_default_row_height; |
|||
bool m_default_row_zeroed; |
|||
|
|||
QString m_name; |
|||
int m_index; |
|||
bool m_hidden; |
|||
bool m_selected; |
|||
bool m_actived; |
|||
bool m_right_to_left; |
|||
bool m_show_zeros; |
|||
}; |
|||
|
|||
} //QXlsx
|
|||
|
|||
Q_DECLARE_TYPEINFO(QXlsx::XlsxCellData, Q_MOVABLE_TYPE); |
|||
|
|||
#endif // XLSXWORKSHEET_H
|
@ -0,0 +1,36 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "xmlstreamwriter_p.h" |
|||
#include <QIODevice> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
XmlStreamWriter::XmlStreamWriter(QIODevice *device) : |
|||
QXmlStreamWriter(device) |
|||
{ |
|||
|
|||
} |
|||
|
|||
} |
@ -0,0 +1,41 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 XMLSTEAMWRITER_H |
|||
#define XMLSTEAMWRITER_H |
|||
|
|||
#include <QXmlStreamWriter> |
|||
|
|||
class QIODevice; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class XmlStreamWriter : public QXmlStreamWriter |
|||
{ |
|||
public: |
|||
explicit XmlStreamWriter(QIODevice *device); |
|||
}; |
|||
|
|||
} |
|||
#endif // XMLSTEAMWRITER_H
|
@ -0,0 +1,59 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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 "zipwriter_p.h" |
|||
#include <QDebug> |
|||
#include <private/qzipwriter_p.h> |
|||
|
|||
namespace QXlsx { |
|||
|
|||
ZipWriter::ZipWriter(const QString &filePath, QObject *parent) : |
|||
QObject(parent) |
|||
{ |
|||
m_writer = new QZipWriter(filePath, QIODevice::WriteOnly); |
|||
m_writer->setCompressionPolicy(QZipWriter::NeverCompress); |
|||
} |
|||
|
|||
ZipWriter::~ZipWriter() |
|||
{ |
|||
delete m_writer; |
|||
} |
|||
|
|||
void ZipWriter::addFile(const QString &filePath, QIODevice *device) |
|||
{ |
|||
m_writer->addFile(filePath, device); |
|||
} |
|||
|
|||
void ZipWriter::addFile(const QString &filePath, const QByteArray &data) |
|||
{ |
|||
qDebug()<<filePath<<data.size(); |
|||
m_writer->addFile(filePath, data); |
|||
} |
|||
|
|||
void ZipWriter::close() |
|||
{ |
|||
m_writer->close(); |
|||
} |
|||
|
|||
} // namespace QXlsx
|
@ -0,0 +1,51 @@ |
|||
/****************************************************************************
|
|||
** Copyright (c) 2013 Debao Zhang <hello@debao.me> |
|||
** 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_ZIPWRITER_H |
|||
#define QXLSX_ZIPWRITER_H |
|||
|
|||
#include <QObject> |
|||
class QIODevice; |
|||
class QZipWriter; |
|||
|
|||
namespace QXlsx { |
|||
|
|||
class ZipWriter : public QObject |
|||
{ |
|||
Q_OBJECT |
|||
public: |
|||
explicit ZipWriter(const QString &filePath, QObject *parent = 0); |
|||
~ZipWriter(); |
|||
|
|||
void addFile(const QString &filePath, QIODevice *device); |
|||
void addFile(const QString &filePath, const QByteArray &data); |
|||
void close(); |
|||
|
|||
private: |
|||
QZipWriter *m_writer; |
|||
}; |
|||
|
|||
} // namespace QXlsx
|
|||
|
|||
#endif // QXLSX_ZIPWRITER_H
|
Loading…
Reference in new issue