Browse Source

Add mergeCells() function

master
Debao Zhang 11 years ago
parent
commit
5f444294bd
  1. 28
      examples/xlsx/mergecells/main.cpp
  2. 6
      examples/xlsx/mergecells/mergecells.pro
  3. 3
      examples/xlsx/xlsx.pro
  4. 87
      src/xlsx/xlsxworksheet.cpp
  5. 9
      src/xlsx/xlsxworksheet.h
  6. 19
      src/xlsx/xlsxworksheet_p.h
  7. 3
      tests/auto/auto.pro
  8. 18
      tests/auto/mergecell/mergecell.pro
  9. 71
      tests/auto/mergecell/tst_mergecelltest.cpp
  10. 5
      tests/auto/utility/utility.pro

28
examples/xlsx/mergecells/main.cpp

@ -0,0 +1,28 @@
#include <QtGui>
#include "xlsxworkbook.h"
#include "xlsxworksheet.h"
#ifdef Q_OS_MAC
# define DATA_PATH "../../../"
#else
# define DATA_PATH "./"
#endif
int main(int argc, char** argv)
{
QGuiApplication(argc, argv);
QXlsx::Workbook workbook;
QXlsx::Worksheet *sheet = workbook.addWorksheet();
sheet->write("B1", "Merge Cells");
sheet->mergeCells("B1:B5");
sheet->write("E2", "Merge Cells 2");
sheet->mergeCells("E2:G4");
workbook.save(DATA_PATH"Test.xlsx");
return 0;
}

6
examples/xlsx/mergecells/mergecells.pro

@ -0,0 +1,6 @@
TARGET = mergecells
#include(../../../src/xlsx/qtxlsx.pri)
QT += xlsx
SOURCES += main.cpp

3
examples/xlsx/xlsx.pro

@ -1,5 +1,6 @@
TEMPLATE = subdirs TEMPLATE = subdirs
SUBDIRS = hello style \ SUBDIRS = hello style \
documentproperty \ documentproperty \
image image \
mergecells

87
src/xlsx/xlsxworksheet.cpp

@ -484,6 +484,74 @@ int Worksheet::insertImage(int row, int column, const QImage &image, const QPoin
return 0; return 0;
} }
int Worksheet::mergeCells(const QString &range)
{
Q_D(Worksheet);
QStringList cells = range.split(QLatin1Char(':'));
if (cells.size() != 2)
return -1;
QPoint cell1 = xl_cell_to_rowcol(cells[0]);
QPoint cell2 = xl_cell_to_rowcol(cells[1]);
if (cell1 == QPoint(-1,-1) || cell2 == QPoint(-1, -1))
return -1;
return mergeCells(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;
if (d->checkDimensions(row_end, column_end))
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);
return 0;
}
int Worksheet::unmergeCells(const QString &range)
{
Q_D(Worksheet);
QStringList cells = range.split(QLatin1Char(':'));
if (cells.size() != 2)
return -1;
QPoint cell1 = xl_cell_to_rowcol(cells[0]);
QPoint cell2 = xl_cell_to_rowcol(cells[1]);
if (cell1 == QPoint(-1,-1) || cell2 == QPoint(-1, -1))
return -1;
return unmergeCells(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;
}
void Worksheet::saveToXmlFile(QIODevice *device) void Worksheet::saveToXmlFile(QIODevice *device)
{ {
Q_D(Worksheet); Q_D(Worksheet);
@ -555,6 +623,7 @@ void Worksheet::saveToXmlFile(QIODevice *device)
} }
writer.writeEndElement();//sheetData writer.writeEndElement();//sheetData
d->writeMergeCells(writer);
d->writeHyperlinks(writer); d->writeHyperlinks(writer);
d->writeDrawings(writer); d->writeDrawings(writer);
@ -662,6 +731,24 @@ void WorksheetPrivate::writeCellData(XmlStreamWriter &writer, int row, int col,
writer.writeEndElement(); //c writer.writeEndElement(); //c
} }
void WorksheetPrivate::writeMergeCells(XmlStreamWriter &writer)
{
if (merges.isEmpty())
return;
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);
writer.writeEmptyElement(QStringLiteral("mergeCell"));
writer.writeAttribute(QStringLiteral("ref"), cell1+QLatin1Char(':')+cell2);
}
writer.writeEndElement(); //mergeCells
}
void WorksheetPrivate::writeHyperlinks(XmlStreamWriter &writer) void WorksheetPrivate::writeHyperlinks(XmlStreamWriter &writer)
{ {
if (urlTable.isEmpty()) if (urlTable.isEmpty())

9
src/xlsx/xlsxworksheet.h

@ -62,17 +62,23 @@ public:
int insertImage(int row, int column, const QImage &image, const QPointF &offset=QPointF(), double xScale=1, double yScale=1); int insertImage(int row, int column, const QImage &image, const QPointF &offset=QPointF(), double xScale=1, double yScale=1);
int mergeCells(int row_begin, int column_begin, int row_end, int column_end);
int mergeCells(const QString &range);
int unmergeCells(int row_begin, int column_begin, int row_end, int column_end);
int unmergeCells(const QString &range);
bool setRow(int row, double height, Format* format=0, bool hidden=false); 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); bool setColumn(int colFirst, int colLast, double width, Format* format=0, bool hidden=false);
void setRightToLeft(bool enable); void setRightToLeft(bool enable);
void setZeroValuesHidden(bool enable); void setZeroValuesHidden(bool enable);
void saveToXmlFile(QIODevice *device);
~Worksheet();
private: private:
friend class Package; friend class Package;
friend class Workbook; friend class Workbook;
Worksheet(const QString &sheetName, Workbook *parent=0); Worksheet(const QString &sheetName, Workbook *parent=0);
~Worksheet();
virtual bool isChartsheet() const; virtual bool isChartsheet() const;
QString name() const; QString name() const;
@ -80,7 +86,6 @@ private:
bool isSelected() const; bool isSelected() const;
void setHidden(bool hidden); void setHidden(bool hidden);
void setSelected(bool select); void setSelected(bool select);
void saveToXmlFile(QIODevice *device);
QStringList externUrlList() const; QStringList externUrlList() const;
QStringList externDrawingList() const; QStringList externDrawingList() const;
QList<QPair<QString, QString> > drawingLinks() const; QList<QPair<QString, QString> > drawingLinks() const;

19
src/xlsx/xlsxworksheet_p.h

@ -82,6 +82,23 @@ struct XlsxImageData
double yScale; 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 The vertices that define the position of a graphical object
within the worksheet in pixels. within the worksheet in pixels.
@ -166,6 +183,7 @@ public:
void calculateSpans(); void calculateSpans();
void writeSheetData(XmlStreamWriter &writer); void writeSheetData(XmlStreamWriter &writer);
void writeCellData(XmlStreamWriter &writer, int row, int col, XlsxCellData *cell); void writeCellData(XmlStreamWriter &writer, int row, int col, XlsxCellData *cell);
void writeMergeCells(XmlStreamWriter &writer);
void writeHyperlinks(XmlStreamWriter &writer); void writeHyperlinks(XmlStreamWriter &writer);
void writeDrawings(XmlStreamWriter &writer); void writeDrawings(XmlStreamWriter &writer);
int rowPixelsSize(int row); int rowPixelsSize(int row);
@ -178,6 +196,7 @@ public:
QMap<int, QMap<int, XlsxCellData *> > cellTable; QMap<int, QMap<int, XlsxCellData *> > cellTable;
QMap<int, QMap<int, QString> > comments; QMap<int, QMap<int, QString> > comments;
QMap<int, QMap<int, XlsxUrlData *> > urlTable; QMap<int, QMap<int, XlsxUrlData *> > urlTable;
QList<XlsxCellRange> merges;
QStringList externUrlList; QStringList externUrlList;
QStringList externDrawingList; QStringList externDrawingList;
QList<XlsxImageData *> imageList; QList<XlsxImageData *> imageList;

3
tests/auto/auto.pro

@ -1,3 +1,4 @@
TEMPLATE=subdirs TEMPLATE=subdirs
SUBDIRS=\ SUBDIRS=\
utility utility \
mergecell

18
tests/auto/mergecell/mergecell.pro

@ -0,0 +1,18 @@
#-------------------------------------------------
#
# Project created by QtCreator 2013-09-06T10:52:56
#
#-------------------------------------------------
QT += testlib xlsx xlsx-private
CONFIG += testcase
DEFINES += XLSX_TEST
TARGET = tst_mergecelltest
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += tst_mergecelltest.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"

71
tests/auto/mergecell/tst_mergecelltest.cpp

@ -0,0 +1,71 @@
#include <QBuffer>
#include <QtTest>
#include "xlsxworksheet.h"
#include "xlsxworkbook.h"
class MergeCellTest : public QObject
{
Q_OBJECT
public:
MergeCellTest();
private Q_SLOTS:
void testWithoutMerge();
void testMerge();
void testUnMerge();
};
MergeCellTest::MergeCellTest()
{
}
void MergeCellTest::testWithoutMerge()
{
QXlsx::Workbook book;
QXlsx::Worksheet *sheet = book.addWorksheet("Sheet1");
sheet->write("B1", "Hello");
QByteArray xmldata;
QBuffer buffer(&xmldata);
buffer.open(QIODevice::WriteOnly);
sheet->saveToXmlFile(&buffer);
QVERIFY2(!xmldata.contains("<mergeCell"), "");
}
void MergeCellTest::testMerge()
{
QXlsx::Workbook book;
QXlsx::Worksheet *sheet = book.addWorksheet("Sheet1");
sheet->write("B1", "Test Merged Cell");
sheet->mergeCells("B1:B5");
QByteArray xmldata;
QBuffer buffer(&xmldata);
buffer.open(QIODevice::WriteOnly);
sheet->saveToXmlFile(&buffer);
QVERIFY2(xmldata.contains("<mergeCells count=\"1\"><mergeCell ref=\"B1:B5\"/></mergeCells>"), "");
}
void MergeCellTest::testUnMerge()
{
QXlsx::Workbook book;
QXlsx::Worksheet *sheet = book.addWorksheet("Sheet1");
sheet->write("B1", "Test Merged Cell");
sheet->mergeCells("B1:B5");
sheet->unmergeCells("B1:B5");
QByteArray xmldata;
QBuffer buffer(&xmldata);
buffer.open(QIODevice::WriteOnly);
sheet->saveToXmlFile(&buffer);
QVERIFY2(!xmldata.contains("<mergeCell"), "");
}
QTEST_APPLESS_MAIN(MergeCellTest)
#include "tst_mergecelltest.moc"

5
tests/auto/utility/utility.pro

@ -5,15 +5,14 @@
#------------------------------------------------- #-------------------------------------------------
QT += testlib xlsx xlsx-private QT += testlib xlsx xlsx-private
CONFIG += testcase
DEFINES += XLSX_TEST
TARGET = tst_utilitytest TARGET = tst_utilitytest
CONFIG += console CONFIG += console
CONFIG -= app_bundle CONFIG -= app_bundle
DEFINES += XLSX_TEST
TEMPLATE = app TEMPLATE = app
SOURCES += tst_utilitytest.cpp SOURCES += tst_utilitytest.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\" DEFINES += SRCDIR=\\\"$$PWD/\\\"

Loading…
Cancel
Save