Refactor : Worksheet load xml logic

This commit is contained in:
Debao Zhang
2013-10-22 16:02:00 +08:00
parent f6bd08f6ed
commit 11ad7d5374
7 changed files with 112 additions and 54 deletions
+5
View File
@@ -61,6 +61,11 @@ int SharedStrings::addSharedString(const QString &string)
void SharedStrings::incRefByStringIndex(int idx) void SharedStrings::incRefByStringIndex(int idx)
{ {
if (idx <0 || idx >= m_stringList.size()) {
qDebug("SharedStrings: invlid index");
return;
}
addSharedString(m_stringList[idx]); addSharedString(m_stringList[idx]);
} }
+1 -1
View File
@@ -63,7 +63,7 @@ Format *Styles::createFormat()
Format *Styles::xfFormat(int idx) const Format *Styles::xfFormat(int idx) const
{ {
if (idx <0 || idx > m_xf_formatsList.size()) if (idx <0 || idx >= m_xf_formatsList.size())
return 0; return 0;
return m_xf_formatsList[idx]; return m_xf_formatsList[idx];
+1
View File
@@ -69,6 +69,7 @@ public:
private: private:
friend class Package; friend class Package;
friend class Worksheet; friend class Worksheet;
friend class WorksheetPrivate;
friend class Document; friend class Document;
friend class DocumentPrivate; friend class DocumentPrivate;
+56 -32
View File
@@ -1076,14 +1076,62 @@ QByteArray Worksheet::saveToXmlData()
return data; return data;
} }
void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
{
Q_ASSERT(reader.name() == QLatin1String("sheetData"));
while(!(reader.name() == QLatin1String("sheetData") && reader.tokenType() == QXmlStreamReader::EndElement)) {
reader.readNextStartElement();
if (reader.tokenType() == QXmlStreamReader::StartElement) {
if (reader.name() == QLatin1String("c")) {
QXmlStreamAttributes attributes = reader.attributes();
QString r = attributes.value(QLatin1String("r")).toString();
QPoint pos = xl_cell_to_rowcol(r);
//get format
Format *format = 0;
if (attributes.hasAttribute(QLatin1String("s"))) {
int idx = attributes.value(QLatin1String("s")).toInt();
format = workbook->styles()->xfFormat(idx);
}
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();
workbook->sharedStrings()->incRefByStringIndex(value.toInt());
XlsxCellData *data = new XlsxCellData(value ,XlsxCellData::String, format);
cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
}
} else if (type == QLatin1String("b")) {
//bool type
}
} else {
//number type
reader.readNextStartElement();
if (reader.name() == QLatin1String("v")) {
QString value = reader.readElementText();
XlsxCellData *data = new XlsxCellData(value ,XlsxCellData::Number, format);
cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
}
}
}
}
}
}
bool Worksheet::loadFromXmlFile(QIODevice *device) bool Worksheet::loadFromXmlFile(QIODevice *device)
{ {
Q_D(Worksheet); Q_D(Worksheet);
XmlStreamReader reader(device); XmlStreamReader reader(device);
while(!reader.atEnd()) { while(!reader.atEnd()) {
QXmlStreamReader::TokenType token = reader.readNext(); reader.readNextStartElement();
if (token == QXmlStreamReader::StartElement) { if (reader.tokenType() == QXmlStreamReader::StartElement) {
if (reader.name() == QLatin1String("dimension")) { if (reader.name() == QLatin1String("dimension")) {
QXmlStreamAttributes attributes = reader.attributes(); QXmlStreamAttributes attributes = reader.attributes();
QStringList range = attributes.value(QLatin1String("ref")).toString().split(QLatin1Char(':')); QStringList range = attributes.value(QLatin1String("ref")).toString().split(QLatin1Char(':'));
@@ -1101,38 +1149,14 @@ bool Worksheet::loadFromXmlFile(QIODevice *device)
d->dim_rowmax = p.x(); d->dim_rowmax = p.x();
d->dim_colmax = p.y(); d->dim_colmax = p.y();
} }
} else if (reader.name() == QLatin1String("c")) { } else if (reader.name() == QLatin1String("sheetViews")) {
QXmlStreamAttributes attributes = reader.attributes();
QString r = attributes.value(QLatin1String("r")).toString();
QPoint pos = xl_cell_to_rowcol(r);
Format *format = 0; } else if (reader.name() == QLatin1String("sheetFormatPr")) {
if (attributes.hasAttribute(QLatin1String("s"))) {
int idx = attributes.value(QLatin1String("s")).toInt();
format = d->workbook->styles()->xfFormat(idx);
}
if (attributes.hasAttribute(QLatin1String("t"))) { } else if (reader.name() == QLatin1String("cols")) {
QString type = attributes.value(QLatin1String("t")).toString();
if (type == QLatin1String("s")) { } else if (reader.name() == QLatin1String("sheetData")) {
//string type d->readSheetData(reader);
reader.readNextStartElement();
if (reader.name() == QLatin1String("v")) {
QString value = reader.readElementText();
d->workbook->sharedStrings()->incRefByStringIndex(value.toInt());
XlsxCellData *data = new XlsxCellData(value ,XlsxCellData::String, format);
d->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, format);
d->cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
}
}
} }
} }
} }
-1
View File
@@ -40,7 +40,6 @@ class WorksheetTest;
QT_BEGIN_NAMESPACE_XLSX QT_BEGIN_NAMESPACE_XLSX
class Package; class Package;
class Workbook; class Workbook;
class XmlStreamWriter;
class Format; class Format;
class Drawing; class Drawing;
struct XlsxImageData; struct XlsxImageData;
+7 -1
View File
@@ -24,6 +24,7 @@
****************************************************************************/ ****************************************************************************/
#ifndef XLSXWORKSHEET_P_H #ifndef XLSXWORKSHEET_P_H
#define XLSXWORKSHEET_P_H #define XLSXWORKSHEET_P_H
#include "xlsxglobal.h"
#include "xlsxworksheet.h" #include "xlsxworksheet.h"
#include <QImage> #include <QImage>
@@ -31,6 +32,9 @@
namespace QXlsx { namespace QXlsx {
class XmlStreamWriter;
class XmlStreamReader;
struct XlsxCellData struct XlsxCellData
{ {
enum CellDataType { enum CellDataType {
@@ -173,7 +177,7 @@ struct XlsxColumnInfo
bool hidden; bool hidden;
}; };
class WorksheetPrivate class XLSX_AUTOTEST_EXPORT WorksheetPrivate
{ {
Q_DECLARE_PUBLIC(Worksheet) Q_DECLARE_PUBLIC(Worksheet)
public: public:
@@ -192,6 +196,8 @@ public:
XlsxObjectPositionData objectPixelsPosition(int col_start, int row_start, double x1, double y1, double width, double height); XlsxObjectPositionData objectPixelsPosition(int col_start, int row_start, double x1, double y1, double width, double height);
XlsxObjectPositionData pixelsToEMUs(const XlsxObjectPositionData &data); XlsxObjectPositionData pixelsToEMUs(const XlsxObjectPositionData &data);
void readSheetData(XmlStreamReader &reader);
Workbook *workbook; Workbook *workbook;
Drawing *drawing; Drawing *drawing;
QMap<int, QMap<int, QSharedPointer<XlsxCellData> > > cellTable; QMap<int, QMap<int, QSharedPointer<XlsxCellData> > > cellTable;
+23
View File
@@ -2,6 +2,8 @@
#include <QtTest> #include <QtTest>
#include "xlsxworksheet.h" #include "xlsxworksheet.h"
#include "private/xlsxworksheet_p.h"
#include "private/xlsxxmlreader_p.h"
class WorksheetTest : public QObject class WorksheetTest : public QObject
{ {
@@ -14,6 +16,8 @@ private Q_SLOTS:
void testEmptySheet(); void testEmptySheet();
void testMerge(); void testMerge();
void testUnMerge(); void testUnMerge();
void testReadSheetData();
}; };
WorksheetTest::WorksheetTest() WorksheetTest::WorksheetTest()
@@ -51,6 +55,25 @@ void WorksheetTest::testUnMerge()
QVERIFY2(!xmldata.contains("<mergeCell"), ""); QVERIFY2(!xmldata.contains("<mergeCell"), "");
} }
void WorksheetTest::testReadSheetData()
{
const QByteArray xmlData = "<sheetData>"
"<row r=\"1\" spans=\"1:6\">"
"<c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c>"
"</row>"
"<row r=\"3\" spans=\"1:6\">"
"<c r=\"B3\" s=\"1\"><v>12345</v></c>"
"</row>"
"</sheetData>";
QXlsx::XmlStreamReader reader(xmlData);
reader.readNextStartElement();//current node is sheetData
QXlsx::Worksheet sheet("", 0);
sheet.d_ptr->readSheetData(reader);
QCOMPARE(sheet.d_ptr->cellTable.size(), 2);
}
QTEST_APPLESS_MAIN(WorksheetTest) QTEST_APPLESS_MAIN(WorksheetTest)
#include "tst_worksheet.moc" #include "tst_worksheet.moc"