diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index b86e447..fafc931 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -55,6 +55,9 @@ WorkbookPrivate::WorkbookPrivate(Workbook *q) : activesheet = 0; firstsheet = 0; table_count = 0; + + last_sheet_index = 0; + last_sheet_id = 0; } Workbook::Workbook() : @@ -135,10 +138,9 @@ Worksheet *Workbook::addWorksheet(const QString &name) Worksheet *Workbook::insertWorkSheet(int index, const QString &name) { Q_D(Workbook); - static int lastIndex = -1; QString worksheetName = name; if (!name.isEmpty()) { - //If user given an already in-use name, we should not continue any more! + //If user given an already in-used name, we should not continue any more! for (int i=0; iworksheets.size(); ++i) { if (d->worksheets[i]->sheetName() == name) { return 0; @@ -147,9 +149,9 @@ Worksheet *Workbook::insertWorkSheet(int index, const QString &name) } else { bool exists; do { - ++lastIndex; + ++d->last_sheet_index; exists = false; - worksheetName = QStringLiteral("Sheet%1").arg(lastIndex+1); + worksheetName = QStringLiteral("Sheet%1").arg(d->last_sheet_index); for (int i=0; iworksheets.size(); ++i) { if (d->worksheets[i]->sheetName() == worksheetName) exists = true; @@ -157,7 +159,8 @@ Worksheet *Workbook::insertWorkSheet(int index, const QString &name) } while (exists); } - Worksheet *sheet = new Worksheet(worksheetName, this); + ++d->last_sheet_id; + Worksheet *sheet = new Worksheet(worksheetName, d->last_sheet_id, this); d->worksheets.insert(index, QSharedPointer(sheet)); d->activesheet = index; return sheet; @@ -284,7 +287,7 @@ void Workbook::saveToXmlFile(QIODevice *device) QSharedPointer sheet = d->worksheets[i]; writer.writeEmptyElement(QStringLiteral("sheet")); writer.writeAttribute(QStringLiteral("name"), sheet->sheetName()); - writer.writeAttribute(QStringLiteral("sheetId"), QString::number(i+1)); + writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId())); if (sheet->isHidden()) writer.writeAttribute(QStringLiteral("state"), QStringLiteral("hidden")); writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(i+1)); diff --git a/src/xlsx/xlsxworkbook_p.h b/src/xlsx/xlsxworkbook_p.h index 719bd48..7eb01b6 100644 --- a/src/xlsx/xlsxworkbook_p.h +++ b/src/xlsx/xlsxworkbook_p.h @@ -58,6 +58,10 @@ public: int activesheet; int firstsheet; int table_count; + + //Used to generate new sheet name and id + int last_sheet_index; + int last_sheet_id; }; } diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index 734705a..5733287 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -195,13 +195,15 @@ int WorksheetPrivate::checkDimensions(int row, int col, bool ignore_row, bool ig /*! * \brief Worksheet::Worksheet * \param name Name of the worksheet - * \param index Index of the worksheet in the workbook - * \param parent + * \param id : An integer representing the internal id of the + * sheet which is used by .xlsx revision part. + * (Note: id is not the index of the sheet in workbook) */ -Worksheet::Worksheet(const QString &name, Workbook *workbook) : +Worksheet::Worksheet(const QString &name, int id, Workbook *workbook) : d_ptr(new WorksheetPrivate(this)) { d_ptr->name = name; + d_ptr->id = id; if (!workbook) //For unit test propose only. Ignore the memery leak. workbook = new Workbook; d_ptr->workbook = workbook; @@ -253,6 +255,12 @@ void Worksheet::setSelected(bool select) d->selected = select; } +int Worksheet::sheetId() const +{ + Q_D(const Worksheet); + return d->id; +} + void Worksheet::setRightToLeft(bool enable) { Q_D(Worksheet); diff --git a/src/xlsx/xlsxworksheet.h b/src/xlsx/xlsxworksheet.h index 353e0b3..320e6bd 100755 --- a/src/xlsx/xlsxworksheet.h +++ b/src/xlsx/xlsxworksheet.h @@ -85,7 +85,7 @@ private: friend class Package; friend class Workbook; friend class ::WorksheetTest; - Worksheet(const QString &sheetName, Workbook *book); + Worksheet(const QString &sheetName, int sheetId, Workbook *book); void saveToXmlFile(QIODevice *device); QByteArray saveToXmlData(); @@ -97,6 +97,7 @@ private: bool isSelected() const; void setHidden(bool hidden); void setSelected(bool select); + int sheetId() const; QStringList externUrlList() const; QStringList externDrawingList() const; QList > drawingLinks() const; diff --git a/src/xlsx/xlsxworksheet_p.h b/src/xlsx/xlsxworksheet_p.h index 1c0163e..1b1f395 100644 --- a/src/xlsx/xlsxworksheet_p.h +++ b/src/xlsx/xlsxworksheet_p.h @@ -223,6 +223,7 @@ public: bool default_row_zeroed; QString name; + int id; bool hidden; bool selected; bool right_to_left; diff --git a/tests/auto/worksheet/tst_worksheet.cpp b/tests/auto/worksheet/tst_worksheet.cpp index f70da1f..93afb49 100644 --- a/tests/auto/worksheet/tst_worksheet.cpp +++ b/tests/auto/worksheet/tst_worksheet.cpp @@ -34,7 +34,7 @@ WorksheetTest::WorksheetTest() void WorksheetTest::testEmptySheet() { - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.write("B1", 123); QByteArray xmldata = sheet.saveToXmlData(); @@ -43,7 +43,7 @@ void WorksheetTest::testEmptySheet() void WorksheetTest::testWriteCells() { - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.write("A1", 123); sheet.write("A2", "Hello"); sheet.writeInlineString(2, 0, "Hello inline"); //A3 @@ -65,7 +65,7 @@ void WorksheetTest::testWriteCells() void WorksheetTest::testWriteHyperlinks() { - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.write("A1", QUrl::fromUserInput("http://qt-project.org")); sheet.write("B1", QUrl::fromUserInput("http://qt-project.org/abc")); sheet.write("C1", QUrl::fromUserInput("http://qt-project.org/abc.html#test")); @@ -89,7 +89,7 @@ void WorksheetTest::testWriteHyperlinks() void WorksheetTest::testMerge() { - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.write("B1", 123); sheet.mergeCells("B1:B5"); QByteArray xmldata = sheet.saveToXmlData(); @@ -99,7 +99,7 @@ void WorksheetTest::testMerge() void WorksheetTest::testUnMerge() { - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.write("B1", 123); sheet.mergeCells("B1:B5"); sheet.unmergeCells("B1:B5"); @@ -125,7 +125,7 @@ void WorksheetTest::testReadSheetData() QXlsx::XmlStreamReader reader(xmlData); reader.readNextStartElement();//current node is sheetData - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.d_ptr->sharedStrings()->addSharedString("Hello"); sheet.d_ptr->readSheetData(reader); @@ -162,7 +162,7 @@ void WorksheetTest::testReadColsInfo() QXlsx::XmlStreamReader reader(xmlData); reader.readNextStartElement();//current node is cols - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.d_ptr->readColumnsInfo(reader); QCOMPARE(sheet.d_ptr->colsInfo.size(), 1); @@ -182,7 +182,7 @@ void WorksheetTest::testReadRowsInfo() QXlsx::XmlStreamReader reader(xmlData); reader.readNextStartElement();//current node is sheetData - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.d_ptr->readSheetData(reader); QCOMPARE(sheet.d_ptr->rowsInfo.size(), 1); @@ -196,7 +196,7 @@ void WorksheetTest::testReadMergeCells() QXlsx::XmlStreamReader reader(xmlData); reader.readNextStartElement();//current node is mergeCells - QXlsx::Worksheet sheet("", 0); + QXlsx::Worksheet sheet("", 1, 0); sheet.d_ptr->readMergeCells(reader); QCOMPARE(sheet.d_ptr->merges.size(), 2);