Browse Source

Add basic formula read support

master
Debao Zhang 11 years ago
parent
commit
7805e37322
  1. 51
      src/xlsx/xlsxworksheet.cpp
  2. 1
      src/xlsx/xlsxworksheet_p.h
  3. 17
      tests/auto/worksheet/tst_worksheet.cpp

51
src/xlsx/xlsxworksheet.cpp

@ -1101,6 +1101,36 @@ QByteArray Worksheet::saveToXmlData()
return data;
}
QSharedPointer<Cell> WorksheetPrivate::readNumericCellData(XmlStreamReader &reader)
{
Q_ASSERT(reader.name() == QLatin1String("c"));
QString v_str;
QString f_str;
while (!(reader.name() == QLatin1String("c") && reader.tokenType() == QXmlStreamReader::EndElement)) {
reader.readNextStartElement();
if (reader.tokenType() == QXmlStreamReader::StartElement) {
if (reader.name() == QLatin1String("v"))
v_str = reader.readElementText();
else if (reader.name() == QLatin1String("f"))
f_str = reader.readElementText();
}
}
if (v_str.isEmpty() && f_str.isEmpty()) {
//blank type
return QSharedPointer<Cell>(new Cell(QVariant(), Cell::Blank));
} else if (f_str.isEmpty()) {
//numeric type
return QSharedPointer<Cell>(new Cell(v_str.toDouble(), Cell::Numeric));
} else {
//formula type
QSharedPointer<Cell> cell(new Cell(v_str.toDouble(), Cell::Formula));
cell->d_ptr->formula = f_str;
return cell;
}
}
void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
{
Q_ASSERT(reader.name() == QLatin1String("sheetData"));
@ -1174,16 +1204,21 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
QSharedPointer<Cell> data(new Cell(value.toInt() ? true : false, Cell::Boolean, format));
cellTable[pos.x()][pos.y()] = data;
}
} else if (type == QLatin1String("str")) {
//formula type
QSharedPointer<Cell> data = readNumericCellData(reader);
data->d_ptr->format = format;
cellTable[pos.x()][pos.y()] = data;
} else if (type == QLatin1String("n")) {
QSharedPointer<Cell> data = readNumericCellData(reader);
data->d_ptr->format = format;
cellTable[pos.x()][pos.y()] = data;
}
} else {
//number type
reader.readNextStartElement();
if (reader.name() == QLatin1String("v")) {
QString value = reader.readElementText();
Cell *data = new Cell(value ,Cell::Numeric, format);
cellTable[pos.x()][pos.y()] = QSharedPointer<Cell>(data);
}
}
//default is "n"
QSharedPointer<Cell> data = readNumericCellData(reader);
data->d_ptr->format = format;
cellTable[pos.x()][pos.y()] = data; }
}
}
}

1
src/xlsx/xlsxworksheet_p.h

@ -174,6 +174,7 @@ public:
XlsxObjectPositionData objectPixelsPosition(int col_start, int row_start, double x1, double y1, double width, double height);
XlsxObjectPositionData pixelsToEMUs(const XlsxObjectPositionData &data);
QSharedPointer<Cell> readNumericCellData(XmlStreamReader &reader);
void readSheetData(XmlStreamReader &reader);
void readColumnsInfo(XmlStreamReader &reader);
void readMergeCells(XmlStreamReader &reader);

17
tests/auto/worksheet/tst_worksheet.cpp

@ -46,6 +46,8 @@ void WorksheetTest::testWriteCells()
sheet.write("A2", "Hello");
sheet.writeInlineString(2, 0, "Hello inline"); //A3
sheet.write("A4", true);
sheet.write("A5", "=44+33");
sheet.writeFormula(4, 1, "44+33", 0, 77);
QByteArray xmldata = sheet.saveToXmlData();
@ -53,7 +55,8 @@ void WorksheetTest::testWriteCells()
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");
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");
}
void WorksheetTest::testMerge()
@ -83,6 +86,8 @@ void WorksheetTest::testReadSheetData()
const QByteArray xmlData = "<sheetData>"
"<row r=\"1\" spans=\"1:6\">"
"<c r=\"A1\" s=\"1\" t=\"s\"><v>0</v></c>"
"<c r=\"B1\"><f>44+33</f><v>77</v></c>"
"<c r=\"C1\" t=\"str\"><f>44+33</f><v>77</v></c>"
"</row>"
"<row r=\"3\" spans=\"1:6\">"
"<c r=\"B3\" s=\"1\"><v>12345</v></c>"
@ -101,6 +106,16 @@ void WorksheetTest::testReadSheetData()
QCOMPARE(sheet.d_ptr->cellTable[0][0]->dataType(), QXlsx::Cell::String);
QCOMPARE(sheet.d_ptr->cellTable[0][0]->value().toInt(), 0);
//B1
QCOMPARE(sheet.d_ptr->cellTable[0][1]->dataType(), QXlsx::Cell::Formula);
QCOMPARE(sheet.d_ptr->cellTable[0][1]->value().toInt(), 77);
QCOMPARE(sheet.d_ptr->cellTable[0][1]->formula(), QStringLiteral("44+33"));
//C1
QCOMPARE(sheet.d_ptr->cellTable[0][2]->dataType(), QXlsx::Cell::Formula);
QCOMPARE(sheet.d_ptr->cellTable[0][2]->value().toInt(), 77);
QCOMPARE(sheet.d_ptr->cellTable[0][2]->formula(), QStringLiteral("44+33"));
//B3
QCOMPARE(sheet.d_ptr->cellTable[2][1]->dataType(), QXlsx::Cell::Numeric);
QCOMPARE(sheet.d_ptr->cellTable[2][1]->value().toInt(), 12345);

Loading…
Cancel
Save