Refactor : Worksheet load xml logic
This commit is contained in:
@@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user