Browse Source

Add inline string read/write support

master
Debao Zhang 11 years ago
parent
commit
435ab82c3f
  1. 3
      src/xlsx/xlsxcell.h
  2. 35
      src/xlsx/xlsxworksheet.cpp
  3. 1
      src/xlsx/xlsxworksheet.h
  4. 33
      tests/auto/worksheet/tst_worksheet.cpp

3
src/xlsx/xlsxcell.h

@ -45,7 +45,8 @@ public:
Numeric, Numeric,
Formula, Formula,
Boolean, Boolean,
Error Error,
InlineString
}; };
DataType dataType() const; DataType dataType() const;

35
src/xlsx/xlsxworksheet.cpp

@ -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();

1
src/xlsx/xlsxworksheet.h

@ -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);

33
tests/auto/worksheet/tst_worksheet.cpp

@ -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()

Loading…
Cancel
Save