Add basic support for Bar3D and Pie3D
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
#include <QtCore>
|
#include <QtCore>
|
||||||
#include "xlsxdocument.h"
|
#include "xlsxdocument.h"
|
||||||
|
#include "xlsxcellrange.h"
|
||||||
#include "xlsxchart.h"
|
#include "xlsxchart.h"
|
||||||
#include "xlsxworksheet.h"
|
|
||||||
|
|
||||||
using namespace QXlsx;
|
using namespace QXlsx;
|
||||||
|
|
||||||
@@ -9,21 +9,27 @@ int main()
|
|||||||
{
|
{
|
||||||
//![0]
|
//![0]
|
||||||
Document xlsx;
|
Document xlsx;
|
||||||
|
|
||||||
Worksheet *sheet = xlsx.currentWorksheet();
|
|
||||||
for (int i=1; i<10; ++i)
|
for (int i=1; i<10; ++i)
|
||||||
sheet->write(i, 1, i*i);
|
xlsx.write(i, 1, i*i);
|
||||||
//![0]
|
//![0]
|
||||||
|
|
||||||
//![1]
|
//![1]
|
||||||
Chart *pieChart = sheet->insertChart(3, 3, QSize(300, 300));
|
Chart *pieChart = xlsx.insertChart(3, 3, QSize(300, 300));
|
||||||
pieChart->setChartType(Chart::CT_Pie);
|
pieChart->setChartType(Chart::CT_Pie);
|
||||||
pieChart->addSeries(CellRange("A1:A9"));
|
pieChart->addSeries(CellRange("A1:A9"));
|
||||||
|
|
||||||
Chart *barChart = sheet->insertChart(6, 6, QSize(300, 300));
|
Chart *pie3DChart = xlsx.insertChart(3, 7, QSize(300, 300));
|
||||||
|
pie3DChart->setChartType(Chart::CT_Pie3D);
|
||||||
|
pie3DChart->addSeries(CellRange("A1:A9"));
|
||||||
|
|
||||||
|
Chart *barChart = xlsx.insertChart(23, 3, QSize(300, 300));
|
||||||
barChart->setChartType(Chart::CT_Bar);
|
barChart->setChartType(Chart::CT_Bar);
|
||||||
barChart->addSeries(CellRange("A1:A9"));
|
barChart->addSeries(CellRange("A1:A9"));
|
||||||
|
|
||||||
|
Chart *bar3DChart = xlsx.insertChart(23, 7, QSize(300, 300));
|
||||||
|
bar3DChart->setChartType(Chart::CT_Bar3D);
|
||||||
|
bar3DChart->addSeries(CellRange("A1:A9"));
|
||||||
|
|
||||||
//![1]
|
//![1]
|
||||||
|
|
||||||
//![2]
|
//![2]
|
||||||
|
|||||||
+14
-6
@@ -35,7 +35,7 @@
|
|||||||
QT_BEGIN_NAMESPACE_XLSX
|
QT_BEGIN_NAMESPACE_XLSX
|
||||||
|
|
||||||
ChartPrivate::ChartPrivate(Chart *q)
|
ChartPrivate::ChartPrivate(Chart *q)
|
||||||
:OOXmlFilePrivate(q)
|
:OOXmlFilePrivate(q), chartType(static_cast<Chart::ChartType>(0))
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -184,8 +184,9 @@ bool ChartPrivate::loadXmlXxxChart(QXmlStreamReader &reader)
|
|||||||
{
|
{
|
||||||
QStringRef name = reader.name();
|
QStringRef name = reader.name();
|
||||||
if (name == QLatin1String("pieChart")) chartType = Chart::CT_Pie;
|
if (name == QLatin1String("pieChart")) chartType = Chart::CT_Pie;
|
||||||
|
else if (name == QLatin1String("pie3DChart")) chartType = Chart::CT_Pie3D;
|
||||||
else if (name == QLatin1String("barChart")) chartType = Chart::CT_Bar;
|
else if (name == QLatin1String("barChart")) chartType = Chart::CT_Bar;
|
||||||
|
else if (name == QLatin1String("bar3DChart")) chartType = Chart::CT_Bar3D;
|
||||||
|
|
||||||
while (!reader.atEnd()) {
|
while (!reader.atEnd()) {
|
||||||
reader.readNextStartElement();
|
reader.readNextStartElement();
|
||||||
@@ -242,7 +243,9 @@ void ChartPrivate::saveXmlXxxChart(QXmlStreamWriter &writer) const
|
|||||||
QString t;
|
QString t;
|
||||||
switch (chartType) {
|
switch (chartType) {
|
||||||
case Chart::CT_Pie: t = QStringLiteral("c:pieChart"); break;
|
case Chart::CT_Pie: t = QStringLiteral("c:pieChart"); break;
|
||||||
|
case Chart::CT_Pie3D: t = QStringLiteral("c:pie3DChart"); break;
|
||||||
case Chart::CT_Bar: t = QStringLiteral("c:barChart"); break;
|
case Chart::CT_Bar: t = QStringLiteral("c:barChart"); break;
|
||||||
|
case Chart::CT_Bar3D: t = QStringLiteral("c:bar3DChart"); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,18 +256,23 @@ void ChartPrivate::saveXmlXxxChart(QXmlStreamWriter &writer) const
|
|||||||
writer.writeAttribute(QStringLiteral("val"), QStringLiteral("col"));
|
writer.writeAttribute(QStringLiteral("val"), QStringLiteral("col"));
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.writeEmptyElement(QStringLiteral("c:varyColors"));
|
if (chartType==Chart::CT_Pie || chartType==Chart::CT_Pie3D) {
|
||||||
writer.writeAttribute(QStringLiteral("val"), QStringLiteral("1"));
|
//Do the same behavior as Excel, Pie prefer varyColors
|
||||||
|
writer.writeEmptyElement(QStringLiteral("c:varyColors"));
|
||||||
|
writer.writeAttribute(QStringLiteral("val"), QStringLiteral("1"));
|
||||||
|
}
|
||||||
|
|
||||||
for (int i=0; i<seriesList.size(); ++i)
|
for (int i=0; i<seriesList.size(); ++i)
|
||||||
saveXmlSer(writer, seriesList[i].data(), i);
|
saveXmlSer(writer, seriesList[i].data(), i);
|
||||||
|
|
||||||
if (chartType == Chart::CT_Bar) {
|
if (chartType == Chart::CT_Bar || chartType==Chart::CT_Bar3D) {
|
||||||
if (axisList.isEmpty()) {
|
if (axisList.isEmpty()) {
|
||||||
const_cast<ChartPrivate*>(this)->axisList.append(QSharedPointer<XlsxAxis>(new XlsxAxis(XlsxAxis::T_Cat, XlsxAxis::Left)));
|
const_cast<ChartPrivate*>(this)->axisList.append(QSharedPointer<XlsxAxis>(new XlsxAxis(XlsxAxis::T_Cat, XlsxAxis::Left)));
|
||||||
const_cast<ChartPrivate*>(this)->axisList.append(QSharedPointer<XlsxAxis>(new XlsxAxis(XlsxAxis::T_Val, XlsxAxis::Bottom)));
|
const_cast<ChartPrivate*>(this)->axisList.append(QSharedPointer<XlsxAxis>(new XlsxAxis(XlsxAxis::T_Val, XlsxAxis::Bottom)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_ASSERT(axisList.size()==2);
|
Q_ASSERT(axisList.size()==2 || (axisList.size()==3 && chartType==Chart::CT_Bar3D));
|
||||||
|
|
||||||
for (int i=0; i<axisList.size(); ++i) {
|
for (int i=0; i<axisList.size(); ++i) {
|
||||||
writer.writeEmptyElement(QStringLiteral("c:axId"));
|
writer.writeEmptyElement(QStringLiteral("c:axId"));
|
||||||
writer.writeAttribute(QStringLiteral("val"), QString::number(i+1));
|
writer.writeAttribute(QStringLiteral("val"), QString::number(i+1));
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class Q_XLSX_EXPORT Chart : public OOXmlFile
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
enum ChartType {
|
enum ChartType {
|
||||||
CT_Area,
|
CT_Area = 1, //Zero is internally used for unknown types
|
||||||
CT_Area3D,
|
CT_Area3D,
|
||||||
CT_Line,
|
CT_Line,
|
||||||
CT_Line3D,
|
CT_Line3D,
|
||||||
|
|||||||
Reference in New Issue
Block a user