reader.py 1.98 KB
Newer Older
1
from __future__ import absolute_import
CharlieC's avatar
CharlieC committed
2
# Copyright (c) 2010-2017 openpyxl
3
4
5
6
7
8
9
10

"""
Read a chart
"""

from .chartspace import ChartSpace, PlotArea
from openpyxl.xml.functions import fromstring

11
12
13
from openpyxl.packaging.relationship import get_rel, get_rels_path, get_dependents
from openpyxl.drawing.spreadsheet_drawing import SpreadsheetDrawing

14
15
16
17
18
19
20
21
_types = ('areaChart', 'area3DChart', 'lineChart', 'line3DChart',
         'stockChart', 'radarChart', 'scatterChart', 'pieChart', 'pie3DChart',
         'doughnutChart', 'barChart', 'bar3DChart', 'ofPieChart', 'surfaceChart',
         'surface3DChart', 'bubbleChart',)

_axes = ('valAx', 'catAx', 'dateAx', 'serAx',)


22
def read_chart(src):
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    node = fromstring(src)
    cs = ChartSpace.from_tree(node)
    plot = cs.chart.plotArea
    for t in _types:
        chart = getattr(plot, t, None)
        if chart is not None:
            break # this ignores multiple charts

    chart.title = cs.chart.title
    chart.layout = plot.layout
    chart.legend = cs.chart.legend

    for x in _axes:
        ax = getattr(plot, x)
        if ax:
            if x == 'valAx':
                chart.y_axis = ax[0]
            elif x == 'serAx':
                chart.z_axis = ax[0]
            else:
                chart.x_axis = ax[0]
    return chart
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


def find_charts(archive, path):
    """
    Given the path to a drawing file extract anchors with charts
    """

    src = archive.read(path)
    tree = fromstring(src)
    drawing = SpreadsheetDrawing.from_tree(tree)

    rels_path = get_rels_path(path)
    deps = get_dependents(archive, rels_path)

    charts = []

    for anchor in drawing.twoCellAnchor:
        if anchor.graphicFrame is not None:
            graphic = anchor.graphicFrame.graphic
            if graphic.graphicData is not None:
                id = graphic.graphicData.chart.id

            chart = get_rel(archive, deps, id, ChartSpace)
            charts.append(chart)
            anchor.graphicFrame = None
            chart.anchor = anchor

    return charts