Improve worksheets support

This commit is contained in:
Debao Zhang
2014-01-01 15:18:07 +08:00
parent f83fb45740
commit 82c77b4bed
8 changed files with 209 additions and 53 deletions
+1 -1
View File
@@ -94,7 +94,7 @@ int main()
//--------------------------------------------------------------- //---------------------------------------------------------------
//The default sheet is "Sheet1" //The default sheet is "Sheet1"
xlsx.setSheetName("Aligns & Borders"); xlsx.renameWorksheet("Sheet1", "Aligns & Borders");
xlsx.setColumn("B", "B", 20); xlsx.setColumn("B", "B", 20);
xlsx.setColumn("H", "H", 12); xlsx.setColumn("H", "H", 12);
xlsx.currentWorksheet()->setGridLinesVisible(false); xlsx.currentWorksheet()->setGridLinesVisible(false);
+74 -15
View File
@@ -42,7 +42,7 @@ DocumentPrivate::DocumentPrivate(Document *p) :
void DocumentPrivate::init() void DocumentPrivate::init()
{ {
if (workbook->worksheets().size() == 0) if (workbook->worksheetCount() == 0)
workbook->addWorksheet(); workbook->addWorksheet();
} }
@@ -375,19 +375,56 @@ bool Document::insertWorkSheet(int index, const QString &name)
return d->workbook->insertWorkSheet(index, 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. Rename current worksheet to new \a name.
Returns true if the name defined successful. Returns true if the name defined successful.
*/ */
bool Document::setSheetName(const QString &name) bool Document::setSheetName(const QString &name)
{ {
Q_D(Document); return renameWorksheet(currentWorksheet()->sheetName(), name);
for (int i=0; i<d->workbook->worksheets().size(); ++i) {
if (d->workbook->worksheets()[i]->sheetName() == name)
return false;
}
currentWorksheet()->setSheetName(name);
return true;
} }
/*! /*!
@@ -396,10 +433,10 @@ bool Document::setSheetName(const QString &name)
Worksheet *Document::currentWorksheet() const Worksheet *Document::currentWorksheet() const
{ {
Q_D(const Document); Q_D(const Document);
if (d->workbook->worksheets().size() == 0) if (d->workbook->worksheetCount() == 0)
return 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) void Document::setCurrentWorksheet(const QString &name)
{ {
Q_D(Document); selectWorksheet(name);
for (int i=0; i<d->workbook->worksheets().size(); ++i) {
if (d->workbook->worksheets()[i]->sheetName() == name)
d->workbook->setActiveWorksheet(i);
} }
/*!
* \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; i<d->workbook->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; i<d->workbook->worksheetCount(); ++i)
names.append(d->workbook->worksheet(i)->sheetName());
return names;
} }
/*! /*!
+9 -3
View File
@@ -83,14 +83,20 @@ public:
void setDocumentProperty(const QString &name, const QString &property); void setDocumentProperty(const QString &name, const QString &property);
QStringList documentPropertyNames() const; QStringList documentPropertyNames() const;
QStringList worksheetNames() const;
bool addWorksheet(const QString &name = QString()); bool addWorksheet(const QString &name = QString());
bool insertWorkSheet(int index, 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; Workbook *workbook() const;
Worksheet *currentWorksheet() const; Worksheet *currentWorksheet() const;
void setCurrentWorksheet(int index); Q_DECL_DEPRECATED bool setSheetName(const QString &name);
void setCurrentWorksheet(const QString &name); Q_DECL_DEPRECATED void setCurrentWorksheet(int index);
Q_DECL_DEPRECATED void setCurrentWorksheet(const QString &name);
bool save(); bool save();
bool saveAs(const QString &xlsXname); bool saveAs(const QString &xlsXname);
+20 -21
View File
@@ -80,7 +80,6 @@ namespace QXlsx {
The Packager class coordinates the classes that represent the The Packager class coordinates the classes that represent the
elements of the package and writes them into the XLSX file. elements of the package and writes them into the XLSX file.
*/ */
typedef QSharedPointer<Worksheet> WorksheetPtrType;
Package::Package(Document *document) : Package::Package(Document *document) :
m_document(document) m_document(document)
@@ -88,7 +87,8 @@ Package::Package(Document *document) :
m_workbook = m_document->workbook(); m_workbook = m_document->workbook();
m_worksheet_count = 0; m_worksheet_count = 0;
m_chartsheet_count = 0; m_chartsheet_count = 0;
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { for (int i=0; i<m_workbook->worksheetCount(); ++i) {
Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->isChartsheet()) if (sheet->isChartsheet())
m_chartsheet_count += 1; m_chartsheet_count += 1;
else else
@@ -226,13 +226,12 @@ bool Package::createPackage(QIODevice *package)
void Package::writeWorksheetFiles(ZipWriter &zipWriter) void Package::writeWorksheetFiles(ZipWriter &zipWriter)
{ {
int index = 1; for (int i=0; i<m_workbook->worksheetCount(); ++i) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->isChartsheet()) if (sheet->isChartsheet())
continue; continue;
zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(index), sheet->saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData());
index += 1;
} }
} }
@@ -258,13 +257,12 @@ void Package::writeContentTypesFile(ZipWriter &zipWriter)
{ {
ContentTypes content; ContentTypes content;
int worksheet_index = 1; for (int i=0; i<m_workbook->worksheetCount(); ++i) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->isChartsheet()) { if (sheet->isChartsheet()) {
} else { } else {
content.addWorksheetName(QStringLiteral("sheet%1").arg(worksheet_index)); content.addWorksheetName(QStringLiteral("sheet%1").arg(i+1));
worksheet_index += 1;
} }
} }
@@ -301,13 +299,15 @@ void Package::writeDocPropsAppFile(ZipWriter &zipWriter)
props.addHeadingPair(QStringLiteral("Chartsheets"), m_chartsheet_count); props.addHeadingPair(QStringLiteral("Chartsheets"), m_chartsheet_count);
//Add worksheet parts //Add worksheet parts
foreach (WorksheetPtrType sheet, m_workbook->worksheets()){ for (int i=0; i<m_workbook->worksheetCount(); ++i) {
Worksheet *sheet = m_workbook->worksheet(i);
if (!sheet->isChartsheet()) if (!sheet->isChartsheet())
props.addPartTitle(sheet->sheetName()); props.addPartTitle(sheet->sheetName());
} }
//Add the chartsheet parts //Add the chartsheet parts
foreach (WorksheetPtrType sheet, m_workbook->worksheets()){ for (int i=0; i<m_workbook->worksheetCount(); ++i) {
Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->isChartsheet()) if (sheet->isChartsheet())
props.addPartTitle(sheet->sheetName()); props.addPartTitle(sheet->sheetName());
} }
@@ -360,7 +360,8 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter)
int worksheet_index = 1; int worksheet_index = 1;
int chartsheet_index = 1; int chartsheet_index = 1;
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { for (int i=0; i<m_workbook->worksheetCount(); ++i) {
Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->isChartsheet()) { if (sheet->isChartsheet()) {
rels.addDocumentRelationship(QStringLiteral("/chartsheet"), QStringLiteral("chartsheets/sheet%1.xml").arg(chartsheet_index)); rels.addDocumentRelationship(QStringLiteral("/chartsheet"), QStringLiteral("chartsheets/sheet%1.xml").arg(chartsheet_index));
chartsheet_index += 1; chartsheet_index += 1;
@@ -381,8 +382,8 @@ void Package::writeWorkbookRelsFile(ZipWriter &zipWriter)
void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter) void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter)
{ {
int index = 1; for (int i=0; i<m_workbook->worksheetCount(); ++i) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->isChartsheet()) if (sheet->isChartsheet())
continue; continue;
Relationships rels; Relationships rels;
@@ -392,15 +393,14 @@ void Package::writeWorksheetRelsFiles(ZipWriter &zipWriter)
foreach (QString link, sheet->externDrawingList()) foreach (QString link, sheet->externDrawingList())
rels.addWorksheetRelationship(QStringLiteral("/drawing"), link); rels.addWorksheetRelationship(QStringLiteral("/drawing"), link);
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(index), rels.saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rels.saveToXmlData());
index += 1;
} }
} }
void Package::writeDrawingRelsFiles(ZipWriter &zipWriter) void Package::writeDrawingRelsFiles(ZipWriter &zipWriter)
{ {
int index = 1; for (int i=0; i<m_workbook->worksheetCount(); ++i) {
foreach (WorksheetPtrType sheet, m_workbook->worksheets()) { Worksheet *sheet = m_workbook->worksheet(i);
if (sheet->drawingLinks().size() == 0) if (sheet->drawingLinks().size() == 0)
continue; continue;
Relationships rels; Relationships rels;
@@ -409,8 +409,7 @@ void Package::writeDrawingRelsFiles(ZipWriter &zipWriter)
foreach (PairType pair, sheet->drawingLinks()) foreach (PairType pair, sheet->drawingLinks())
rels.addDocumentRelationship(pair.first, pair.second); rels.addDocumentRelationship(pair.first, pair.second);
zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(index), rels.saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(i+1), rels.saveToXmlData());
index += 1;
} }
} }
+91 -10
View File
@@ -54,7 +54,7 @@ WorkbookPrivate::WorkbookPrivate(Workbook *q) :
strings_to_numbers_enabled = false; strings_to_numbers_enabled = false;
date1904 = false; date1904 = false;
defaultDateFormat = QStringLiteral("yyyy-mm-dd"); defaultDateFormat = QStringLiteral("yyyy-mm-dd");
activesheet = 0; activesheetIndex = 0;
firstsheet = 0; firstsheet = 0;
table_count = 0; table_count = 0;
@@ -205,24 +205,85 @@ Worksheet *Workbook::insertWorkSheet(int index, const QString &name)
++d->last_sheet_id; ++d->last_sheet_id;
Worksheet *sheet = new Worksheet(worksheetName, d->last_sheet_id, this); Worksheet *sheet = new Worksheet(worksheetName, d->last_sheet_id, this);
d->worksheets.insert(index, QSharedPointer<Worksheet>(sheet)); d->worksheets.insert(index, QSharedPointer<Worksheet>(sheet));
d->activesheet = index; d->activesheetIndex = index;
return sheet; return sheet;
} }
int Workbook::activeWorksheet() const /*!
* Returns current active worksheet.
*/
Worksheet *Workbook::activeWorksheet() const
{ {
Q_D(const Workbook); 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); Q_D(Workbook);
if (index < 0 || index >= d->worksheets.size()) { if (index < 0 || index >= d->worksheets.size()) {
//warning //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; i<d->worksheets.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<Worksheet> 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<QSharedPointer<Worksheet> > Workbook::worksheets() const QList<QSharedPointer<Worksheet> > Workbook::worksheets() const
@@ -231,6 +292,26 @@ QList<QSharedPointer<Worksheet> > Workbook::worksheets() const
return d->worksheets; 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 SharedStrings *Workbook::sharedStrings() const
{ {
Q_D(const Workbook); Q_D(const Workbook);
@@ -321,8 +402,8 @@ void Workbook::saveToXmlFile(QIODevice *device)
if (d->firstsheet > 0) if (d->firstsheet > 0)
writer.writeAttribute(QStringLiteral("firstSheet"), QString::number(d->firstsheet + 1)); writer.writeAttribute(QStringLiteral("firstSheet"), QString::number(d->firstsheet + 1));
//Store the activeTab when it isn't the first sheet //Store the activeTab when it isn't the first sheet
if (d->activesheet > 0) if (d->activesheetIndex > 0)
writer.writeAttribute(QStringLiteral("activeTab"), QString::number(d->activesheet)); writer.writeAttribute(QStringLiteral("activeTab"), QString::number(d->activesheetIndex));
writer.writeEndElement();//bookViews writer.writeEndElement();//bookViews
writer.writeStartElement(QStringLiteral("sheets")); writer.writeStartElement(QStringLiteral("sheets"));
@@ -415,7 +496,7 @@ bool Workbook::loadFromXmlFile(QIODevice *device)
if (attrs.hasAttribute(QLatin1String("firstSheet"))) if (attrs.hasAttribute(QLatin1String("firstSheet")))
d->firstsheet = attrs.value(QLatin1String("firstSheet")).toString().toInt(); d->firstsheet = attrs.value(QLatin1String("firstSheet")).toString().toInt();
if (attrs.hasAttribute(QLatin1String("activeTab"))) if (attrs.hasAttribute(QLatin1String("activeTab")))
d->activesheet = attrs.value(QLatin1String("activeTab")).toString().toInt(); d->activesheetIndex = attrs.value(QLatin1String("activeTab")).toString().toInt();
} }
} }
} }
+11 -3
View File
@@ -50,11 +50,19 @@ class Q_XLSX_EXPORT Workbook
public: public:
~Workbook(); ~Workbook();
QList<QSharedPointer<Worksheet> > worksheets() const; Q_DECL_DEPRECATED QList<QSharedPointer<Worksheet> > worksheets() const;
int worksheetCount() const;
Worksheet *worksheet(int sheetIndex) const;
Worksheet *addWorksheet(const QString &name = QString()); Worksheet *addWorksheet(const QString &name = QString());
Worksheet *insertWorkSheet(int index, const QString &name = QString()); Worksheet *insertWorkSheet(int index, const QString &name = QString());
int activeWorksheet() const; bool renameWorksheet(int index, const QString &name);
void setActiveWorksheet(int index); 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(); // void addChart();
bool defineName(const QString &name, const QString &formula, const QString &comment=QString(), const QString &scope=QString()); bool defineName(const QString &name, const QString &formula, const QString &comment=QString(), const QString &scope=QString());
+1 -1
View File
@@ -97,7 +97,7 @@ public:
int window_width; int window_width;
int window_height; int window_height;
int activesheet; int activesheetIndex;
int firstsheet; int firstsheet;
int table_count; int table_count;
+3
View File
@@ -198,6 +198,9 @@ QString Worksheet::sheetName() const
return d->name; return d->name;
} }
/*!
* \internal
*/
void Worksheet::setSheetName(const QString &sheetName) void Worksheet::setSheetName(const QString &sheetName)
{ {
Q_D(Worksheet); Q_D(Worksheet);