From 0155cc5409e0efed898e5658aeebf93c1b09e5b4 Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Tue, 29 Oct 2013 17:24:44 +0800 Subject: [PATCH] Using QXlsx::CellRange instead of the private XlsxCellRange --- src/xlsx/xlsxcellrange.h | 12 +++++ src/xlsx/xlsxworksheet.cpp | 65 +++++++++++--------------- src/xlsx/xlsxworksheet.h | 3 ++ src/xlsx/xlsxworksheet_p.h | 19 +------- tests/auto/worksheet/tst_worksheet.cpp | 2 +- 5 files changed, 44 insertions(+), 57 deletions(-) diff --git a/src/xlsx/xlsxcellrange.h b/src/xlsx/xlsxcellrange.h index c3e70dd..ac9ae9f 100644 --- a/src/xlsx/xlsxcellrange.h +++ b/src/xlsx/xlsxcellrange.h @@ -45,10 +45,22 @@ public: inline int rowCount() const { return bottom - top + 1; } inline int columnCount() const { return right - left + 1; } + inline bool operator ==(const CellRange &other) const + { + return top==other.top && bottom==other.bottom + && left == other.left && right == other.right; + } + inline bool operator !=(const CellRange &other) const + { + return top!=other.top || bottom!=other.bottom + || left != other.left || right != other.right; + } private: int top, left, bottom, right; }; QT_END_NAMESPACE_XLSX +Q_DECLARE_TYPEINFO(QXlsx::CellRange, Q_MOVABLE_TYPE); + #endif // QXLSX_XLSXCELLRANGE_H diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index 779d53f..3fdb1e7 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -545,6 +545,19 @@ int Worksheet::insertImage(int row, int column, const QImage &image, const QPoin return 0; } +int Worksheet::mergeCells(const CellRange &range) +{ + Q_D(Worksheet); + if (range.rowCount() < 2 && range.columnCount() < 2) + return -1; + + if (d->checkDimensions(range.firstRow(), range.firstColumn())) + return -1; + + d->merges.append(range); + return 0; +} + int Worksheet::mergeCells(const QString &range) { QStringList cells = range.split(QLatin1Char(':')); @@ -556,27 +569,21 @@ int Worksheet::mergeCells(const QString &range) if (cell1 == QPoint(-1,-1) || cell2 == QPoint(-1, -1)) return -1; - return mergeCells(cell1.x(), cell1.y(), cell2.x(), cell2.y()); + return mergeCells(CellRange(cell1.x(), cell1.y(), cell2.x(), cell2.y())); } int Worksheet::mergeCells(int row_begin, int column_begin, int row_end, int column_end) { - Q_D(Worksheet); - - if (row_begin == row_end && column_begin == column_end) - return -1; + return mergeCells(CellRange(row_begin, column_begin, row_end, column_end)); +} - if (d->checkDimensions(row_end, column_end)) +int Worksheet::unmergeCells(const CellRange &range) +{ + Q_D(Worksheet); + if (!d->merges.contains(range)) return -1; - XlsxCellRange range; - range.row_begin = row_begin; - range.row_end = row_end; - range.column_begin = column_begin; - range.column_end = column_end; - - d->merges.append(range); - + d->merges.removeOne(range); return 0; } @@ -591,24 +598,12 @@ int Worksheet::unmergeCells(const QString &range) if (cell1 == QPoint(-1,-1) || cell2 == QPoint(-1, -1)) return -1; - return unmergeCells(cell1.x(), cell1.y(), cell2.x(), cell2.y()); + return unmergeCells(CellRange(cell1.x(), cell1.y(), cell2.x(), cell2.y())); } int Worksheet::unmergeCells(int row_begin, int column_begin, int row_end, int column_end) { - Q_D(Worksheet); - XlsxCellRange range; - range.row_begin = row_begin; - range.row_end = row_end; - range.column_begin = column_begin; - range.column_end = column_end; - - if (!d->merges.contains(range)) - return -1; - - d->merges.removeOne(range); - - return 0; + return unmergeCells(CellRange(row_begin, column_begin, row_end, column_end)); } void Worksheet::saveToXmlFile(QIODevice *device) @@ -793,9 +788,9 @@ void WorksheetPrivate::writeMergeCells(XmlStreamWriter &writer) writer.writeStartElement(QStringLiteral("mergeCells")); writer.writeAttribute(QStringLiteral("count"), QString::number(merges.size())); - foreach (XlsxCellRange range, merges) { - QString cell1 = xl_rowcol_to_cell(range.row_begin, range.column_begin); - QString cell2 = xl_rowcol_to_cell(range.row_end, range.column_end); + foreach (CellRange range, merges) { + QString cell1 = xl_rowcol_to_cell(range.firstRow(), range.firstColumn()); + QString cell2 = xl_rowcol_to_cell(range.lastRow(), range.lastColumn()); writer.writeEmptyElement(QStringLiteral("mergeCell")); writer.writeAttribute(QStringLiteral("ref"), cell1+QLatin1Char(':')+cell2); } @@ -1446,13 +1441,7 @@ void WorksheetPrivate::readMergeCells(XmlStreamReader &reader) 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); + merges.append(CellRange(p0.x(), p0.y(), p1.x(), p1.y())); } } } diff --git a/src/xlsx/xlsxworksheet.h b/src/xlsx/xlsxworksheet.h index 38003f4..d8c8b97 100755 --- a/src/xlsx/xlsxworksheet.h +++ b/src/xlsx/xlsxworksheet.h @@ -27,6 +27,7 @@ #include "xlsxglobal.h" #include "xlsxcell.h" +#include "xlsxcellrange.h" #include #include #include @@ -71,8 +72,10 @@ public: int mergeCells(int row_begin, int column_begin, int row_end, int column_end); int mergeCells(const QString &range); + int mergeCells(const CellRange &range); int unmergeCells(int row_begin, int column_begin, int row_end, int column_end); int unmergeCells(const QString &range); + int unmergeCells(const CellRange &range); bool setRow(int row, double height, Format* format=0, bool hidden=false); bool setColumn(int colFirst, int colLast, double width, Format* format=0, bool hidden=false); diff --git a/src/xlsx/xlsxworksheet_p.h b/src/xlsx/xlsxworksheet_p.h index 817aa46..9776aa5 100644 --- a/src/xlsx/xlsxworksheet_p.h +++ b/src/xlsx/xlsxworksheet_p.h @@ -74,23 +74,6 @@ struct XlsxImageData double yScale; }; -struct XlsxCellRange -{ - int row_begin; - int row_end; - int column_begin; - int column_end; - - bool operator ==(const XlsxCellRange &other) const { - return row_begin==other.row_begin && row_end==other.row_end - && column_begin == other.column_begin && column_end==other.column_end; - } - bool operator !=(const XlsxCellRange &other) const { - return row_begin!=other.row_begin || row_end!=other.row_end - || column_begin != other.column_begin || column_end!=other.column_end; - } -}; - /* The vertices that define the position of a graphical object within the worksheet in pixels. @@ -198,7 +181,7 @@ public: QMap > > cellTable; QMap > comments; QMap > urlTable; - QList merges; + QList merges; QStringList externUrlList; QStringList externDrawingList; QList imageList; diff --git a/tests/auto/worksheet/tst_worksheet.cpp b/tests/auto/worksheet/tst_worksheet.cpp index 2a6ed21..c0f0ca7 100644 --- a/tests/auto/worksheet/tst_worksheet.cpp +++ b/tests/auto/worksheet/tst_worksheet.cpp @@ -299,7 +299,7 @@ void WorksheetTest::testReadMergeCells() sheet.d_ptr->readMergeCells(reader); QCOMPARE(sheet.d_ptr->merges.size(), 2); - QCOMPARE(sheet.d_ptr->merges[0].row_end, 4); + QCOMPARE(sheet.d_ptr->merges[0].toString(), QStringLiteral("B1:B5")); } void WorksheetTest::testReadDataValidations()