Chartsheet works now
This commit is contained in:
@@ -0,0 +1,9 @@
|
|||||||
|
TARGET = chartsheet
|
||||||
|
|
||||||
|
#include(../../../src/xlsx/qtxlsx.pri)
|
||||||
|
QT+=xlsx
|
||||||
|
|
||||||
|
CONFIG += console
|
||||||
|
CONFIG -= app_bundle
|
||||||
|
|
||||||
|
SOURCES += main.cpp
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#include <QtCore>
|
||||||
|
#include "xlsxdocument.h"
|
||||||
|
#include "xlsxchartsheet.h"
|
||||||
|
#include "xlsxcellrange.h"
|
||||||
|
#include "xlsxchart.h"
|
||||||
|
|
||||||
|
using namespace QXlsx;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
//![0]
|
||||||
|
Document xlsx;
|
||||||
|
for (int i=1; i<10; ++i)
|
||||||
|
xlsx.write(i, 1, i*i);
|
||||||
|
//![0]
|
||||||
|
|
||||||
|
//![1]
|
||||||
|
xlsx.addSheet("Chart1", AbstractSheet::ST_ChartSheet);
|
||||||
|
Chartsheet *sheet = static_cast<Chartsheet*>(xlsx.currentSheet());
|
||||||
|
Chart *barChart = sheet->chart();
|
||||||
|
barChart->setChartType(Chart::CT_Bar);
|
||||||
|
barChart->addSeries(CellRange("A1:A9"), xlsx.sheet("Sheet1"));
|
||||||
|
//![1]
|
||||||
|
|
||||||
|
//![2]
|
||||||
|
xlsx.saveAs("Book1.xlsx");
|
||||||
|
//![2]
|
||||||
|
|
||||||
|
Document xlsx2("Book1.xlsx");
|
||||||
|
xlsx2.saveAs("Book2.xlsx");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -15,6 +15,7 @@ SUBDIRS = hello \
|
|||||||
worksheetoperations \
|
worksheetoperations \
|
||||||
hyperlinks \
|
hyperlinks \
|
||||||
chart \
|
chart \
|
||||||
|
chartsheet \
|
||||||
demo
|
demo
|
||||||
|
|
||||||
qtHaveModule(widgets): SUBDIRS += xlsxwidget
|
qtHaveModule(widgets): SUBDIRS += xlsxwidget
|
||||||
|
|||||||
@@ -93,9 +93,13 @@ Chart::~Chart()
|
|||||||
/*!
|
/*!
|
||||||
* Add the data series which is in the range \a range of the \a sheet.
|
* Add the data series which is in the range \a range of the \a sheet.
|
||||||
*/
|
*/
|
||||||
void Chart::addSeries(const CellRange &range, Worksheet *sheet)
|
void Chart::addSeries(const CellRange &range, AbstractSheet *sheet)
|
||||||
{
|
{
|
||||||
Q_D(Chart);
|
Q_D(Chart);
|
||||||
|
if (sheet && sheet->sheetType() != AbstractSheet::ST_WorkSheet)
|
||||||
|
return;
|
||||||
|
if (!sheet && d->sheet->sheetType() != AbstractSheet::ST_WorkSheet)
|
||||||
|
return;
|
||||||
|
|
||||||
QString serRef = sheet ? sheet->sheetName() : d->sheet->sheetName();
|
QString serRef = sheet ? sheet->sheetName() : d->sheet->sheetName();
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public:
|
|||||||
|
|
||||||
~Chart();
|
~Chart();
|
||||||
|
|
||||||
void addSeries(const CellRange &range, Worksheet *sheet=0);
|
void addSeries(const CellRange &range, AbstractSheet *sheet=0);
|
||||||
void setChartType(ChartType type);
|
void setChartType(ChartType type);
|
||||||
void setChartStyle(int id);
|
void setChartStyle(int id);
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
#include "xlsxutility_p.h"
|
#include "xlsxutility_p.h"
|
||||||
#include "xlsxdrawing_p.h"
|
#include "xlsxdrawing_p.h"
|
||||||
#include "xlsxdrawinganchor_p.h"
|
#include "xlsxdrawinganchor_p.h"
|
||||||
|
#include "xlsxchart.h"
|
||||||
|
|
||||||
#include <QXmlStreamReader>
|
#include <QXmlStreamReader>
|
||||||
#include <QXmlStreamWriter>
|
#include <QXmlStreamWriter>
|
||||||
@@ -36,8 +37,9 @@
|
|||||||
QT_BEGIN_NAMESPACE_XLSX
|
QT_BEGIN_NAMESPACE_XLSX
|
||||||
|
|
||||||
ChartsheetPrivate::ChartsheetPrivate(Chartsheet *p, Chartsheet::CreateFlag flag)
|
ChartsheetPrivate::ChartsheetPrivate(Chartsheet *p, Chartsheet::CreateFlag flag)
|
||||||
: AbstractSheetPrivate(p, flag)
|
: AbstractSheetPrivate(p, flag), chart(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChartsheetPrivate::~ChartsheetPrivate()
|
ChartsheetPrivate::~ChartsheetPrivate()
|
||||||
@@ -57,6 +59,21 @@ Chartsheet::Chartsheet(const QString &name, int id, Workbook *workbook, CreateFl
|
|||||||
:AbstractSheet(name, id, workbook, new ChartsheetPrivate(this, flag))
|
:AbstractSheet(name, id, workbook, new ChartsheetPrivate(this, flag))
|
||||||
{
|
{
|
||||||
setSheetType(ST_ChartSheet);
|
setSheetType(ST_ChartSheet);
|
||||||
|
|
||||||
|
if (flag == Chartsheet::F_NewFromScratch) {
|
||||||
|
d_func()->drawing = QSharedPointer<Drawing>(new Drawing(this, flag));
|
||||||
|
|
||||||
|
DrawingAbsoluteAnchor *anchor = new DrawingAbsoluteAnchor(drawing(), DrawingAnchor::Picture);
|
||||||
|
|
||||||
|
anchor->pos = QPoint(0, 0);
|
||||||
|
anchor->ext = QSize(9293679, 6068786);
|
||||||
|
|
||||||
|
QSharedPointer<Chart> chart = QSharedPointer<Chart>(new Chart(this, flag));
|
||||||
|
chart->setChartType(Chart::CT_Bar);
|
||||||
|
anchor->setObjectGraphicFrame(chart);
|
||||||
|
|
||||||
|
d_func()->chart = chart.data();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -246,10 +246,12 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
|
|||||||
DocPropsApp docPropsApp(DocPropsApp::F_NewFromScratch);
|
DocPropsApp docPropsApp(DocPropsApp::F_NewFromScratch);
|
||||||
DocPropsCore docPropsCore(DocPropsCore::F_NewFromScratch);
|
DocPropsCore docPropsCore(DocPropsCore::F_NewFromScratch);
|
||||||
|
|
||||||
// save sheet xml files
|
// save worksheet xml files
|
||||||
for (int i=0; i<workbook->sheetCount(); ++i) {
|
QList<QSharedPointer<AbstractSheet> > worksheets = workbook->getSheetsByTypes(AbstractSheet::ST_WorkSheet);
|
||||||
AbstractSheet *sheet = workbook->sheet(i);
|
if (!worksheets.isEmpty())
|
||||||
if (sheet->sheetType() == AbstractSheet::ST_WorkSheet) {
|
docPropsApp.addHeadingPair(QStringLiteral("Worksheets"), worksheets.size());
|
||||||
|
for (int i=0; i<worksheets.size(); ++i) {
|
||||||
|
QSharedPointer<AbstractSheet> sheet = worksheets[i];
|
||||||
contentTypes->addWorksheetName(QStringLiteral("sheet%1").arg(i+1));
|
contentTypes->addWorksheetName(QStringLiteral("sheet%1").arg(i+1));
|
||||||
docPropsApp.addPartTitle(sheet->sheetName());
|
docPropsApp.addPartTitle(sheet->sheetName());
|
||||||
|
|
||||||
@@ -258,6 +260,20 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
|
|||||||
if (!rel->isEmpty())
|
if (!rel->isEmpty())
|
||||||
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData());
|
zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//save chartsheet xml files
|
||||||
|
QList<QSharedPointer<AbstractSheet> > chartsheets = workbook->getSheetsByTypes(AbstractSheet::ST_ChartSheet);
|
||||||
|
if (!chartsheets.isEmpty())
|
||||||
|
docPropsApp.addHeadingPair(QStringLiteral("Chartsheets"), chartsheets.size());
|
||||||
|
for (int i=0; i<chartsheets.size(); ++i) {
|
||||||
|
QSharedPointer<AbstractSheet> sheet = chartsheets[i];
|
||||||
|
contentTypes->addWorksheetName(QStringLiteral("sheet%1").arg(i+1));
|
||||||
|
docPropsApp.addPartTitle(sheet->sheetName());
|
||||||
|
|
||||||
|
zipWriter.addFile(QStringLiteral("xl/chartsheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData());
|
||||||
|
Relationships *rel = sheet->relationships();
|
||||||
|
if (!rel->isEmpty())
|
||||||
|
zipWriter.addFile(QStringLiteral("xl/chartsheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData());
|
||||||
}
|
}
|
||||||
|
|
||||||
// save external links xml files
|
// save external links xml files
|
||||||
@@ -291,8 +307,6 @@ bool DocumentPrivate::savePackage(QIODevice *device) const
|
|||||||
docPropsApp.setProperty(name, q->documentProperty(name));
|
docPropsApp.setProperty(name, q->documentProperty(name));
|
||||||
docPropsCore.setProperty(name, q->documentProperty(name));
|
docPropsCore.setProperty(name, q->documentProperty(name));
|
||||||
}
|
}
|
||||||
if (workbook->sheetCount())
|
|
||||||
docPropsApp.addHeadingPair(QStringLiteral("Worksheets"), workbook->sheetCount());
|
|
||||||
contentTypes->addDocPropApp();
|
contentTypes->addDocPropApp();
|
||||||
contentTypes->addDocPropCore();
|
contentTypes->addDocPropCore();
|
||||||
zipWriter.addFile(QStringLiteral("docProps/app.xml"), docPropsApp.saveToXmlData());
|
zipWriter.addFile(QStringLiteral("docProps/app.xml"), docPropsApp.saveToXmlData());
|
||||||
|
|||||||
+69
-15
@@ -26,6 +26,7 @@
|
|||||||
#include "xlsxworkbook_p.h"
|
#include "xlsxworkbook_p.h"
|
||||||
#include "xlsxsharedstrings_p.h"
|
#include "xlsxsharedstrings_p.h"
|
||||||
#include "xlsxworksheet.h"
|
#include "xlsxworksheet.h"
|
||||||
|
#include "xlsxchartsheet.h"
|
||||||
#include "xlsxstyles_p.h"
|
#include "xlsxstyles_p.h"
|
||||||
#include "xlsxformat.h"
|
#include "xlsxformat.h"
|
||||||
#include "xlsxworksheet_p.h"
|
#include "xlsxworksheet_p.h"
|
||||||
@@ -61,7 +62,8 @@ WorkbookPrivate::WorkbookPrivate(Workbook *q, Workbook::CreateFlag flag) :
|
|||||||
firstsheet = 0;
|
firstsheet = 0;
|
||||||
table_count = 0;
|
table_count = 0;
|
||||||
|
|
||||||
last_sheet_index = 0;
|
last_worksheet_index = 0;
|
||||||
|
last_chartsheet_index = 0;
|
||||||
last_sheet_id = 0;
|
last_sheet_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,9 +197,16 @@ AbstractSheet *Workbook::addSheet(const QString &name, int sheetId, AbstractShee
|
|||||||
Q_D(Workbook);
|
Q_D(Workbook);
|
||||||
if (sheetId > d->last_sheet_id)
|
if (sheetId > d->last_sheet_id)
|
||||||
d->last_sheet_id = sheetId;
|
d->last_sheet_id = sheetId;
|
||||||
|
AbstractSheet *sheet=0;
|
||||||
Worksheet *sheet = new Worksheet(name, sheetId, this, F_LoadFromExists);
|
if (type == AbstractSheet::ST_WorkSheet) {
|
||||||
d->sheets.append(QSharedPointer<Worksheet>(sheet));
|
sheet = new Worksheet(name, sheetId, this, F_LoadFromExists);
|
||||||
|
} else if (type == AbstractSheet::ST_ChartSheet) {
|
||||||
|
sheet = new Chartsheet(name, sheetId, this, F_LoadFromExists);
|
||||||
|
} else {
|
||||||
|
qWarning("unsupported sheet type.");
|
||||||
|
Q_ASSERT(false);
|
||||||
|
}
|
||||||
|
d->sheets.append(QSharedPointer<AbstractSheet>(sheet));
|
||||||
d->sheetNames.append(name);
|
d->sheetNames.append(name);
|
||||||
return sheet;
|
return sheet;
|
||||||
}
|
}
|
||||||
@@ -205,22 +214,37 @@ AbstractSheet *Workbook::addSheet(const QString &name, int sheetId, AbstractShee
|
|||||||
AbstractSheet *Workbook::insertSheet(int index, const QString &name, AbstractSheet::SheetType type)
|
AbstractSheet *Workbook::insertSheet(int index, const QString &name, AbstractSheet::SheetType type)
|
||||||
{
|
{
|
||||||
Q_D(Workbook);
|
Q_D(Workbook);
|
||||||
QString worksheetName = createSafeSheetName(name);
|
QString sheetName = createSafeSheetName(name);
|
||||||
if (!worksheetName.isEmpty()) {
|
if (!sheetName.isEmpty()) {
|
||||||
//If user given an already in-used name, we should not continue any more!
|
//If user given an already in-used name, we should not continue any more!
|
||||||
if (d->sheetNames.contains(worksheetName))
|
if (d->sheetNames.contains(sheetName))
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
if (type == AbstractSheet::ST_WorkSheet) {
|
||||||
do {
|
do {
|
||||||
++d->last_sheet_index;
|
++d->last_worksheet_index;
|
||||||
worksheetName = QStringLiteral("Sheet%1").arg(d->last_sheet_index);
|
sheetName = QStringLiteral("Sheet%1").arg(d->last_worksheet_index);
|
||||||
} while (d->sheetNames.contains(worksheetName));
|
} while (d->sheetNames.contains(sheetName));
|
||||||
|
} else if (type == AbstractSheet::ST_ChartSheet) {
|
||||||
|
do {
|
||||||
|
++d->last_chartsheet_index;
|
||||||
|
sheetName = QStringLiteral("Chart%1").arg(d->last_chartsheet_index);
|
||||||
|
} while (d->sheetNames.contains(sheetName));
|
||||||
|
} else {
|
||||||
|
qWarning("unsupported sheet type.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
++d->last_sheet_id;
|
++d->last_sheet_id;
|
||||||
Worksheet *sheet = new Worksheet(worksheetName, d->last_sheet_id, this, F_NewFromScratch);
|
AbstractSheet *sheet;
|
||||||
d->sheets.insert(index, QSharedPointer<Worksheet>(sheet));
|
if (type == AbstractSheet::ST_WorkSheet)
|
||||||
d->sheetNames.insert(index, worksheetName);
|
sheet = new Worksheet(sheetName, d->last_sheet_id, this, F_NewFromScratch);
|
||||||
|
else
|
||||||
|
sheet = new Chartsheet(sheetName, d->last_sheet_id, this, F_NewFromScratch);
|
||||||
|
|
||||||
|
d->sheets.insert(index, QSharedPointer<AbstractSheet>(sheet));
|
||||||
|
d->sheetNames.insert(index, sheetName);
|
||||||
d->activesheetIndex = index;
|
d->activesheetIndex = index;
|
||||||
return sheet;
|
return sheet;
|
||||||
}
|
}
|
||||||
@@ -384,6 +408,20 @@ QList<Drawing *> Workbook::drawings()
|
|||||||
return ds;
|
return ds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \internal
|
||||||
|
*/
|
||||||
|
QList<QSharedPointer<AbstractSheet> > Workbook::getSheetsByTypes(AbstractSheet::SheetType type) const
|
||||||
|
{
|
||||||
|
Q_D(const Workbook);
|
||||||
|
QList<QSharedPointer<AbstractSheet> > list;
|
||||||
|
for (int i=0; i<d->sheets.size(); ++i) {
|
||||||
|
if (d->sheets[i]->sheetType() == type)
|
||||||
|
list.append(d->sheets[i]);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
void Workbook::saveToXmlFile(QIODevice *device) const
|
void Workbook::saveToXmlFile(QIODevice *device) const
|
||||||
{
|
{
|
||||||
Q_D(const Workbook);
|
Q_D(const Workbook);
|
||||||
@@ -424,8 +462,10 @@ void Workbook::saveToXmlFile(QIODevice *device) const
|
|||||||
writer.writeEndElement();//bookViews
|
writer.writeEndElement();//bookViews
|
||||||
|
|
||||||
writer.writeStartElement(QStringLiteral("sheets"));
|
writer.writeStartElement(QStringLiteral("sheets"));
|
||||||
for (int i=0; i<d->sheets.size(); ++i) {
|
//work sheets
|
||||||
QSharedPointer<AbstractSheet> sheet = d->sheets[i];
|
QList<QSharedPointer<AbstractSheet> > worksheets = getSheetsByTypes(AbstractSheet::ST_WorkSheet);
|
||||||
|
for (int i=0; i<worksheets.size(); ++i) {
|
||||||
|
QSharedPointer<AbstractSheet> sheet = worksheets[i];
|
||||||
writer.writeEmptyElement(QStringLiteral("sheet"));
|
writer.writeEmptyElement(QStringLiteral("sheet"));
|
||||||
writer.writeAttribute(QStringLiteral("name"), sheet->sheetName());
|
writer.writeAttribute(QStringLiteral("name"), sheet->sheetName());
|
||||||
writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId()));
|
writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId()));
|
||||||
@@ -435,6 +475,20 @@ void Workbook::saveToXmlFile(QIODevice *device) const
|
|||||||
d->relationships->addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1));
|
d->relationships->addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1));
|
||||||
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count()));
|
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//chart sheets
|
||||||
|
QList<QSharedPointer<AbstractSheet> > chartsheets = getSheetsByTypes(AbstractSheet::ST_ChartSheet);
|
||||||
|
for (int i=0; i<chartsheets.size(); ++i) {
|
||||||
|
QSharedPointer<AbstractSheet> sheet = chartsheets[i];
|
||||||
|
writer.writeEmptyElement(QStringLiteral("sheet"));
|
||||||
|
writer.writeAttribute(QStringLiteral("name"), sheet->sheetName());
|
||||||
|
writer.writeAttribute(QStringLiteral("sheetId"), QString::number(sheet->sheetId()));
|
||||||
|
if (sheet->isHidden())
|
||||||
|
writer.writeAttribute(QStringLiteral("state"), QStringLiteral("hidden"));
|
||||||
|
|
||||||
|
d->relationships->addDocumentRelationship(QStringLiteral("/chartsheet"), QStringLiteral("chartsheets/sheet%1.xml").arg(i+1));
|
||||||
|
writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(d->relationships->count()));
|
||||||
|
}
|
||||||
writer.writeEndElement();//sheets
|
writer.writeEndElement();//sheets
|
||||||
|
|
||||||
if (d->externalLinks.size() > 0) {
|
if (d->externalLinks.size() > 0) {
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ private:
|
|||||||
Theme *theme();
|
Theme *theme();
|
||||||
QList<QImage> images();
|
QList<QImage> images();
|
||||||
QList<Drawing *> drawings();
|
QList<Drawing *> drawings();
|
||||||
|
QList<QSharedPointer<AbstractSheet> > getSheetsByTypes(AbstractSheet::SheetType type) const;
|
||||||
QStringList worksheetNames() const;
|
QStringList worksheetNames() const;
|
||||||
AbstractSheet *addSheet(const QString &name, int sheetId, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet);
|
AbstractSheet *addSheet(const QString &name, int sheetId, AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -96,7 +96,8 @@ public:
|
|||||||
int table_count;
|
int table_count;
|
||||||
|
|
||||||
//Used to generate new sheet name and id
|
//Used to generate new sheet name and id
|
||||||
int last_sheet_index;
|
int last_worksheet_index;
|
||||||
|
int last_chartsheet_index;
|
||||||
int last_sheet_id;
|
int last_sheet_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user