For string type cell, Cell::value() return the string instead of the index
This commit is contained in:
@@ -191,9 +191,9 @@ QList<QSharedPointer<Worksheet> > Workbook::worksheets() const
|
|||||||
return d->worksheets;
|
return d->worksheets;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedStrings *Workbook::sharedStrings()
|
SharedStrings *Workbook::sharedStrings() const
|
||||||
{
|
{
|
||||||
Q_D(Workbook);
|
Q_D(const Workbook);
|
||||||
return d->sharedStrings.data();
|
return d->sharedStrings.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ private:
|
|||||||
static QSharedPointer<Workbook> loadFromXmlFile(QIODevice *device);
|
static QSharedPointer<Workbook> loadFromXmlFile(QIODevice *device);
|
||||||
static QSharedPointer<Workbook> loadFromXmlData(const QByteArray &data);
|
static QSharedPointer<Workbook> loadFromXmlData(const QByteArray &data);
|
||||||
|
|
||||||
SharedStrings *sharedStrings();
|
SharedStrings *sharedStrings() const;
|
||||||
Styles *styles();
|
Styles *styles();
|
||||||
QList<QImage> images();
|
QList<QImage> images();
|
||||||
QList<Drawing *> drawings();
|
QList<Drawing *> drawings();
|
||||||
|
|||||||
+24
-14
@@ -370,10 +370,9 @@ int Worksheet::writeString(int row, int column, const QString &value, Format *fo
|
|||||||
error = -2;
|
error = -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedStrings *sharedStrings = d->workbook->sharedStrings();
|
d->sharedStrings()->addSharedString(content);
|
||||||
int index = 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);
|
d->workbook->styles()->addFormat(format);
|
||||||
return error;
|
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.
|
//Write the hyperlink string as normal string.
|
||||||
SharedStrings *sharedStrings = d->workbook->sharedStrings();
|
d->sharedStrings()->addSharedString(urlString);
|
||||||
int index = sharedStrings->addSharedString(urlString);
|
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(urlString, Cell::String, format));
|
||||||
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(index, Cell::String, format));
|
|
||||||
|
|
||||||
//Store the hyperlink data in sa separate table
|
//Store the hyperlink data in sa separate table
|
||||||
d->urlTable[row][column] = new XlsxUrlData(link_type, urlString, locationString, tip);
|
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()));
|
writer.writeAttribute(QStringLiteral("s"), QString::number(colsInfoHelper[col]->format->xfIndex()));
|
||||||
|
|
||||||
if (cell->dataType() == Cell::String) {
|
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.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) {
|
} else if (cell->dataType() == Cell::InlineString) {
|
||||||
writer.writeAttribute(QStringLiteral("t"), QStringLiteral("inlineStr"));
|
writer.writeAttribute(QStringLiteral("t"), QStringLiteral("inlineStr"));
|
||||||
writer.writeStartElement(QStringLiteral("is"));
|
writer.writeStartElement(QStringLiteral("is"));
|
||||||
@@ -1177,12 +1175,15 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
|
|||||||
QString type = attributes.value(QLatin1String("t")).toString();
|
QString type = attributes.value(QLatin1String("t")).toString();
|
||||||
if (type == QLatin1String("s")) {
|
if (type == QLatin1String("s")) {
|
||||||
//string type
|
//string type
|
||||||
reader.readNextStartElement();
|
while (!(reader.name() == QLatin1String("c") && reader.tokenType() == QXmlStreamReader::EndElement)) {
|
||||||
if (reader.name() == QLatin1String("v")) {
|
reader.readNextStartElement();
|
||||||
QString value = reader.readElementText();
|
if (reader.name() == QLatin1String("v")) {
|
||||||
workbook->sharedStrings()->incRefByStringIndex(value.toInt());
|
int sst_idx = reader.readElementText().toInt();
|
||||||
Cell *data = new Cell(value ,Cell::String, format);
|
sharedStrings()->incRefByStringIndex(sst_idx);
|
||||||
cellTable[pos.x()][pos.y()] = QSharedPointer<Cell>(data);
|
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")) {
|
} else if (type == QLatin1String("inlineStr")) {
|
||||||
//inline string type
|
//inline string type
|
||||||
@@ -1345,4 +1346,13 @@ bool Worksheet::loadFromXmlData(const QByteArray &data)
|
|||||||
return loadFromXmlFile(&buffer);
|
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
|
QT_END_NAMESPACE_XLSX
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ namespace QXlsx {
|
|||||||
|
|
||||||
class XmlStreamWriter;
|
class XmlStreamWriter;
|
||||||
class XmlStreamReader;
|
class XmlStreamReader;
|
||||||
|
class SharedStrings;
|
||||||
|
|
||||||
struct XlsxUrlData
|
struct XlsxUrlData
|
||||||
{
|
{
|
||||||
@@ -179,6 +180,8 @@ public:
|
|||||||
void readColumnsInfo(XmlStreamReader &reader);
|
void readColumnsInfo(XmlStreamReader &reader);
|
||||||
void readMergeCells(XmlStreamReader &reader);
|
void readMergeCells(XmlStreamReader &reader);
|
||||||
|
|
||||||
|
SharedStrings *sharedStrings() const;
|
||||||
|
|
||||||
Workbook *workbook;
|
Workbook *workbook;
|
||||||
Drawing *drawing;
|
Drawing *drawing;
|
||||||
QMap<int, QMap<int, QSharedPointer<Cell> > > cellTable;
|
QMap<int, QMap<int, QSharedPointer<Cell> > > cellTable;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "xlsxcell.h"
|
#include "xlsxcell.h"
|
||||||
#include "private/xlsxworksheet_p.h"
|
#include "private/xlsxworksheet_p.h"
|
||||||
#include "private/xlsxxmlreader_p.h"
|
#include "private/xlsxxmlreader_p.h"
|
||||||
|
#include "private/xlsxsharedstrings_p.h"
|
||||||
|
|
||||||
class WorksheetTest : public QObject
|
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=\"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=\"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");
|
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()
|
void WorksheetTest::testMerge()
|
||||||
@@ -98,13 +101,14 @@ void WorksheetTest::testReadSheetData()
|
|||||||
reader.readNextStartElement();//current node is sheetData
|
reader.readNextStartElement();//current node is sheetData
|
||||||
|
|
||||||
QXlsx::Worksheet sheet("", 0);
|
QXlsx::Worksheet sheet("", 0);
|
||||||
|
sheet.d_ptr->sharedStrings()->addSharedString("Hello");
|
||||||
sheet.d_ptr->readSheetData(reader);
|
sheet.d_ptr->readSheetData(reader);
|
||||||
|
|
||||||
QCOMPARE(sheet.d_ptr->cellTable.size(), 2);
|
QCOMPARE(sheet.d_ptr->cellTable.size(), 2);
|
||||||
|
|
||||||
//A1
|
//A1
|
||||||
QCOMPARE(sheet.d_ptr->cellTable[0][0]->dataType(), QXlsx::Cell::String);
|
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
|
//B1
|
||||||
QCOMPARE(sheet.d_ptr->cellTable[0][1]->dataType(), QXlsx::Cell::Formula);
|
QCOMPARE(sheet.d_ptr->cellTable[0][1]->dataType(), QXlsx::Cell::Formula);
|
||||||
|
|||||||
Reference in New Issue
Block a user