Improve worksheets support
This commit is contained in:
@@ -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);
|
||||
|
||||
+73
-14
@@ -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;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -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);
|
||||
|
||||
+20
-21
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+91
-10
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+11
-3
@@ -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());
|
||||
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
int window_width;
|
||||
int window_height;
|
||||
|
||||
int activesheet;
|
||||
int activesheetIndex;
|
||||
int firstsheet;
|
||||
int table_count;
|
||||
|
||||
|
||||
@@ -198,6 +198,9 @@ QString Worksheet::sheetName() const
|
||||
return d->name;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
*/
|
||||
void Worksheet::setSheetName(const QString &sheetName)
|
||||
{
|
||||
Q_D(Worksheet);
|
||||
|
||||
Reference in New Issue
Block a user