Browse Source

Can read .xlsx files with merge cells

master
Debao Zhang 11 years ago
parent
commit
a112f5d2e7
  1. 35
      src/xlsx/xlsxworksheet.cpp
  2. 1
      src/xlsx/xlsxworksheet_p.h
  3. 15
      tests/auto/worksheet/tst_worksheet.cpp

35
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) bool Worksheet::loadFromXmlFile(QIODevice *device)
{ {
Q_D(Worksheet); Q_D(Worksheet);
@ -1205,6 +1238,8 @@ bool Worksheet::loadFromXmlFile(QIODevice *device)
d->readColumnsInfo(reader); d->readColumnsInfo(reader);
} else if (reader.name() == QLatin1String("sheetData")) { } else if (reader.name() == QLatin1String("sheetData")) {
d->readSheetData(reader); d->readSheetData(reader);
} else if (reader.name() == QLatin1String("mergeCells")) {
d->readMergeCells(reader);
} }
} }
} }

1
src/xlsx/xlsxworksheet_p.h

@ -198,6 +198,7 @@ public:
void readSheetData(XmlStreamReader &reader); void readSheetData(XmlStreamReader &reader);
void readColumnsInfo(XmlStreamReader &reader); void readColumnsInfo(XmlStreamReader &reader);
void readMergeCells(XmlStreamReader &reader);
Workbook *workbook; Workbook *workbook;
Drawing *drawing; Drawing *drawing;

15
tests/auto/worksheet/tst_worksheet.cpp

@ -20,6 +20,7 @@ private Q_SLOTS:
void testReadSheetData(); void testReadSheetData();
void testReadColsInfo(); void testReadColsInfo();
void testReadRowsInfo(); void testReadRowsInfo();
void testReadMergeCells();
}; };
WorksheetTest::WorksheetTest() WorksheetTest::WorksheetTest()
@ -111,6 +112,20 @@ void WorksheetTest::testReadRowsInfo()
QCOMPARE(sheet.d_ptr->rowsInfo[3]->height, 40.0); QCOMPARE(sheet.d_ptr->rowsInfo[3]->height, 40.0);
} }
void WorksheetTest::testReadMergeCells()
{
const QByteArray xmlData = "<mergeCells count=\"2\"><mergeCell ref=\"B1:B5\"/><mergeCell ref=\"E2:G4\"/></mergeCells>";
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) QTEST_APPLESS_MAIN(WorksheetTest)
#include "tst_worksheet.moc" #include "tst_worksheet.moc"

Loading…
Cancel
Save