From 435ab82c3f689355ecf14bf36a94f5059f8dc0ff Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Thu, 24 Oct 2013 10:48:33 +0800 Subject: [PATCH] Add inline string read/write support --- src/xlsx/xlsxcell.h | 3 ++- src/xlsx/xlsxworksheet.cpp | 35 ++++++++++++++++++++++++++ src/xlsx/xlsxworksheet.h | 1 + tests/auto/worksheet/tst_worksheet.cpp | 33 ++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/xlsx/xlsxcell.h b/src/xlsx/xlsxcell.h index 7ee1183..c06a807 100644 --- a/src/xlsx/xlsxcell.h +++ b/src/xlsx/xlsxcell.h @@ -45,7 +45,8 @@ public: Numeric, Formula, Boolean, - Error + Error, + InlineString }; DataType dataType() const; diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index f58121f..f2767c4 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -378,6 +378,24 @@ int Worksheet::writeString(int row, int column, const QString &value, Format *fo 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(new Cell(value, Cell::InlineString, format)); + d->workbook->styles()->addFormat(format); + return error; +} + int Worksheet::writeNumeric(int row, int column, double value, Format *format) { Q_D(Worksheet); @@ -742,6 +760,11 @@ void WorksheetPrivate::writeCellData(XmlStreamWriter &writer, int row, int col, //cell->data: Index of the string in sharedStringTable writer.writeAttribute(QStringLiteral("t"), QStringLiteral("s")); 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){ double value = cell->value().toDouble(); 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); cellTable[pos.x()][pos.y()] = QSharedPointer(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 data(new Cell(value, Cell::InlineString, format)); + cellTable[pos.x()][pos.y()] = data; + } + } + } } else if (type == QLatin1String("b")) { //bool type reader.readNextStartElement(); diff --git a/src/xlsx/xlsxworksheet.h b/src/xlsx/xlsxworksheet.h index ea6ca03..e1ccd15 100755 --- a/src/xlsx/xlsxworksheet.h +++ b/src/xlsx/xlsxworksheet.h @@ -53,6 +53,7 @@ public: 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 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 writeFormula(int row, int column, const QString &formula, Format *format=0, double result=0); int writeBlank(int row, int column, Format *format=0); diff --git a/tests/auto/worksheet/tst_worksheet.cpp b/tests/auto/worksheet/tst_worksheet.cpp index f72c793..421bbb3 100644 --- a/tests/auto/worksheet/tst_worksheet.cpp +++ b/tests/auto/worksheet/tst_worksheet.cpp @@ -2,6 +2,7 @@ #include #include "xlsxworksheet.h" +#include "xlsxcell.h" #include "private/xlsxworksheet_p.h" #include "private/xlsxxmlreader_p.h" @@ -14,6 +15,8 @@ public: private Q_SLOTS: void testEmptySheet(); + + void testWriteCells(); void testMerge(); void testUnMerge(); @@ -36,6 +39,23 @@ void WorksheetTest::testEmptySheet() QVERIFY2(!xmldata.contains("123"), "numeric"); + QVERIFY2(xmldata.contains("0"), "string"); + QVERIFY2(xmldata.contains("Hello inline"), "inline string"); + QVERIFY2(xmldata.contains("1"), "boolean"); + +} + void WorksheetTest::testMerge() { QXlsx::Worksheet sheet("", 0); @@ -66,6 +86,7 @@ void WorksheetTest::testReadSheetData() "" "" "12345" + "inline test string" "" ""; QXlsx::XmlStreamReader reader(xmlData); @@ -75,6 +96,18 @@ void WorksheetTest::testReadSheetData() 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); + + //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()