wip: Add read function for workbook

This commit is contained in:
Debao Zhang
2013-09-13 16:03:43 +08:00
parent c5bc41bacb
commit 7748184ba1
10 changed files with 136 additions and 43 deletions
+1 -1
View File
@@ -168,7 +168,7 @@ Worksheet *Document::activedWorksheet() const
if (d->workbook->worksheets().size() == 0)
return 0;
return d->workbook->worksheets().at(d->workbook->activedWorksheet());
return d->workbook->worksheets().at(d->workbook->activedWorksheet()).data();
}
int Document::activedWorksheetIndex() const
+11 -10
View File
@@ -75,6 +75,7 @@ namespace QXlsx {
The Packager class coordinates the classes that represent the
elements of the package and writes them into the XLSX file.
*/
typedef QSharedPointer<Worksheet> WorksheetPtrType;
Package::Package(Document *document) :
m_document(document)
@@ -82,7 +83,7 @@ Package::Package(Document *document) :
m_workbook = m_document->workbook();
m_worksheet_count = 0;
m_chartsheet_count = 0;
foreach (Worksheet *sheet, m_workbook->worksheets()) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) {
if (sheet->isChartsheet())
m_chartsheet_count += 1;
else
@@ -174,7 +175,7 @@ bool Package::createPackage(QIODevice *package)
void Package::writeWorksheetFiles(ZipWriter &zipWriter)
{
int index = 1;
foreach (Worksheet *sheet, m_workbook->worksheets()) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) {
if (sheet->isChartsheet())
continue;
@@ -206,7 +207,7 @@ void Package::writeContentTypesFile(ZipWriter &zipWriter)
ContentTypes content;
int worksheet_index = 1;
foreach (Worksheet *sheet, m_workbook->worksheets()) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) {
if (sheet->isChartsheet()) {
} else {
@@ -247,15 +248,15 @@ void Package::writeDocPropsAppFile(ZipWriter &zipWriter)
props.addHeadingPair(QStringLiteral("Chartsheets"), m_chartsheet_count);
//Add worksheet parts
foreach (Worksheet *sheet, m_workbook->worksheets()){
foreach (WorksheetPtrType sheet, m_workbook->worksheets()){
if (!sheet->isChartsheet())
props.addPartTitle(sheet->name());
props.addPartTitle(sheet->sheetName());
}
//Add the chartsheet parts
foreach (Worksheet *sheet, m_workbook->worksheets()){
foreach (WorksheetPtrType sheet, m_workbook->worksheets()){
if (sheet->isChartsheet())
props.addPartTitle(sheet->name());
props.addPartTitle(sheet->sheetName());
}
zipWriter.addFile(QStringLiteral("docProps/app.xml"), props.saveToXmlData());
@@ -306,7 +307,7 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter)
int worksheet_index = 1;
int chartsheet_index = 1;
foreach (Worksheet *sheet, m_workbook->worksheets()) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) {
if (sheet->isChartsheet()) {
rels.addDocumentRelationship(QStringLiteral("/chartsheet"), QStringLiteral("chartsheets/sheet%1.xml").arg(chartsheet_index));
chartsheet_index += 1;
@@ -328,7 +329,7 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter)
void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter)
{
int index = 1;
foreach (Worksheet *sheet, m_workbook->worksheets()) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) {
if (sheet->isChartsheet())
continue;
Relationships rels;
@@ -346,7 +347,7 @@ void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter)
void Package::writeDrawingRelsFiles(ZipWriter &zipWriter)
{
int index = 1;
foreach (Worksheet *sheet, m_workbook->worksheets()) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) {
if (sheet->drawingLinks().size() == 0)
continue;
Relationships rels;
+9
View File
@@ -164,4 +164,13 @@ Relationships Relationships::loadFromXmlData(const QByteArray &data)
return loadFromXmlFile(&buffer);
}
XlsxRelationship Relationships::getRelationshipById(const QString &id) const
{
foreach (XlsxRelationship ship, m_relationships) {
if (ship.id == id)
return ship;
}
return XlsxRelationship();
}
} //namespace
+1
View File
@@ -59,6 +59,7 @@ public:
QByteArray saveToXmlData();
static Relationships loadFromXmlFile(QIODevice *device);
static Relationships loadFromXmlData(const QByteArray &data);
XlsxRelationship getRelationshipById(const QString &id) const;
private:
QList<XlsxRelationship> relationships(const QString &type) const;
+34 -11
View File
@@ -30,6 +30,7 @@
#include "xlsxformat.h"
#include "xlsxpackage_p.h"
#include "xlsxxmlwriter_p.h"
#include "xlsxxmlreader_p.h"
#include "xlsxworksheet_p.h"
#include <QFile>
@@ -63,7 +64,6 @@ Workbook::Workbook() :
Workbook::~Workbook()
{
qDeleteAll(d_ptr->worksheets);
delete d_ptr;
}
@@ -123,25 +123,26 @@ Worksheet *Workbook::insertWorkSheet(int index, const QString &name)
QString worksheetName = name;
if (!name.isEmpty()) {
//If user given an already in-use name, we should not continue any more!
foreach (Worksheet *sheet, d->worksheets) {
if (sheet->name() == name)
for (int i=0; i<d->worksheets.size(); ++i) {
if (d->worksheets[i]->sheetName() == name) {
return 0;
}
}
} else {
bool exists;
do {
++lastIndex;
exists = false;
worksheetName = QStringLiteral("Sheet%1").arg(lastIndex+1);
foreach (Worksheet *sheet, d->worksheets) {
if (sheet->name() == worksheetName)
for (int i=0; i<d->worksheets.size(); ++i) {
if (d->worksheets[i]->sheetName() == worksheetName)
exists = true;
}
} while (exists);
}
Worksheet *sheet = new Worksheet(worksheetName, this);
d->worksheets.insert(index, sheet);
d->worksheets.insert(index, QSharedPointer<Worksheet>(sheet));
d->activesheet = index;
return sheet;
}
@@ -168,7 +169,7 @@ Format *Workbook::createFormat()
return d->styles->createFormat();
}
QList<Worksheet *> Workbook::worksheets() const
QList<QSharedPointer<Worksheet> > Workbook::worksheets() const
{
Q_D(const Workbook);
return d->worksheets;
@@ -206,7 +207,8 @@ void Workbook::prepareDrawings()
d->images.clear();
d->drawings.clear();
foreach (Worksheet *sheet, d->worksheets) {
for (int i=0; i<d->worksheets.size(); ++i) {
QSharedPointer<Worksheet> sheet = d->worksheets[i];
if (sheet->images().isEmpty()) //No drawing (such as Image, ...)
continue;
@@ -262,9 +264,9 @@ void Workbook::saveToXmlFile(QIODevice *device)
writer.writeStartElement(QStringLiteral("sheets"));
for (int i=0; i<d->worksheets.size(); ++i) {
Worksheet *sheet = d->worksheets[i];
QSharedPointer<Worksheet> sheet = d->worksheets[i];
writer.writeEmptyElement(QStringLiteral("sheet"));
writer.writeAttribute(QStringLiteral("name"), sheet->name());
writer.writeAttribute(QStringLiteral("name"), sheet->sheetName());
writer.writeAttribute(QStringLiteral("sheetId"), QString::number(i+1));
if (sheet->isHidden())
writer.writeAttribute(QStringLiteral("state"), QStringLiteral("hidden"));
@@ -295,8 +297,21 @@ QByteArray Workbook::saveToXmlData()
QSharedPointer<Workbook> Workbook::loadFromXmlFile(QIODevice *device)
{
Workbook *book = new Workbook;
return QSharedPointer<Workbook>(new Workbook);
XmlStreamReader reader(device);
while(!reader.atEnd()) {
QXmlStreamReader::TokenType token = reader.readNext();
if (token == QXmlStreamReader::StartElement) {
if (reader.name() == QLatin1String("sheet")) {
QXmlStreamAttributes attributes = reader.attributes();
QString sheetName = attributes.value(QLatin1String("name")).toString();
QString rId = attributes.value(QLatin1String("r:id")).toString();
book->d_func()->sheetNameIdPairList.append(QPair<QString, QString>(sheetName, rId));
}
}
}
return QSharedPointer<Workbook>(book);
}
QSharedPointer<Workbook> Workbook::loadFromXmlData(const QByteArray &data)
@@ -308,4 +323,12 @@ QSharedPointer<Workbook> Workbook::loadFromXmlData(const QByteArray &data)
return loadFromXmlFile(&buffer);
}
void Workbook::addWorksheet(const QString &name, QSharedPointer<Worksheet> sheet)
{
Q_D(Workbook);
sheet->setSheetName(name);
d->worksheets.append(sheet);
}
} //namespace
+2 -1
View File
@@ -50,7 +50,7 @@ class Q_XLSX_EXPORT Workbook
public:
~Workbook();
QList<Worksheet *> worksheets() const;
QList<QSharedPointer<Worksheet> > worksheets() const;
Worksheet *addWorksheet(const QString &name = QString());
Worksheet *insertWorkSheet(int index, const QString &name = QString());
int activedWorksheet() const;
@@ -76,6 +76,7 @@ private:
QByteArray saveToXmlData();
static QSharedPointer<Workbook> loadFromXmlFile(QIODevice *device);
static QSharedPointer<Workbook> loadFromXmlData(const QByteArray &data);
void addWorksheet(const QString &name, QSharedPointer<Worksheet> sheet);
SharedStrings *sharedStrings();
Styles *styles();
+4 -1
View File
@@ -26,6 +26,7 @@
#define XLSXWORKBOOK_P_H
#include "xlsxworkbook.h"
#include <QSharedPointer>
#include <QPair>
namespace QXlsx {
@@ -38,11 +39,13 @@ public:
Workbook *q_ptr;
QSharedPointer<SharedStrings> sharedStrings;
QList<Worksheet *> worksheets;
QList<QSharedPointer<Worksheet> > worksheets;
QSharedPointer<Styles> styles;
QList<QImage> images;
QList<Drawing *> drawings;
QList<QPair<QString, QString> > sheetNameIdPairList;//Data from xml file
bool strings_to_numbers_enabled;
bool date1904;
+69 -16
View File
@@ -29,6 +29,7 @@
#include "xlsxutility_p.h"
#include "xlsxsharedstrings_p.h"
#include "xlsxxmlwriter_p.h"
#include "xlsxxmlreader_p.h"
#include "xlsxdrawing_p.h"
#include "xlsxstyles_p.h"
@@ -74,12 +75,6 @@ WorksheetPrivate::WorksheetPrivate(Worksheet *p) :
WorksheetPrivate::~WorksheetPrivate()
{
typedef QMap<int, XlsxCellData *> RowMap;
foreach (RowMap row, cellTable) {
foreach (XlsxCellData *item, row)
delete item;
}
foreach (XlsxRowInfo *row, rowsInfo)
delete row;
@@ -224,12 +219,18 @@ bool Worksheet::isChartsheet() const
return false;
}
QString Worksheet::name() const
QString Worksheet::sheetName() const
{
Q_D(const Worksheet);
return d->name;
}
void Worksheet::setSheetName(const QString &sheetName)
{
Q_D(Worksheet);
d->name = sheetName;
}
bool Worksheet::isHidden() const
{
Q_D(const Worksheet);
@@ -354,7 +355,7 @@ int Worksheet::writeString(int row, int column, const QString &value, Format *fo
SharedStrings *sharedStrings = d->workbook->sharedStrings();
int index = sharedStrings->addSharedString(content);
d->cellTable[row][column] = new XlsxCellData(index, XlsxCellData::String, format);
d->cellTable[row][column] = QSharedPointer<XlsxCellData>(new XlsxCellData(index, XlsxCellData::String, format));
d->workbook->styles()->addFormat(format);
return error;
}
@@ -365,7 +366,7 @@ int Worksheet::writeNumber(int row, int column, double value, Format *format)
if (d->checkDimensions(row, column))
return -1;
d->cellTable[row][column] = new XlsxCellData(value, XlsxCellData::Number, format);
d->cellTable[row][column] = QSharedPointer<XlsxCellData>(new XlsxCellData(value, XlsxCellData::Number, format));
d->workbook->styles()->addFormat(format);
return 0;
}
@@ -384,7 +385,7 @@ int Worksheet::writeFormula(int row, int column, const QString &content, Format
XlsxCellData *data = new XlsxCellData(result, XlsxCellData::Formula, format);
data->formula = formula;
d->cellTable[row][column] = data;
d->cellTable[row][column] = QSharedPointer<XlsxCellData>(data);
d->workbook->styles()->addFormat(format);
return error;
@@ -396,7 +397,7 @@ int Worksheet::writeBlank(int row, int column, Format *format)
if (d->checkDimensions(row, column))
return -1;
d->cellTable[row][column] = new XlsxCellData(QVariant(), XlsxCellData::Blank, format);
d->cellTable[row][column] = QSharedPointer<XlsxCellData>(new XlsxCellData(QVariant(), XlsxCellData::Blank, format));
d->workbook->styles()->addFormat(format);
return 0;
@@ -408,7 +409,7 @@ int Worksheet::writeBool(int row, int column, bool value, Format *format)
if (d->checkDimensions(row, column))
return -1;
d->cellTable[row][column] = new XlsxCellData(value, XlsxCellData::Boolean, format);
d->cellTable[row][column] = QSharedPointer<XlsxCellData>(new XlsxCellData(value, XlsxCellData::Boolean, format));
d->workbook->styles()->addFormat(format);
return 0;
@@ -420,7 +421,7 @@ int Worksheet::writeDateTime(int row, int column, const QDateTime &dt, Format *f
if (d->checkDimensions(row, column))
return -1;
d->cellTable[row][column] = new XlsxCellData(dt, XlsxCellData::DateTime, format);
d->cellTable[row][column] = QSharedPointer<XlsxCellData>(new XlsxCellData(dt, XlsxCellData::DateTime, format));
d->workbook->styles()->addFormat(format);
return 0;
@@ -482,7 +483,7 @@ int Worksheet::writeUrl(int row, int column, const QUrl &url, Format *format, co
//Write the hyperlink string as normal string.
SharedStrings *sharedStrings = d->workbook->sharedStrings();
int index = sharedStrings->addSharedString(urlString);
d->cellTable[row][column] = new XlsxCellData(index, XlsxCellData::String, format);
d->cellTable[row][column] = QSharedPointer<XlsxCellData>(new XlsxCellData(index, XlsxCellData::String, format));
//Store the hyperlink data in sa separate table
d->urlTable[row][column] = new XlsxUrlData(link_type, urlString, locationString, tip);
@@ -695,7 +696,7 @@ void WorksheetPrivate::writeSheetData(XmlStreamWriter &writer)
}
}
void WorksheetPrivate::writeCellData(XmlStreamWriter &writer, int row, int col, XlsxCellData *cell)
void WorksheetPrivate::writeCellData(XmlStreamWriter &writer, int row, int col, QSharedPointer<XlsxCellData> cell)
{
//This is the innermost loop so efficiency is important.
QString cell_range = xl_rowcol_to_cell_fast(row, col);
@@ -1068,7 +1069,59 @@ QByteArray Worksheet::saveToXmlData()
QSharedPointer<Worksheet> Worksheet::loadFromXmlFile(QIODevice *device)
{
return QSharedPointer<Worksheet>(new Worksheet(QString()));
Worksheet *sheet = new Worksheet(QStringLiteral("Sheet9999"));
XmlStreamReader reader(device);
while(!reader.atEnd()) {
QXmlStreamReader::TokenType token = reader.readNext();
if (token == QXmlStreamReader::StartElement) {
if (reader.name() == QLatin1String("dimension")) {
QXmlStreamAttributes attributes = reader.attributes();
QStringList range = attributes.value(QLatin1String("ref")).toString().split(QLatin1Char(':'));
if (range.size() == 2) {
QPoint start = xl_cell_to_rowcol(range[0]);
QPoint end = xl_cell_to_rowcol(range[1]);
sheet->d_func()->dim_rowmin = start.x();
sheet->d_func()->dim_colmin = start.y();
sheet->d_func()->dim_rowmax = end.x();
sheet->d_func()->dim_colmax = end.y();
} else {
QPoint p = xl_cell_to_rowcol(range[0]);
sheet->d_func()->dim_rowmin = p.x();
sheet->d_func()->dim_colmin = p.y();
sheet->d_func()->dim_rowmax = p.x();
sheet->d_func()->dim_colmax = p.y();
}
} else if (reader.name() == QLatin1String("c")) {
QXmlStreamAttributes attributes = reader.attributes();
QString r = attributes.value(QLatin1String("r")).toString();
QPoint pos = xl_cell_to_rowcol(r);
if (attributes.hasAttribute(QLatin1String("t"))) {
QString type = attributes.value(QLatin1String("t")).toString();
if (type == QLatin1String("s")) {
//string type
reader.readNextStartElement();
if (reader.name() == QLatin1String("v")) {
QString value = reader.readElementText();
XlsxCellData *data = new XlsxCellData(value ,XlsxCellData::String);
sheet->d_func()->cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
}
}
} else {
//number type
reader.readNextStartElement();
if (reader.name() == QLatin1String("v")) {
QString value = reader.readElementText();
XlsxCellData *data = new XlsxCellData(value ,XlsxCellData::Number);
sheet->d_func()->cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
}
}
}
}
}
return QSharedPointer<Worksheet> (sheet);
}
QSharedPointer<Worksheet> Worksheet::loadFromXmlData(const QByteArray &data)
+2 -1
View File
@@ -84,7 +84,8 @@ private:
Worksheet(const QString &sheetName, Workbook *book=0);
virtual bool isChartsheet() const;
QString name() const;
QString sheetName() const;
void setSheetName(const QString &sheetName);
bool isHidden() const;
bool isSelected() const;
void setHidden(bool hidden);
+3 -2
View File
@@ -27,6 +27,7 @@
#include "xlsxworksheet.h"
#include <QImage>
#include <QSharedPointer>
namespace QXlsx {
@@ -182,7 +183,7 @@ public:
QString generateDimensionString();
void calculateSpans();
void writeSheetData(XmlStreamWriter &writer);
void writeCellData(XmlStreamWriter &writer, int row, int col, XlsxCellData *cell);
void writeCellData(XmlStreamWriter &writer, int row, int col, QSharedPointer<XlsxCellData> cell);
void writeMergeCells(XmlStreamWriter &writer);
void writeHyperlinks(XmlStreamWriter &writer);
void writeDrawings(XmlStreamWriter &writer);
@@ -193,7 +194,7 @@ public:
Workbook *workbook;
Drawing *drawing;
QMap<int, QMap<int, XlsxCellData *> > cellTable;
QMap<int, QMap<int, QSharedPointer<XlsxCellData> > > cellTable;
QMap<int, QMap<int, QString> > comments;
QMap<int, QMap<int, XlsxUrlData *> > urlTable;
QList<XlsxCellRange> merges;