Browse Source

Refactor : Worksheet load xml logic

master
Debao Zhang 11 years ago
parent
commit
11ad7d5374
  1. 5
      src/xlsx/xlsxsharedstrings.cpp
  2. 2
      src/xlsx/xlsxstyles.cpp
  3. 1
      src/xlsx/xlsxworkbook.h
  4. 80
      src/xlsx/xlsxworksheet.cpp
  5. 1
      src/xlsx/xlsxworksheet.h
  6. 8
      src/xlsx/xlsxworksheet_p.h
  7. 23
      tests/auto/worksheet/tst_worksheet.cpp

5
src/xlsx/xlsxsharedstrings.cpp

@ -61,6 +61,11 @@ int SharedStrings::addSharedString(const QString &string)
void SharedStrings::incRefByStringIndex(int idx)
{
if (idx <0 || idx >= m_stringList.size()) {
qDebug("SharedStrings: invlid index");
return;
}
addSharedString(m_stringList[idx]);
}

2
src/xlsx/xlsxstyles.cpp

@ -63,7 +63,7 @@ Format *Styles::createFormat()
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 m_xf_formatsList[idx];

1
src/xlsx/xlsxworkbook.h

@ -69,6 +69,7 @@ public:
private:
friend class Package;
friend class Worksheet;
friend class WorksheetPrivate;
friend class Document;
friend class DocumentPrivate;

80
src/xlsx/xlsxworksheet.cpp

@ -1076,40 +1076,24 @@ QByteArray Worksheet::saveToXmlData()
return data;
}
bool Worksheet::loadFromXmlFile(QIODevice *device)
void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
{
Q_D(Worksheet);
Q_ASSERT(reader.name() == QLatin1String("sheetData"));
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]);
d->dim_rowmin = start.x();
d->dim_colmin = start.y();
d->dim_rowmax = end.x();
d->dim_colmax = end.y();
} else {
QPoint p = xl_cell_to_rowcol(range[0]);
d->dim_rowmin = p.x();
d->dim_colmin = p.y();
d->dim_rowmax = p.x();
d->dim_colmax = p.y();
}
} else if (reader.name() == QLatin1String("c")) {
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 = d->workbook->styles()->xfFormat(idx);
format = workbook->styles()->xfFormat(idx);
}
if (attributes.hasAttribute(QLatin1String("t"))) {
@ -1119,10 +1103,12 @@ bool Worksheet::loadFromXmlFile(QIODevice *device)
reader.readNextStartElement();
if (reader.name() == QLatin1String("v")) {
QString value = reader.readElementText();
d->workbook->sharedStrings()->incRefByStringIndex(value.toInt());
workbook->sharedStrings()->incRefByStringIndex(value.toInt());
XlsxCellData *data = new XlsxCellData(value ,XlsxCellData::String, format);
d->cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
}
} else if (type == QLatin1String("b")) {
//bool type
}
} else {
//number type
@ -1130,10 +1116,48 @@ bool Worksheet::loadFromXmlFile(QIODevice *device)
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);
cellTable[pos.x()][pos.y()] = QSharedPointer<XlsxCellData>(data);
}
}
}
}
}
}
bool Worksheet::loadFromXmlFile(QIODevice *device)
{
Q_D(Worksheet);
XmlStreamReader reader(device);
while(!reader.atEnd()) {
reader.readNextStartElement();
if (reader.tokenType() == 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]);
d->dim_rowmin = start.x();
d->dim_colmin = start.y();
d->dim_rowmax = end.x();
d->dim_colmax = end.y();
} else {
QPoint p = xl_cell_to_rowcol(range[0]);
d->dim_rowmin = p.x();
d->dim_colmin = p.y();
d->dim_rowmax = p.x();
d->dim_colmax = p.y();
}
} else if (reader.name() == QLatin1String("sheetViews")) {
} else if (reader.name() == QLatin1String("sheetFormatPr")) {
} else if (reader.name() == QLatin1String("cols")) {
} else if (reader.name() == QLatin1String("sheetData")) {
d->readSheetData(reader);
}
}
}

1
src/xlsx/xlsxworksheet.h

@ -40,7 +40,6 @@ class WorksheetTest;
QT_BEGIN_NAMESPACE_XLSX
class Package;
class Workbook;
class XmlStreamWriter;
class Format;
class Drawing;
struct XlsxImageData;

8
src/xlsx/xlsxworksheet_p.h

@ -24,6 +24,7 @@
****************************************************************************/
#ifndef XLSXWORKSHEET_P_H
#define XLSXWORKSHEET_P_H
#include "xlsxglobal.h"
#include "xlsxworksheet.h"
#include <QImage>
@ -31,6 +32,9 @@
namespace QXlsx {
class XmlStreamWriter;
class XmlStreamReader;
struct XlsxCellData
{
enum CellDataType {
@ -173,7 +177,7 @@ struct XlsxColumnInfo
bool hidden;
};
class WorksheetPrivate
class XLSX_AUTOTEST_EXPORT WorksheetPrivate
{
Q_DECLARE_PUBLIC(Worksheet)
public:
@ -192,6 +196,8 @@ public:
XlsxObjectPositionData objectPixelsPosition(int col_start, int row_start, double x1, double y1, double width, double height);
XlsxObjectPositionData pixelsToEMUs(const XlsxObjectPositionData &data);
void readSheetData(XmlStreamReader &reader);
Workbook *workbook;
Drawing *drawing;
QMap<int, QMap<int, QSharedPointer<XlsxCellData> > > cellTable;

23
tests/auto/worksheet/tst_worksheet.cpp

@ -2,6 +2,8 @@
#include <QtTest>
#include "xlsxworksheet.h"
#include "private/xlsxworksheet_p.h"
#include "private/xlsxxmlreader_p.h"
class WorksheetTest : public QObject
{
@ -14,6 +16,8 @@ private Q_SLOTS:
void testEmptySheet();
void testMerge();
void testUnMerge();
void testReadSheetData();
};
WorksheetTest::WorksheetTest()
@ -51,6 +55,25 @@ void WorksheetTest::testUnMerge()
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)
#include "tst_worksheet.moc"

Loading…
Cancel
Save