Browse Source

Add basic support for Bar3D and Pie3D

master
Debao Zhang 11 years ago
parent
commit
2f887f3fa8
  1. 18
      examples/xlsx/chart/main.cpp
  2. 20
      src/xlsx/xlsxchart.cpp
  3. 2
      src/xlsx/xlsxchart.h

18
examples/xlsx/chart/main.cpp

@ -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]

20
src/xlsx/xlsxchart.cpp

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

2
src/xlsx/xlsxchart.h

@ -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,

Loading…
Cancel
Save