Can read .xlsx files with merge cells
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user