Add basic worksheet copy support
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
/*!
|
||||||
|
\example worksheetoperations
|
||||||
|
\title Worksheet Operations Example
|
||||||
|
\brief Copy, delete, move worksheet
|
||||||
|
\ingroup qtxlsx-examples
|
||||||
|
|
||||||
|
This example demonstrates how to copy, delete, move worksheet.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#include <QtCore>
|
||||||
|
#include "xlsxdocument.h"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
QXlsx::Document xlsx;
|
||||||
|
|
||||||
|
xlsx.renameWorksheet("Sheet1", "TheFirstSheet");
|
||||||
|
|
||||||
|
for (int i=1; i<20; ++i) {
|
||||||
|
for (int j=1; j<15; ++j)
|
||||||
|
xlsx.write(i, j, QString("R %1 C %2").arg(i).arg(j));
|
||||||
|
}
|
||||||
|
|
||||||
|
xlsx.addWorksheet("TheSecondSheet");
|
||||||
|
xlsx.write(2, 2, "Hello Qt Xlsx");
|
||||||
|
|
||||||
|
xlsx.copyWorksheet("TheFirstSheet", "CopyOfTheFirst");
|
||||||
|
|
||||||
|
xlsx.addWorksheet("TheForthSheet");
|
||||||
|
xlsx.write(3, 3, "This will be deleted...");
|
||||||
|
|
||||||
|
xlsx.selectWorksheet("CopyOfTheFirst");
|
||||||
|
xlsx.write(25, 2, "On the Copy Sheet");
|
||||||
|
|
||||||
|
xlsx.deleteWorksheet("TheForthSheet");
|
||||||
|
|
||||||
|
xlsx.moveWorksheet("TheSecondSheet", 0);
|
||||||
|
|
||||||
|
xlsx.save();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
TARGET = worksheetoperations
|
||||||
|
|
||||||
|
#include(../../../src/xlsx/qtxlsx.pri)
|
||||||
|
QT+=xlsx
|
||||||
|
|
||||||
|
CONFIG += console
|
||||||
|
CONFIG -= app_bundle
|
||||||
|
|
||||||
|
SOURCES += main.cpp
|
||||||
@@ -12,5 +12,6 @@ SUBDIRS = hello \
|
|||||||
formulas \
|
formulas \
|
||||||
richtext \
|
richtext \
|
||||||
conditionalformatting \
|
conditionalformatting \
|
||||||
|
worksheetoperations \
|
||||||
demo
|
demo
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,14 @@ CellPrivate::CellPrivate(Cell *p) :
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CellPrivate::CellPrivate(const CellPrivate * const cp)
|
||||||
|
: value(cp->value), formula(cp->formula), dataType(cp->dataType)
|
||||||
|
, format(cp->format), range(cp->range), richString(cp->richString)
|
||||||
|
, parent(cp->parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class Cell
|
\class Cell
|
||||||
\inmodule QtXlsx
|
\inmodule QtXlsx
|
||||||
@@ -72,6 +80,15 @@ Cell::Cell(const QVariant &data, DataType type, const Format &format, Worksheet
|
|||||||
d_ptr->parent = parent;
|
d_ptr->parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \internal
|
||||||
|
*/
|
||||||
|
Cell::Cell(const Cell * const cell):
|
||||||
|
d_ptr(new CellPrivate(cell->d_ptr))
|
||||||
|
{
|
||||||
|
d_ptr->q_ptr = this;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Destroys the Cell and cleans up.
|
* Destroys the Cell and cleans up.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ private:
|
|||||||
friend class WorksheetPrivate;
|
friend class WorksheetPrivate;
|
||||||
|
|
||||||
Cell(const QVariant &data=QVariant(), DataType type=Blank, const Format &format=Format(), Worksheet *parent=0);
|
Cell(const QVariant &data=QVariant(), DataType type=Blank, const Format &format=Format(), Worksheet *parent=0);
|
||||||
|
Cell(const Cell * const cell);
|
||||||
CellPrivate * const d_ptr;
|
CellPrivate * const d_ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ class CellPrivate
|
|||||||
Q_DECLARE_PUBLIC(Cell)
|
Q_DECLARE_PUBLIC(Cell)
|
||||||
public:
|
public:
|
||||||
CellPrivate(Cell *p);
|
CellPrivate(Cell *p);
|
||||||
|
CellPrivate(const CellPrivate * const cp);
|
||||||
|
|
||||||
QVariant value;
|
QVariant value;
|
||||||
QString formula;
|
QString formula;
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public:
|
|||||||
bool insertWorkSheet(int index, const QString &name = QString());
|
bool insertWorkSheet(int index, const QString &name = QString());
|
||||||
bool selectWorksheet(const QString &name);
|
bool selectWorksheet(const QString &name);
|
||||||
bool renameWorksheet(const QString &oldName, const QString &newName);
|
bool renameWorksheet(const QString &oldName, const QString &newName);
|
||||||
bool copyWorksheet(const QString &srcName, const QString &distName);
|
bool copyWorksheet(const QString &srcName, const QString &distName = QString());
|
||||||
bool moveWorksheet(const QString &srcName, int distIndex);
|
bool moveWorksheet(const QString &srcName, int distIndex);
|
||||||
bool deleteWorksheet(const QString &name);
|
bool deleteWorksheet(const QString &name);
|
||||||
|
|
||||||
|
|||||||
@@ -282,7 +282,33 @@ bool Workbook::copyWorksheet(int index, const QString &newName)
|
|||||||
Q_D(Workbook);
|
Q_D(Workbook);
|
||||||
if (index < 0 || index >= d->worksheets.size())
|
if (index < 0 || index >= d->worksheets.size())
|
||||||
return false;
|
return false;
|
||||||
//! Todo
|
|
||||||
|
QString worksheetName = newName;
|
||||||
|
if (!newName.isEmpty()) {
|
||||||
|
//If user given an already in-used name, we should not continue any more!
|
||||||
|
for (int i=0; i<d->worksheets.size(); ++i) {
|
||||||
|
if (d->worksheets[i]->sheetName() == newName) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int copy_index = 1;
|
||||||
|
bool exists;
|
||||||
|
do {
|
||||||
|
++copy_index;
|
||||||
|
exists = false;
|
||||||
|
worksheetName = QStringLiteral("%1(%2)").arg(d->worksheets[index]->sheetName()).arg(copy_index);
|
||||||
|
for (int i=0; i<d->worksheets.size(); ++i) {
|
||||||
|
if (d->worksheets[i]->sheetName() == worksheetName)
|
||||||
|
exists = true;
|
||||||
|
}
|
||||||
|
} while (exists);
|
||||||
|
}
|
||||||
|
|
||||||
|
++d->last_sheet_id;
|
||||||
|
QSharedPointer<Worksheet> sheet = d->worksheets[index]->copy(worksheetName, d->last_sheet_id);
|
||||||
|
d->worksheets.append(sheet);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ public:
|
|||||||
Worksheet *insertWorkSheet(int index, const QString &name = QString());
|
Worksheet *insertWorkSheet(int index, const QString &name = QString());
|
||||||
bool renameWorksheet(int index, const QString &name);
|
bool renameWorksheet(int index, const QString &name);
|
||||||
bool deleteWorksheet(int index);
|
bool deleteWorksheet(int index);
|
||||||
bool copyWorksheet(int index, const QString &newName);
|
bool copyWorksheet(int index, const QString &newName=QString());
|
||||||
bool moveWorksheet(int srcIndex, int distIndex);
|
bool moveWorksheet(int srcIndex, int distIndex);
|
||||||
|
|
||||||
Worksheet *activeWorksheet() const;
|
Worksheet *activeWorksheet() const;
|
||||||
|
|||||||
@@ -182,6 +182,44 @@ Worksheet::Worksheet(const QString &name, int id, Workbook *workbook) :
|
|||||||
d_ptr->workbook = workbook;
|
d_ptr->workbook = workbook;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSharedPointer<Worksheet> Worksheet::copy(const QString &distName, int distId) const
|
||||||
|
{
|
||||||
|
Q_D(const Worksheet);
|
||||||
|
QSharedPointer<Worksheet> sheet(new Worksheet(distName, distId, d->workbook));
|
||||||
|
|
||||||
|
WorksheetPrivate *sheet_d = sheet->d_ptr;
|
||||||
|
|
||||||
|
sheet_d->dimension = d->dimension;
|
||||||
|
|
||||||
|
QMapIterator<int, QMap<int, QSharedPointer<Cell> > > it(d->cellTable);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
it.next();
|
||||||
|
int row = it.key();
|
||||||
|
QMapIterator<int, QSharedPointer<Cell> > it2(it.value());
|
||||||
|
while (it2.hasNext()) {
|
||||||
|
it2.next();
|
||||||
|
int col = it2.key();
|
||||||
|
|
||||||
|
QSharedPointer<Cell> cell(new Cell(it2.value().data()));
|
||||||
|
cell->d_ptr->parent = sheet.data();
|
||||||
|
|
||||||
|
if (cell->dataType() == Cell::String)
|
||||||
|
d->workbook->sharedStrings()->addSharedString(cell->d_ptr->richString);
|
||||||
|
|
||||||
|
sheet_d->cellTable[row][col] = cell;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sheet_d->merges = d->merges;
|
||||||
|
// sheet_d->rowsInfo = d->rowsInfo;
|
||||||
|
// sheet_d->colsInfo = d->colsInfo;
|
||||||
|
// sheet_d->colsInfoHelper = d->colsInfoHelper;
|
||||||
|
// sheet_d->dataValidationsList = d->dataValidationsList;
|
||||||
|
// sheet_d->conditionalFormattingList = d->conditionalFormattingList;
|
||||||
|
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
|
||||||
Worksheet::~Worksheet()
|
Worksheet::~Worksheet()
|
||||||
{
|
{
|
||||||
delete d_ptr;
|
delete d_ptr;
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ private:
|
|||||||
friend class Workbook;
|
friend class Workbook;
|
||||||
friend class ::WorksheetTest;
|
friend class ::WorksheetTest;
|
||||||
Worksheet(const QString &sheetName, int sheetId, Workbook *book);
|
Worksheet(const QString &sheetName, int sheetId, Workbook *book);
|
||||||
|
QSharedPointer<Worksheet> copy(const QString &distName, int distId) const;
|
||||||
|
|
||||||
void saveToXmlFile(QIODevice *device);
|
void saveToXmlFile(QIODevice *device);
|
||||||
QByteArray saveToXmlData();
|
QByteArray saveToXmlData();
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ private Q_SLOTS:
|
|||||||
void testReadWriteDateTime();
|
void testReadWriteDateTime();
|
||||||
void testReadWriteDate();
|
void testReadWriteDate();
|
||||||
void testReadWriteTime();
|
void testReadWriteTime();
|
||||||
|
|
||||||
|
void testMoveWorksheet();
|
||||||
|
void testDeleteWorksheet();
|
||||||
|
void testCopyWorksheet();
|
||||||
};
|
};
|
||||||
|
|
||||||
DocumentTest::DocumentTest()
|
DocumentTest::DocumentTest()
|
||||||
@@ -294,6 +298,55 @@ void DocumentTest::testReadWriteTime()
|
|||||||
QCOMPARE(xlsx2.read("A2").toTime(), QTime(1, 22));
|
QCOMPARE(xlsx2.read("A2").toTime(), QTime(1, 22));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DocumentTest::testMoveWorksheet()
|
||||||
|
{
|
||||||
|
Document xlsx1;
|
||||||
|
xlsx1.addWorksheet();
|
||||||
|
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet1"<<"Sheet2");
|
||||||
|
xlsx1.moveWorksheet("Sheet2", 0);
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet2"<<"Sheet1");
|
||||||
|
xlsx1.moveWorksheet("Sheet2", 1);
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet1"<<"Sheet2");
|
||||||
|
}
|
||||||
|
|
||||||
|
void DocumentTest::testCopyWorksheet()
|
||||||
|
{
|
||||||
|
Document xlsx1;
|
||||||
|
xlsx1.addWorksheet();
|
||||||
|
xlsx1.write("A1", "String");
|
||||||
|
xlsx1.write("A2", 999);
|
||||||
|
xlsx1.write("A3", true);
|
||||||
|
xlsx1.addWorksheet();
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet1"<<"Sheet2"<<"Sheet3");
|
||||||
|
|
||||||
|
xlsx1.copyWorksheet("Sheet2");
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet1"<<"Sheet2"<<"Sheet3"<<"Sheet2(2)");
|
||||||
|
|
||||||
|
xlsx1.deleteWorksheet("Sheet2");
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet1"<<"Sheet3"<<"Sheet2(2)");
|
||||||
|
|
||||||
|
xlsx1.selectWorksheet("Sheet2(2)");
|
||||||
|
QCOMPARE(xlsx1.read("A1").toString(), QString("String"));
|
||||||
|
QCOMPARE(xlsx1.read("A2").toInt(), 999);
|
||||||
|
QCOMPARE(xlsx1.read("A3").toBool(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DocumentTest::testDeleteWorksheet()
|
||||||
|
{
|
||||||
|
Document xlsx1;
|
||||||
|
xlsx1.addWorksheet();
|
||||||
|
xlsx1.addWorksheet();
|
||||||
|
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet1"<<"Sheet2"<<"Sheet3");
|
||||||
|
xlsx1.deleteWorksheet("Sheet2");
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet1"<<"Sheet3");
|
||||||
|
xlsx1.deleteWorksheet("Sheet1");
|
||||||
|
QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet3");
|
||||||
|
// xlsx1.deleteWorksheet("Sheet3");
|
||||||
|
// QCOMPARE(xlsx1.worksheetNames(), QStringList()<<"Sheet4");
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_APPLESS_MAIN(DocumentTest)
|
QTEST_APPLESS_MAIN(DocumentTest)
|
||||||
|
|
||||||
#include "tst_documenttest.moc"
|
#include "tst_documenttest.moc"
|
||||||
|
|||||||
Reference in New Issue
Block a user