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 "xlsxdocument.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxworksheet.h"
using namespace QXlsx;
@ -9,21 +9,27 @@ int main()
{
//![0]
Document xlsx;
Worksheet *sheet = xlsx.currentWorksheet();
for (int i=1; i<10; ++i)
sheet->write(i, 1, i*i);
xlsx.write(i, 1, i*i);
//![0]
//![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->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->addSeries(CellRange("A1:A9"));
Chart *bar3DChart = xlsx.insertChart(23, 7, QSize(300, 300));
bar3DChart->setChartType(Chart::CT_Bar3D);
bar3DChart->addSeries(CellRange("A1:A9"));
//![1]
//![2]

20
src/xlsx/xlsxchart.cpp

@ -35,7 +35,7 @@
QT_BEGIN_NAMESPACE_XLSX
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();
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("bar3DChart")) chartType = Chart::CT_Bar3D;
while (!reader.atEnd()) {
reader.readNextStartElement();
@ -242,7 +243,9 @@ void ChartPrivate::saveXmlXxxChart(QXmlStreamWriter &writer) const
QString t;
switch (chartType) {
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_Bar3D: t = QStringLiteral("c:bar3DChart"); break;
default: break;
}
@ -253,18 +256,23 @@ void ChartPrivate::saveXmlXxxChart(QXmlStreamWriter &writer) const
writer.writeAttribute(QStringLiteral("val"), QStringLiteral("col"));
}
writer.writeEmptyElement(QStringLiteral("c:varyColors"));
writer.writeAttribute(QStringLiteral("val"), QStringLiteral("1"));
if (chartType==Chart::CT_Pie || chartType==Chart::CT_Pie3D) {
//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)
saveXmlSer(writer, seriesList[i].data(), i);
if (chartType == Chart::CT_Bar) {
if (chartType == Chart::CT_Bar || chartType==Chart::CT_Bar3D) {
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_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) {
writer.writeEmptyElement(QStringLiteral("c:axId"));
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:
enum ChartType {
CT_Area,
CT_Area = 1, //Zero is internally used for unknown types
CT_Area3D,
CT_Line,
CT_Line3D,

Loading…
Cancel
Save