From 97f1fa683589b73bb7a2dad704a51b695fe8426e Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Thu, 24 Oct 2013 13:14:13 +0800 Subject: [PATCH] For string type cell, Cell::value() return the string instead of the index --- src/xlsx/xlsxworkbook.cpp | 4 +-- src/xlsx/xlsxworkbook.h | 2 +- src/xlsx/xlsxworksheet.cpp | 38 ++++++++++++++++---------- src/xlsx/xlsxworksheet_p.h | 3 ++ tests/auto/worksheet/tst_worksheet.cpp | 6 +++- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index 2902e8b..f24f3ed 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -191,9 +191,9 @@ QList > Workbook::worksheets() const return d->worksheets; } -SharedStrings *Workbook::sharedStrings() +SharedStrings *Workbook::sharedStrings() const { - Q_D(Workbook); + Q_D(const Workbook); return d->sharedStrings.data(); } diff --git a/src/xlsx/xlsxworkbook.h b/src/xlsx/xlsxworkbook.h index c9e54b2..381ac90 100755 --- a/src/xlsx/xlsxworkbook.h +++ b/src/xlsx/xlsxworkbook.h @@ -80,7 +80,7 @@ private: static QSharedPointer loadFromXmlFile(QIODevice *device); static QSharedPointer loadFromXmlData(const QByteArray &data); - SharedStrings *sharedStrings(); + SharedStrings *sharedStrings() const; Styles *styles(); QList images(); QList drawings(); diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index d3cabbb..43d3472 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -370,10 +370,9 @@ int Worksheet::writeString(int row, int column, const QString &value, Format *fo error = -2; } - SharedStrings *sharedStrings = d->workbook->sharedStrings(); - int index = sharedStrings->addSharedString(content); + d->sharedStrings()->addSharedString(content); - d->cellTable[row][column] = QSharedPointer(new Cell(index, Cell::String, format)); + d->cellTable[row][column] = QSharedPointer(new Cell(content, Cell::String, format)); d->workbook->styles()->addFormat(format); return error; } @@ -524,9 +523,8 @@ 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] = QSharedPointer(new Cell(index, Cell::String, format)); + d->sharedStrings()->addSharedString(urlString); + d->cellTable[row][column] = QSharedPointer(new Cell(urlString, Cell::String, format)); //Store the hyperlink data in sa separate table d->urlTable[row][column] = new XlsxUrlData(link_type, urlString, locationString, tip); @@ -757,9 +755,9 @@ void WorksheetPrivate::writeCellData(XmlStreamWriter &writer, int row, int col, writer.writeAttribute(QStringLiteral("s"), QString::number(colsInfoHelper[col]->format->xfIndex())); if (cell->dataType() == Cell::String) { - //cell->data: Index of the string in sharedStringTable + int sst_idx = sharedStrings()->getSharedStringIndex(cell->value().toString()); writer.writeAttribute(QStringLiteral("t"), QStringLiteral("s")); - writer.writeTextElement(QStringLiteral("v"), cell->value().toString()); + writer.writeTextElement(QStringLiteral("v"), QString::number(sst_idx)); } else if (cell->dataType() == Cell::InlineString) { writer.writeAttribute(QStringLiteral("t"), QStringLiteral("inlineStr")); writer.writeStartElement(QStringLiteral("is")); @@ -1177,12 +1175,15 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader) 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()); - Cell *data = new Cell(value ,Cell::String, format); - cellTable[pos.x()][pos.y()] = QSharedPointer(data); + while (!(reader.name() == QLatin1String("c") && reader.tokenType() == QXmlStreamReader::EndElement)) { + reader.readNextStartElement(); + if (reader.name() == QLatin1String("v")) { + int sst_idx = reader.readElementText().toInt(); + sharedStrings()->incRefByStringIndex(sst_idx); + QString value = sharedStrings()->getSharedString(sst_idx); + QSharedPointer data(new Cell(value ,Cell::String, format)); + cellTable[pos.x()][pos.y()] = QSharedPointer(data); + } } } else if (type == QLatin1String("inlineStr")) { //inline string type @@ -1345,4 +1346,13 @@ bool Worksheet::loadFromXmlData(const QByteArray &data) return loadFromXmlFile(&buffer); } +/*! + * \internal + * Unit test can use this member to get sharedString object. + */ +SharedStrings *WorksheetPrivate::sharedStrings() const +{ + return workbook->sharedStrings(); +} + QT_END_NAMESPACE_XLSX diff --git a/src/xlsx/xlsxworksheet_p.h b/src/xlsx/xlsxworksheet_p.h index cbbe78a..c81aa3b 100644 --- a/src/xlsx/xlsxworksheet_p.h +++ b/src/xlsx/xlsxworksheet_p.h @@ -35,6 +35,7 @@ namespace QXlsx { class XmlStreamWriter; class XmlStreamReader; +class SharedStrings; struct XlsxUrlData { @@ -179,6 +180,8 @@ public: void readColumnsInfo(XmlStreamReader &reader); void readMergeCells(XmlStreamReader &reader); + SharedStrings *sharedStrings() const; + Workbook *workbook; Drawing *drawing; QMap > > cellTable; diff --git a/tests/auto/worksheet/tst_worksheet.cpp b/tests/auto/worksheet/tst_worksheet.cpp index 38e8c4e..34bf6bb 100644 --- a/tests/auto/worksheet/tst_worksheet.cpp +++ b/tests/auto/worksheet/tst_worksheet.cpp @@ -5,6 +5,7 @@ #include "xlsxcell.h" #include "private/xlsxworksheet_p.h" #include "private/xlsxxmlreader_p.h" +#include "private/xlsxsharedstrings_p.h" class WorksheetTest : public QObject { @@ -57,6 +58,8 @@ void WorksheetTest::testWriteCells() QVERIFY2(xmldata.contains("1"), "boolean"); QVERIFY2(xmldata.contains("44+330"), "formula"); QVERIFY2(xmldata.contains("44+3377"), "formula"); + + QCOMPARE(sheet.d_ptr->sharedStrings()->getSharedString(0), QStringLiteral("Hello")); } void WorksheetTest::testMerge() @@ -98,13 +101,14 @@ void WorksheetTest::testReadSheetData() reader.readNextStartElement();//current node is sheetData QXlsx::Worksheet sheet("", 0); + sheet.d_ptr->sharedStrings()->addSharedString("Hello"); sheet.d_ptr->readSheetData(reader); QCOMPARE(sheet.d_ptr->cellTable.size(), 2); //A1 QCOMPARE(sheet.d_ptr->cellTable[0][0]->dataType(), QXlsx::Cell::String); - QCOMPARE(sheet.d_ptr->cellTable[0][0]->value().toInt(), 0); + QCOMPARE(sheet.d_ptr->cellTable[0][0]->value().toString(), QStringLiteral("Hello")); //B1 QCOMPARE(sheet.d_ptr->cellTable[0][1]->dataType(), QXlsx::Cell::Formula);