diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index a074423..621839b 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -1172,6 +1172,39 @@ void WorksheetPrivate::readColumnsInfo(XmlStreamReader &reader) } } +void WorksheetPrivate::readMergeCells(XmlStreamReader &reader) +{ + Q_ASSERT(reader.name() == QLatin1String("mergeCells")); + + QXmlStreamAttributes attributes = reader.attributes(); + int count = attributes.value(QLatin1String("count")).toInt(); + + while(!(reader.name() == QLatin1String("mergeCells") && reader.tokenType() == QXmlStreamReader::EndElement)) { + reader.readNextStartElement(); + if (reader.tokenType() == QXmlStreamReader::StartElement) { + if (reader.name() == QLatin1String("mergeCell")) { + QXmlStreamAttributes attrs = reader.attributes(); + QString rangeStr = attrs.value(QLatin1String("ref")).toString(); + QStringList items = rangeStr.split(QLatin1Char(':')); + if (items.size() != 2) { + //Error + } else { + QPoint p0 = xl_cell_to_rowcol(items[0]); + QPoint p1 = xl_cell_to_rowcol(items[1]); + + XlsxCellRange range; + range.row_begin = p0.x(); + range.column_begin = p0.y(); + range.row_end = p1.x(); + range.column_end = p1.y(); + + merges.append(range); + } + } + } + } +} + bool Worksheet::loadFromXmlFile(QIODevice *device) { Q_D(Worksheet); @@ -1205,6 +1238,8 @@ bool Worksheet::loadFromXmlFile(QIODevice *device) d->readColumnsInfo(reader); } else if (reader.name() == QLatin1String("sheetData")) { d->readSheetData(reader); + } else if (reader.name() == QLatin1String("mergeCells")) { + d->readMergeCells(reader); } } } diff --git a/src/xlsx/xlsxworksheet_p.h b/src/xlsx/xlsxworksheet_p.h index a8849d7..45dcbae 100644 --- a/src/xlsx/xlsxworksheet_p.h +++ b/src/xlsx/xlsxworksheet_p.h @@ -198,6 +198,7 @@ public: void readSheetData(XmlStreamReader &reader); void readColumnsInfo(XmlStreamReader &reader); + void readMergeCells(XmlStreamReader &reader); Workbook *workbook; Drawing *drawing; diff --git a/tests/auto/worksheet/tst_worksheet.cpp b/tests/auto/worksheet/tst_worksheet.cpp index 2a4aeea..f72c793 100644 --- a/tests/auto/worksheet/tst_worksheet.cpp +++ b/tests/auto/worksheet/tst_worksheet.cpp @@ -20,6 +20,7 @@ private Q_SLOTS: void testReadSheetData(); void testReadColsInfo(); void testReadRowsInfo(); + void testReadMergeCells(); }; WorksheetTest::WorksheetTest() @@ -111,6 +112,20 @@ void WorksheetTest::testReadRowsInfo() QCOMPARE(sheet.d_ptr->rowsInfo[3]->height, 40.0); } +void WorksheetTest::testReadMergeCells() +{ + const QByteArray xmlData = ""; + + QXlsx::XmlStreamReader reader(xmlData); + reader.readNextStartElement();//current node is mergeCells + + QXlsx::Worksheet sheet("", 0); + sheet.d_ptr->readMergeCells(reader); + + QCOMPARE(sheet.d_ptr->merges.size(), 2); + QCOMPARE(sheet.d_ptr->merges[0].row_end, 4); +} + QTEST_APPLESS_MAIN(WorksheetTest) #include "tst_worksheet.moc"