diff --git a/examples/xlsx/demo/main.cpp b/examples/xlsx/demo/main.cpp index d565e1b..1bb732b 100644 --- a/examples/xlsx/demo/main.cpp +++ b/examples/xlsx/demo/main.cpp @@ -94,7 +94,7 @@ int main() //--------------------------------------------------------------- //The default sheet is "Sheet1" - xlsx.setSheetName("Aligns & Borders"); + xlsx.renameWorksheet("Sheet1", "Aligns & Borders"); xlsx.setColumn("B", "B", 20); xlsx.setColumn("H", "H", 12); xlsx.currentWorksheet()->setGridLinesVisible(false); diff --git a/src/xlsx/xlsxdocument.cpp b/src/xlsx/xlsxdocument.cpp index dff9953..e907474 100644 --- a/src/xlsx/xlsxdocument.cpp +++ b/src/xlsx/xlsxdocument.cpp @@ -42,7 +42,7 @@ DocumentPrivate::DocumentPrivate(Document *p) : void DocumentPrivate::init() { - if (workbook->worksheets().size() == 0) + if (workbook->worksheetCount() == 0) workbook->addWorksheet(); } @@ -375,19 +375,56 @@ bool Document::insertWorkSheet(int index, const QString &name) return d->workbook->insertWorkSheet(index, name); } +/*! + Rename the worksheet from \a oldName to \a newName. + Returns true if the success. + */ +bool Document::renameWorksheet(const QString &oldName, const QString &newName) +{ + Q_D(Document); + if (oldName == newName) + return false; + return d->workbook->renameWorksheet(worksheetNames().indexOf(oldName), newName); +} + +/*! + Make a copy of the worksheet \a srcName with the new name \a distName. + Returns true if the success. + */ +bool Document::copyWorksheet(const QString &srcName, const QString &distName) +{ + Q_D(Document); + if (srcName == distName) + return false; + return d->workbook->copyWorksheet(worksheetNames().indexOf(srcName), distName); +} + +/*! + Move the worksheet \a srcName to the new pos \a distIndex. + Returns true if the success. + */ +bool Document::moveWorksheet(const QString &srcName, int distIndex) +{ + Q_D(Document); + return d->workbook->moveWorksheet(worksheetNames().indexOf(srcName), distIndex); +} + +/*! + Delete the worksheet \a name. + */ +bool Document::deleteWorksheet(const QString &name) +{ + Q_D(Document); + return d->workbook->deleteWorksheet(worksheetNames().indexOf(name)); +} + /*! Rename current worksheet to new \a name. Returns true if the name defined successful. */ bool Document::setSheetName(const QString &name) { - Q_D(Document); - for (int i=0; iworkbook->worksheets().size(); ++i) { - if (d->workbook->worksheets()[i]->sheetName() == name) - return false; - } - currentWorksheet()->setSheetName(name); - return true; + return renameWorksheet(currentWorksheet()->sheetName(), name); } /*! @@ -396,10 +433,10 @@ bool Document::setSheetName(const QString &name) Worksheet *Document::currentWorksheet() const { Q_D(const Document); - if (d->workbook->worksheets().size() == 0) + if (d->workbook->worksheetCount() == 0) return 0; - return d->workbook->worksheets().at(d->workbook->activeWorksheet()).data(); + return d->workbook->activeWorksheet(); } /*! @@ -412,15 +449,37 @@ void Document::setCurrentWorksheet(int index) } /*! - * \brief Set current worksheet to be the sheet named \a name. + * \brief Set current selected worksheet to be the sheet named \a name. */ void Document::setCurrentWorksheet(const QString &name) +{ + selectWorksheet(name); +} + +/*! + * \brief Set current selected worksheet to be the sheet named \a name. + */ +bool Document::selectWorksheet(const QString &name) { Q_D(Document); - for (int i=0; iworkbook->worksheets().size(); ++i) { - if (d->workbook->worksheets()[i]->sheetName() == name) - d->workbook->setActiveWorksheet(i); + for (int i=0; iworkbook->worksheetCount(); ++i) { + if (d->workbook->worksheet(i)->sheetName() == name) + return d->workbook->setActiveWorksheet(i); } + return false; +} + +/*! + * Returns the names of worksheets contained in current document. + */ +QStringList Document::worksheetNames() const +{ + Q_D(const Document); + QStringList names; + for (int i=0; iworkbook->worksheetCount(); ++i) + names.append(d->workbook->worksheet(i)->sheetName()); + + return names; } /*! diff --git a/src/xlsx/xlsxdocument.h b/src/xlsx/xlsxdocument.h index 892f6a7..0ff8165 100644 --- a/src/xlsx/xlsxdocument.h +++ b/src/xlsx/xlsxdocument.h @@ -83,14 +83,20 @@ public: void setDocumentProperty(const QString &name, const QString &property); QStringList documentPropertyNames() const; + QStringList worksheetNames() const; bool addWorksheet(const QString &name = QString()); bool insertWorkSheet(int index, const QString &name = QString()); - bool setSheetName(const QString &name); + bool selectWorksheet(const QString &name); + bool renameWorksheet(const QString &oldName, const QString &newName); + bool copyWorksheet(const QString &srcName, const QString &distName); + bool moveWorksheet(const QString &srcName, int distIndex); + bool deleteWorksheet(const QString &name); Workbook *workbook() const; Worksheet *currentWorksheet() const; - void setCurrentWorksheet(int index); - void setCurrentWorksheet(const QString &name); + Q_DECL_DEPRECATED bool setSheetName(const QString &name); + Q_DECL_DEPRECATED void setCurrentWorksheet(int index); + Q_DECL_DEPRECATED void setCurrentWorksheet(const QString &name); bool save(); bool saveAs(const QString &xlsXname); diff --git a/src/xlsx/xlsxpackage.cpp b/src/xlsx/xlsxpackage.cpp index c750625..a3b2608 100644 --- a/src/xlsx/xlsxpackage.cpp +++ b/src/xlsx/xlsxpackage.cpp @@ -80,7 +80,6 @@ namespace QXlsx { The Packager class coordinates the classes that represent the elements of the package and writes them into the XLSX file. */ -typedef QSharedPointer WorksheetPtrType; Package::Package(Document *document) : m_document(document) @@ -88,7 +87,8 @@ Package::Package(Document *document) : m_workbook = m_document->workbook(); m_worksheet_count = 0; m_chartsheet_count = 0; - foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (sheet->isChartsheet()) m_chartsheet_count += 1; else @@ -226,13 +226,12 @@ bool Package::createPackage(QIODevice *package) void Package::writeWorksheetFiles(ZipWriter &zipWriter) { - int index = 1; - foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (sheet->isChartsheet()) continue; - zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(index), sheet->saveToXmlData()); - index += 1; + zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData()); } } @@ -258,13 +257,12 @@ void Package::writeContentTypesFile(ZipWriter &zipWriter) { ContentTypes content; - int worksheet_index = 1; - foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (sheet->isChartsheet()) { } else { - content.addWorksheetName(QStringLiteral("sheet%1").arg(worksheet_index)); - worksheet_index += 1; + content.addWorksheetName(QStringLiteral("sheet%1").arg(i+1)); } } @@ -301,13 +299,15 @@ void Package::writeDocPropsAppFile(ZipWriter &zipWriter) props.addHeadingPair(QStringLiteral("Chartsheets"), m_chartsheet_count); //Add worksheet parts - foreach (WorksheetPtrType sheet, m_workbook->worksheets()){ + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (!sheet->isChartsheet()) props.addPartTitle(sheet->sheetName()); } //Add the chartsheet parts - foreach (WorksheetPtrType sheet, m_workbook->worksheets()){ + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (sheet->isChartsheet()) props.addPartTitle(sheet->sheetName()); } @@ -360,7 +360,8 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter) int worksheet_index = 1; int chartsheet_index = 1; - foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (sheet->isChartsheet()) { rels.addDocumentRelationship(QStringLiteral("/chartsheet"), QStringLiteral("chartsheets/sheet%1.xml").arg(chartsheet_index)); chartsheet_index += 1; @@ -381,8 +382,8 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter) void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter) { - int index = 1; - foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (sheet->isChartsheet()) continue; Relationships rels; @@ -392,15 +393,14 @@ void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter) foreach (QString link, sheet->externDrawingList()) rels.addWorksheetRelationship(QStringLiteral("/drawing"), link); - zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(index), rels.saveToXmlData()); - index += 1; + zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rels.saveToXmlData()); } } void Package::writeDrawingRelsFiles(ZipWriter &zipWriter) { - int index = 1; - foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { + for (int i=0; iworksheetCount(); ++i) { + Worksheet *sheet = m_workbook->worksheet(i); if (sheet->drawingLinks().size() == 0) continue; Relationships rels; @@ -409,8 +409,7 @@ void Package::writeDrawingRelsFiles(ZipWriter &zipWriter) foreach (PairType pair, sheet->drawingLinks()) rels.addDocumentRelationship(pair.first, pair.second); - zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(index), rels.saveToXmlData()); - index += 1; + zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(i+1), rels.saveToXmlData()); } } diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index dd86ce8..6456273 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -54,7 +54,7 @@ WorkbookPrivate::WorkbookPrivate(Workbook *q) : strings_to_numbers_enabled = false; date1904 = false; defaultDateFormat = QStringLiteral("yyyy-mm-dd"); - activesheet = 0; + activesheetIndex = 0; firstsheet = 0; table_count = 0; @@ -205,24 +205,85 @@ Worksheet *Workbook::insertWorkSheet(int index, const QString &name) ++d->last_sheet_id; Worksheet *sheet = new Worksheet(worksheetName, d->last_sheet_id, this); d->worksheets.insert(index, QSharedPointer(sheet)); - d->activesheet = index; + d->activesheetIndex = index; return sheet; } -int Workbook::activeWorksheet() const +/*! + * Returns current active worksheet. + */ +Worksheet *Workbook::activeWorksheet() const { Q_D(const Workbook); - return d->activesheet; + return d->worksheets[d->activesheetIndex].data(); } -void Workbook::setActiveWorksheet(int index) +bool Workbook::setActiveWorksheet(int index) { Q_D(Workbook); if (index < 0 || index >= d->worksheets.size()) { //warning - return; + return false; } - d->activesheet = index; + d->activesheetIndex = index; + return true; +} + +/*! + * Rename the worksheet at the \a index to \a name. + */ +bool Workbook::renameWorksheet(int index, const QString &name) +{ + Q_D(Workbook); + //If user given an already in-used name, return false + for (int i=0; iworksheets.size(); ++i) { + if (d->worksheets[i]->sheetName() == name) + return false; + } + + d->worksheets[index]->setSheetName(name); + return true; +} + +/*! + * Remove the worksheet at pos \a index. + */ +bool Workbook::deleteWorksheet(int index) +{ + Q_D(Workbook); + if (index < 0 || index >= d->worksheets.size()) + return false; + d->worksheets.removeAt(index); + return true; +} + +/*! + * Moves the worksheet form \a srcIndex to \a distIndex. + */ +bool Workbook::moveWorksheet(int srcIndex, int distIndex) +{ + Q_D(Workbook); + if (srcIndex == distIndex) + return false; + + if (srcIndex < 0 || srcIndex >= d->worksheets.size()) + return false; + + QSharedPointer sheet = d->worksheets.takeAt(srcIndex); + if (distIndex >= 0 || distIndex <= d->worksheets.size()) + d->worksheets.insert(distIndex, sheet); + else + d->worksheets.append(sheet); + return true; +} + +bool Workbook::copyWorksheet(int index, const QString &newName) +{ + Q_D(Workbook); + if (index < 0 || index >= d->worksheets.size()) + return false; + //! Todo + return false; } QList > Workbook::worksheets() const @@ -231,6 +292,26 @@ QList > Workbook::worksheets() const return d->worksheets; } +/*! + * Returns count of worksheets. + */ +int Workbook::worksheetCount() const +{ + Q_D(const Workbook); + return d->worksheets.count(); +} + +/*! + * Returns the sheet object at index \a sheetIndex. + */ +Worksheet *Workbook::worksheet(int index) const +{ + Q_D(const Workbook); + if (index < 0 || index >= d->worksheets.size()) + return 0; + return d->worksheets.at(index).data(); +} + SharedStrings *Workbook::sharedStrings() const { Q_D(const Workbook); @@ -321,8 +402,8 @@ void Workbook::saveToXmlFile(QIODevice *device) if (d->firstsheet > 0) writer.writeAttribute(QStringLiteral("firstSheet"), QString::number(d->firstsheet + 1)); //Store the activeTab when it isn't the first sheet - if (d->activesheet > 0) - writer.writeAttribute(QStringLiteral("activeTab"), QString::number(d->activesheet)); + if (d->activesheetIndex > 0) + writer.writeAttribute(QStringLiteral("activeTab"), QString::number(d->activesheetIndex)); writer.writeEndElement();//bookViews writer.writeStartElement(QStringLiteral("sheets")); @@ -415,7 +496,7 @@ bool Workbook::loadFromXmlFile(QIODevice *device) if (attrs.hasAttribute(QLatin1String("firstSheet"))) d->firstsheet = attrs.value(QLatin1String("firstSheet")).toString().toInt(); if (attrs.hasAttribute(QLatin1String("activeTab"))) - d->activesheet = attrs.value(QLatin1String("activeTab")).toString().toInt(); + d->activesheetIndex = attrs.value(QLatin1String("activeTab")).toString().toInt(); } } } diff --git a/src/xlsx/xlsxworkbook.h b/src/xlsx/xlsxworkbook.h index 64932b7..24e5970 100755 --- a/src/xlsx/xlsxworkbook.h +++ b/src/xlsx/xlsxworkbook.h @@ -50,11 +50,19 @@ class Q_XLSX_EXPORT Workbook public: ~Workbook(); - QList > worksheets() const; + Q_DECL_DEPRECATED QList > worksheets() const; + int worksheetCount() const; + Worksheet *worksheet(int sheetIndex) const; + Worksheet *addWorksheet(const QString &name = QString()); Worksheet *insertWorkSheet(int index, const QString &name = QString()); - int activeWorksheet() const; - void setActiveWorksheet(int index); + bool renameWorksheet(int index, const QString &name); + bool deleteWorksheet(int index); + bool copyWorksheet(int index, const QString &newName); + bool moveWorksheet(int srcIndex, int distIndex); + + Worksheet *activeWorksheet() const; + bool setActiveWorksheet(int index); // void addChart(); bool defineName(const QString &name, const QString &formula, const QString &comment=QString(), const QString &scope=QString()); diff --git a/src/xlsx/xlsxworkbook_p.h b/src/xlsx/xlsxworkbook_p.h index 522508e..b7f0140 100644 --- a/src/xlsx/xlsxworkbook_p.h +++ b/src/xlsx/xlsxworkbook_p.h @@ -97,7 +97,7 @@ public: int window_width; int window_height; - int activesheet; + int activesheetIndex; int firstsheet; int table_count; diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index a02e2a3..de3a30c 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -198,6 +198,9 @@ QString Worksheet::sheetName() const return d->name; } +/*! + * \internal + */ void Worksheet::setSheetName(const QString &sheetName) { Q_D(Worksheet);