chartsheet.py 3.8 KB

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