Browse Source

Improve worksheets support

master
Debao Zhang 11 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"
xlsx.setSheetName("Aligns & Borders");
xlsx.renameWorksheet("Sheet1", "Aligns & Borders");
xlsx.setColumn("B", "B", 20);
xlsx.setColumn("H", "H", 12);
xlsx.currentWorksheet()->setGridLinesVisible(false);

87
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; i<d->workbook->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; i<d->workbook->worksheets().size(); ++i) {
if (d->workbook->worksheets()[i]->sheetName() == name)
d->workbook->setActiveWorksheet(i);
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;
}
/*!

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

41
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<Worksheet> 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; i<m_workbook->worksheetCount(); ++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; i<m_workbook->worksheetCount(); ++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; i<m_workbook->worksheetCount(); ++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; i<m_workbook->worksheetCount(); ++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; i<m_workbook->worksheetCount(); ++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; i<m_workbook->worksheetCount(); ++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; i<m_workbook->worksheetCount(); ++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; i<m_workbook->worksheetCount(); ++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());
}
}

101
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<Worksheet>(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; 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
@ -231,6 +292,26 @@ QList<QSharedPointer<Worksheet> > 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();
}
}
}

14
src/xlsx/xlsxworkbook.h

@ -50,11 +50,19 @@ class Q_XLSX_EXPORT Workbook
public:
~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 *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());

2
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;

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

Loading…
Cancel
Save