1# Copyright (c) 2010-2024 openpyxl
2
3
4from openpyxl.descriptors import Typed, Set, Alias
5from openpyxl.descriptors.excel import ExtensionList
6from openpyxl.descriptors.serialisable import Serialisable
7from openpyxl.drawing.spreadsheet_drawing import (
8 AbsoluteAnchor,
9 SpreadsheetDrawing,
10)
11from openpyxl.worksheet.page import (
12 PageMargins,
13 PrintPageSetup
14)
15from openpyxl.worksheet.drawing import Drawing
16from openpyxl.worksheet.header_footer import HeaderFooter
17from openpyxl.workbook.child import _WorkbookChild
18from openpyxl.xml.constants import SHEET_MAIN_NS, REL_NS
19
20from .relation import DrawingHF, SheetBackgroundPicture
21from .properties import ChartsheetProperties
22from .protection import ChartsheetProtection
23from .views import ChartsheetViewList
24from .custom import CustomChartsheetViews
25from .publish import WebPublishItems
26
27
28class Chartsheet(_WorkbookChild, Serialisable):
29
30 tagname = "chartsheet"
31 _default_title = "Chart"
32 _rel_type = "chartsheet"
33 _path = "/xl/chartsheets/sheet{0}.xml"
34 mime_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml"
35
36 sheetPr = Typed(expected_type=ChartsheetProperties, allow_none=True)
37 sheetViews = Typed(expected_type=ChartsheetViewList)
38 sheetProtection = Typed(expected_type=ChartsheetProtection, allow_none=True)
39 customSheetViews = Typed(expected_type=CustomChartsheetViews, allow_none=True)
40 pageMargins = Typed(expected_type=PageMargins, allow_none=True)
41 pageSetup = Typed(expected_type=PrintPageSetup, allow_none=True)
42 drawing = Typed(expected_type=Drawing, allow_none=True)
43 drawingHF = Typed(expected_type=DrawingHF, allow_none=True)
44 picture = Typed(expected_type=SheetBackgroundPicture, allow_none=True)
45 webPublishItems = Typed(expected_type=WebPublishItems, allow_none=True)
46 extLst = Typed(expected_type=ExtensionList, allow_none=True)
47 sheet_state = Set(values=('visible', 'hidden', 'veryHidden'))
48 headerFooter = Typed(expected_type=HeaderFooter)
49 HeaderFooter = Alias('headerFooter')
50
51 __elements__ = (
52 'sheetPr', 'sheetViews', 'sheetProtection', 'customSheetViews',
53 'pageMargins', 'pageSetup', 'headerFooter', 'drawing', 'drawingHF',
54 'picture', 'webPublishItems')
55
56 __attrs__ = ()
57
58 def __init__(self,
59 sheetPr=None,
60 sheetViews=None,
61 sheetProtection=None,
62 customSheetViews=None,
63 pageMargins=None,
64 pageSetup=None,
65 headerFooter=None,
66 drawing=None,
67 drawingHF=None,
68 picture=None,
69 webPublishItems=None,
70 extLst=None,
71 parent=None,
72 title="",
73 sheet_state='visible',
74 ):
75 super().__init__(parent, title)
76 self._charts = []
77 self.sheetPr = sheetPr
78 if sheetViews is None:
79 sheetViews = ChartsheetViewList()
80 self.sheetViews = sheetViews
81 self.sheetProtection = sheetProtection
82 self.customSheetViews = customSheetViews
83 self.pageMargins = pageMargins
84 self.pageSetup = pageSetup
85 if headerFooter is not None:
86 self.headerFooter = headerFooter
87 self.drawing = Drawing("rId1")
88 self.drawingHF = drawingHF
89 self.picture = picture
90 self.webPublishItems = webPublishItems
91 self.sheet_state = sheet_state
92
93
94 def add_chart(self, chart):
95 chart.anchor = AbsoluteAnchor()
96 self._charts.append(chart)
97
98
99 def to_tree(self):
100 self._drawing = SpreadsheetDrawing()
101 self._drawing.charts = self._charts
102 tree = super().to_tree()
103 if not self.headerFooter:
104 el = tree.find('headerFooter')
105 tree.remove(el)
106 tree.set("xmlns", SHEET_MAIN_NS)
107 return tree