Browse Source

Improve worksheets support

master
Debao Zhang 12 years ago
parent
commit
82c77b4bed
  1. 2
      examples/xlsx/demo/main.cpp
  2. 87
      src/xlsx/xlsxdocument.cpp
  3. 12
      src/xlsx/xlsxdocument.h
  4. 41
      src/xlsx/xlsxpackage.cpp
  5. 101
      src/xlsx/xlsxworkbook.cpp
  6. 14
      src/xlsx/xlsxworkbook.h
  7. 2
      src/xlsx/xlsxworkbook_p.h
  8. 3
      src/xlsx/xlsxworksheet.cpp

2
examples/xlsx/demo/main.cpp

@ -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);

87
src/xlsx/xlsxdocument.cpp

@ -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)
{
selectWorksheet(name);
}
/*!
* \brief Set current selected worksheet to be the sheet named \a name.
*/
bool Document::selectWorksheet(const QString &name)
{ {
Q_D(Document); Q_D(Document);
for (int i=0; i<d->workbook->worksheets().size(); ++i) { for (int i=0; i<d->workbook->worksheetCount(); ++i) {
if (d->workbook->worksheets()[i]->sheetName() == name) if (d->workbook->worksheet(i)->sheetName() == name)
d->workbook->setActiveWorksheet(i); 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;
} }
/*! /*!

12
src/xlsx/xlsxdocument.h

@ -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);

41
src/xlsx/xlsxpackage.cpp

@ -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;
} }
} }

101
src/xlsx/xlsxworkbook.cpp

@ -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->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->activesheet = index;
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();
} }
} }
} }

14
src/xlsx/xlsxworkbook.h

@ -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());

2
src/xlsx/xlsxworkbook_p.h

@ -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
src/xlsx/xlsxworksheet.cpp

@ -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);

Loading…
Cancel
Save