wumu
2025-04-27 20ffcfb5507daf34f81346ca3dfa4c031e7b2fe3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// xlsxchart_p.h
 
#ifndef QXLSX_CHART_P_H
#define QXLSX_CHART_P_H
 
#include <QObject>
#include <QString>
#include <QVector>
#include <QMap>
#include <QList>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
 
#include <memory>
 
#include "xlsxabstractooxmlfile_p.h"
#include "xlsxchart.h"
 
QT_BEGIN_NAMESPACE_XLSX
 
class XlsxSeries
{
public:
    //At present, we care about number cell ranges only!
    QString numberDataSource_numRef; // yval, val
    QString axDataSource_numRef; // xval, cat
    QString headerH_numRef;
    QString headerV_numRef;
    bool    swapHeader = false;
};
 
class XlsxAxis
{
public:
    enum Type { T_None = (-1), T_Cat, T_Val, T_Date, T_Ser };
    enum AxisPos { None = (-1), Left, Right, Top, Bottom };
public:
    XlsxAxis(){}
 
    XlsxAxis( Type t,
              XlsxAxis::AxisPos p,
              int id,
              int crossId,
              QString axisTitle = QString())
    {
        type = t;
        axisPos = p;
        axisId = id;
        crossAx = crossId;
 
        if ( !axisTitle.isEmpty() )
        {
            axisNames[ p ] = axisTitle;
        }
    }
 
public:
    Type type;
    XlsxAxis::AxisPos axisPos;
    int axisId;
    int crossAx;
    QMap< XlsxAxis::AxisPos, QString > axisNames;
};
 
class ChartPrivate : public AbstractOOXmlFilePrivate
{
    Q_DECLARE_PUBLIC(Chart)
 
public:
    ChartPrivate(Chart *q, Chart::CreateFlag flag);
    ~ChartPrivate();
 
public:
    bool loadXmlChart(QXmlStreamReader &reader);
    bool loadXmlPlotArea(QXmlStreamReader &reader);
protected:
    bool loadXmlPlotAreaElement(QXmlStreamReader &reader);
public:
    bool loadXmlXxxChart(QXmlStreamReader &reader);
    bool loadXmlSer(QXmlStreamReader &reader);
    QString loadXmlNumRef(QXmlStreamReader &reader);
    QString loadXmlStrRef(QXmlStreamReader &reader);
    bool loadXmlChartTitle(QXmlStreamReader &reader);
    bool loadXmlChartLegend(QXmlStreamReader &reader);
protected:
    bool loadXmlChartTitleTx(QXmlStreamReader &reader);
    bool loadXmlChartTitleTxRich(QXmlStreamReader &reader);
    bool loadXmlChartTitleTxRichP(QXmlStreamReader &reader);
    bool loadXmlChartTitleTxRichP_R(QXmlStreamReader &reader);
protected:
    bool loadXmlAxisCatAx(QXmlStreamReader &reader);
    bool loadXmlAxisDateAx(QXmlStreamReader &reader);
    bool loadXmlAxisSerAx(QXmlStreamReader &reader);
    bool loadXmlAxisValAx(QXmlStreamReader &reader);
    bool loadXmlAxisEG_AxShared(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Scaling(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Title(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Title_Overlay(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Title_Tx(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Title_Tx_Rich(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Title_Tx_Rich_P(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Title_Tx_Rich_P_pPr(QXmlStreamReader &reader, XlsxAxis* axis);
    bool loadXmlAxisEG_AxShared_Title_Tx_Rich_P_R(QXmlStreamReader &reader, XlsxAxis* axis);
 
    QString readSubTree(QXmlStreamReader &reader);
 
public:
    void saveXmlChart(QXmlStreamWriter &writer) const;
    void saveXmlChartTitle(QXmlStreamWriter &writer) const;
    void saveXmlPieChart(QXmlStreamWriter &writer) const;
    void saveXmlBarChart(QXmlStreamWriter &writer) const;
    void saveXmlLineChart(QXmlStreamWriter &writer) const;
    void saveXmlScatterChart(QXmlStreamWriter &writer) const;
    void saveXmlAreaChart(QXmlStreamWriter &writer) const;
    void saveXmlDoughnutChart(QXmlStreamWriter &writer) const;
    void saveXmlSer(QXmlStreamWriter &writer, XlsxSeries *ser, int id) const;
    void saveXmlAxis(QXmlStreamWriter &writer) const;
    void saveXmlChartLegend(QXmlStreamWriter &writer) const;
 
protected:
    void saveXmlAxisCatAx(QXmlStreamWriter &writer, XlsxAxis* axis) const;
    void saveXmlAxisDateAx(QXmlStreamWriter &writer, XlsxAxis* axis) const;
    void saveXmlAxisSerAx(QXmlStreamWriter &writer, XlsxAxis* axis) const;
    void saveXmlAxisValAx(QXmlStreamWriter &writer, XlsxAxis* axis) const;
 
    void saveXmlAxisEG_AxShared(QXmlStreamWriter &writer, XlsxAxis* axis) const;
    void saveXmlAxisEG_AxShared_Title(QXmlStreamWriter &writer, XlsxAxis* axis) const;
    QString GetAxisPosString( XlsxAxis::AxisPos axisPos ) const;
    QString GetAxisName(XlsxAxis* ptrXlsxAxis) const;
 
public:
    Chart::ChartType chartType;
    QList< std::shared_ptr<XlsxSeries> > seriesList;
    QList< std::shared_ptr<XlsxAxis> > axisList;
    QMap< XlsxAxis::AxisPos, QString > axisNames;
    QString chartTitle;
    AbstractSheet* sheet;
    Chart::ChartAxisPos legendPos;
    bool legendOverlay;
    bool majorGridlinesEnabled;
    bool minorGridlinesEnabled;
 
    QString layout;             // only for storing a readed file
};
 
QT_END_NAMESPACE_XLSX
 
#endif // QXLSX_CHART_P_H