Long live QtXlsxWriter!
This commit is contained in:
Executable
+32
@@ -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
|
||||
Executable
+6
@@ -0,0 +1,6 @@
|
||||
#include "qxlsxwriter.h"
|
||||
|
||||
QXlsxWriter::QXlsxWriter(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
}
|
||||
Executable
+23
@@ -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
|
||||
Executable
+144
@@ -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
|
||||
Executable
+68
@@ -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
|
||||
Executable
+129
@@ -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
|
||||
Executable
+57
@@ -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
|
||||
Executable
+123
@@ -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
|
||||
Executable
+107
@@ -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
|
||||
Executable
+92
@@ -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
|
||||
Executable
+63
@@ -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
|
||||
Executable
+102
@@ -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
|
||||
Executable
+58
@@ -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
|
||||
Executable
+240
@@ -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
|
||||
Executable
+63
@@ -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
|
||||
Executable
+43
File diff suppressed because one or more lines are too long
Executable
+42
@@ -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
|
||||
Executable
+111
@@ -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
|
||||
Executable
+39
@@ -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
|
||||
Executable
+234
@@ -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
|
||||
Executable
+90
@@ -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
|
||||
Executable
+479
@@ -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
|
||||
Executable
+131
@@ -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
|
||||
Executable
+36
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Executable
+41
@@ -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
|
||||
Reference in New Issue
Block a user