Add inline string read/write support
This commit is contained in:
+2
-1
@@ -45,7 +45,8 @@ public:
|
|||||||
Numeric,
|
Numeric,
|
||||||
Formula,
|
Formula,
|
||||||
Boolean,
|
Boolean,
|
||||||
Error
|
Error,
|
||||||
|
InlineString
|
||||||
};
|
};
|
||||||
|
|
||||||
DataType dataType() const;
|
DataType dataType() const;
|
||||||
|
|||||||
@@ -378,6 +378,24 @@ int Worksheet::writeString(int row, int column, const QString &value, Format *fo
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Worksheet::writeInlineString(int row, int column, const QString &value, Format *format)
|
||||||
|
{
|
||||||
|
Q_D(Worksheet);
|
||||||
|
int error = 0;
|
||||||
|
QString content = value;
|
||||||
|
if (d->checkDimensions(row, column))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (value.size() > d->xls_strmax) {
|
||||||
|
content = value.left(d->xls_strmax);
|
||||||
|
error = -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::InlineString, format));
|
||||||
|
d->workbook->styles()->addFormat(format);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
int Worksheet::writeNumeric(int row, int column, double value, Format *format)
|
int Worksheet::writeNumeric(int row, int column, double value, Format *format)
|
||||||
{
|
{
|
||||||
Q_D(Worksheet);
|
Q_D(Worksheet);
|
||||||
@@ -742,6 +760,11 @@ void WorksheetPrivate::writeCellData(XmlStreamWriter &writer, int row, int col,
|
|||||||
//cell->data: Index of the string in sharedStringTable
|
//cell->data: Index of the string in sharedStringTable
|
||||||
writer.writeAttribute(QStringLiteral("t"), QStringLiteral("s"));
|
writer.writeAttribute(QStringLiteral("t"), QStringLiteral("s"));
|
||||||
writer.writeTextElement(QStringLiteral("v"), cell->value().toString());
|
writer.writeTextElement(QStringLiteral("v"), cell->value().toString());
|
||||||
|
} else if (cell->dataType() == Cell::InlineString) {
|
||||||
|
writer.writeAttribute(QStringLiteral("t"), QStringLiteral("inlineStr"));
|
||||||
|
writer.writeStartElement(QStringLiteral("is"));
|
||||||
|
writer.writeTextElement(QStringLiteral("t"), cell->value().toString());
|
||||||
|
writer.writeEndElement();//is
|
||||||
} else if (cell->dataType() == Cell::Numeric){
|
} else if (cell->dataType() == Cell::Numeric){
|
||||||
double value = cell->value().toDouble();
|
double value = cell->value().toDouble();
|
||||||
writer.writeTextElement(QStringLiteral("v"), QString::number(value, 'g', 15));
|
writer.writeTextElement(QStringLiteral("v"), QString::number(value, 'g', 15));
|
||||||
@@ -1131,6 +1154,18 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
|
|||||||
Cell *data = new Cell(value ,Cell::String, format);
|
Cell *data = new Cell(value ,Cell::String, format);
|
||||||
cellTable[pos.x()][pos.y()] = QSharedPointer<Cell>(data);
|
cellTable[pos.x()][pos.y()] = QSharedPointer<Cell>(data);
|
||||||
}
|
}
|
||||||
|
} else if (type == QLatin1String("inlineStr")) {
|
||||||
|
//inline string type
|
||||||
|
while (!(reader.name() == QLatin1String("c") && reader.tokenType() == QXmlStreamReader::EndElement)) {
|
||||||
|
reader.readNextStartElement();
|
||||||
|
if (reader.tokenType() == QXmlStreamReader::StartElement) {
|
||||||
|
if (reader.name() == QLatin1String("t")) {
|
||||||
|
QString value = reader.readElementText();
|
||||||
|
QSharedPointer<Cell> data(new Cell(value, Cell::InlineString, format));
|
||||||
|
cellTable[pos.x()][pos.y()] = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (type == QLatin1String("b")) {
|
} else if (type == QLatin1String("b")) {
|
||||||
//bool type
|
//bool type
|
||||||
reader.readNextStartElement();
|
reader.readNextStartElement();
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public:
|
|||||||
int write(const QString row_column, const QVariant &value, Format *format=0);
|
int write(const QString row_column, const QVariant &value, Format *format=0);
|
||||||
int write(int row, int column, const QVariant &value, Format *format=0);
|
int write(int row, int column, const QVariant &value, Format *format=0);
|
||||||
int writeString(int row, int column, const QString &value, Format *format=0);
|
int writeString(int row, int column, const QString &value, Format *format=0);
|
||||||
|
int writeInlineString(int row, int column, const QString &value, Format *format=0);
|
||||||
int writeNumeric(int row, int column, double value, Format *format=0);
|
int writeNumeric(int row, int column, double value, Format *format=0);
|
||||||
int writeFormula(int row, int column, const QString &formula, Format *format=0, double result=0);
|
int writeFormula(int row, int column, const QString &formula, Format *format=0, double result=0);
|
||||||
int writeBlank(int row, int column, Format *format=0);
|
int writeBlank(int row, int column, Format *format=0);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include <QtTest>
|
#include <QtTest>
|
||||||
|
|
||||||
#include "xlsxworksheet.h"
|
#include "xlsxworksheet.h"
|
||||||
|
#include "xlsxcell.h"
|
||||||
#include "private/xlsxworksheet_p.h"
|
#include "private/xlsxworksheet_p.h"
|
||||||
#include "private/xlsxxmlreader_p.h"
|
#include "private/xlsxxmlreader_p.h"
|
||||||
|
|
||||||
@@ -14,6 +15,8 @@ public:
|
|||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void testEmptySheet();
|
void testEmptySheet();
|
||||||
|
|
||||||
|
void testWriteCells();
|
||||||
void testMerge();
|
void testMerge();
|
||||||
void testUnMerge();
|
void testUnMerge();
|
||||||
|
|
||||||
@@ -36,6 +39,23 @@ void WorksheetTest::testEmptySheet()
|
|||||||
QVERIFY2(!xmldata.contains("<mergeCell"), "");
|
QVERIFY2(!xmldata.contains("<mergeCell"), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorksheetTest::testWriteCells()
|
||||||
|
{
|
||||||
|
QXlsx::Worksheet sheet("", 0);
|
||||||
|
sheet.write("A1", 123);
|
||||||
|
sheet.write("A2", "Hello");
|
||||||
|
sheet.writeInlineString(2, 0, "Hello inline"); //A3
|
||||||
|
sheet.write("A4", true);
|
||||||
|
|
||||||
|
QByteArray xmldata = sheet.saveToXmlData();
|
||||||
|
|
||||||
|
QVERIFY2(xmldata.contains("<c r=\"A1\"><v>123</v></c>"), "numeric");
|
||||||
|
QVERIFY2(xmldata.contains("<c r=\"A2\" t=\"s\"><v>0</v></c>"), "string");
|
||||||
|
QVERIFY2(xmldata.contains("<c r=\"A3\" t=\"inlineStr\"><is><t>Hello inline</t></is></c>"), "inline string");
|
||||||
|
QVERIFY2(xmldata.contains("<c r=\"A4\" t=\"b\"><v>1</v></c>"), "boolean");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void WorksheetTest::testMerge()
|
void WorksheetTest::testMerge()
|
||||||
{
|
{
|
||||||
QXlsx::Worksheet sheet("", 0);
|
QXlsx::Worksheet sheet("", 0);
|
||||||
@@ -66,6 +86,7 @@ void WorksheetTest::testReadSheetData()
|
|||||||
"</row>"
|
"</row>"
|
||||||
"<row r=\"3\" spans=\"1:6\">"
|
"<row r=\"3\" spans=\"1:6\">"
|
||||||
"<c r=\"B3\" s=\"1\"><v>12345</v></c>"
|
"<c r=\"B3\" s=\"1\"><v>12345</v></c>"
|
||||||
|
"<c r=\"C3\" s=\"1\" t=\"inlineStr\"><is><t>inline test string</t></is></c>"
|
||||||
"</row>"
|
"</row>"
|
||||||
"</sheetData>";
|
"</sheetData>";
|
||||||
QXlsx::XmlStreamReader reader(xmlData);
|
QXlsx::XmlStreamReader reader(xmlData);
|
||||||
@@ -75,6 +96,18 @@ void WorksheetTest::testReadSheetData()
|
|||||||
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
|
||||||
|
QCOMPARE(sheet.d_ptr->cellTable[0][0]->dataType(), QXlsx::Cell::String);
|
||||||
|
QCOMPARE(sheet.d_ptr->cellTable[0][0]->value().toInt(), 0);
|
||||||
|
|
||||||
|
//B3
|
||||||
|
QCOMPARE(sheet.d_ptr->cellTable[2][1]->dataType(), QXlsx::Cell::Numeric);
|
||||||
|
QCOMPARE(sheet.d_ptr->cellTable[2][1]->value().toInt(), 12345);
|
||||||
|
|
||||||
|
//C3
|
||||||
|
QCOMPARE(sheet.d_ptr->cellTable[2][2]->dataType(), QXlsx::Cell::InlineString);
|
||||||
|
QCOMPARE(sheet.d_ptr->cellTable[2][2]->value().toString(), QStringLiteral("inline test string"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorksheetTest::testReadColsInfo()
|
void WorksheetTest::testReadColsInfo()
|
||||||
|
|||||||
Reference in New Issue
Block a user