Browse Source

For string type cell, Cell::value() return the string instead of the index

master
Debao Zhang 11 years ago
parent
commit
97f1fa6835
  1. 4
      src/xlsx/xlsxworkbook.cpp
  2. 2
      src/xlsx/xlsxworkbook.h
  3. 38
      src/xlsx/xlsxworksheet.cpp
  4. 3
      src/xlsx/xlsxworksheet_p.h
  5. 6
      tests/auto/worksheet/tst_worksheet.cpp

4
src/xlsx/xlsxworkbook.cpp

@ -191,9 +191,9 @@ QList<QSharedPointer<Worksheet> > Workbook::worksheets() const
return d->worksheets;
}
SharedStrings *Workbook::sharedStrings()
SharedStrings *Workbook::sharedStrings() const
{
Q_D(Workbook);
Q_D(const Workbook);
return d->sharedStrings.data();
}

2
src/xlsx/xlsxworkbook.h

@ -80,7 +80,7 @@ private:
static QSharedPointer<Workbook> loadFromXmlFile(QIODevice *device);
static QSharedPointer<Workbook> loadFromXmlData(const QByteArray &data);
SharedStrings *sharedStrings();
SharedStrings *sharedStrings() const;
Styles *styles();
QList<QImage> images();
QList<Drawing *> drawings();

38
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<Cell>(new Cell(index, Cell::String, format));
d->cellTable[row][column] = QSharedPointer<Cell>(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<Cell>(new Cell(index, Cell::String, format));
d->sharedStrings()->addSharedString(urlString);
d->cellTable[row][column] = QSharedPointer<Cell>(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<Cell>(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<Cell> data(new Cell(value ,Cell::String, format));
cellTable[pos.x()][pos.y()] = QSharedPointer<Cell>(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

3
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<int, QMap<int, QSharedPointer<Cell> > > cellTable;

6
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("<c r=\"A4\" t=\"b\"><v>1</v></c>"), "boolean");
QVERIFY2(xmldata.contains("<c r=\"A5\" t=\"str\"><f>44+33</f><v>0</v></c>"), "formula");
QVERIFY2(xmldata.contains("<c r=\"B5\" t=\"str\"><f>44+33</f><v>77</v></c>"), "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);

Loading…
Cancel
Save