123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- from __future__ import absolute_import
- # Copyright (c) 2010-2019 openpyxl
- from openpyxl.descriptors.serialisable import Serialisable
- from openpyxl.descriptors import (
- Typed,
- Float,
- NoneSet,
- Bool,
- Integer,
- MinMax,
- NoneSet,
- Set,
- String,
- Alias,
- )
- from openpyxl.descriptors.excel import (
- ExtensionList,
- Percentage,
- _explicit_none,
- )
- from openpyxl.descriptors.nested import (
- NestedValue,
- NestedSet,
- NestedBool,
- NestedNoneSet,
- NestedFloat,
- NestedInteger,
- NestedMinMax,
- )
- from openpyxl.xml.constants import CHART_NS
- from .descriptors import NumberFormatDescriptor
- from .layout import Layout
- from .text import Text, RichText
- from .shapes import GraphicalProperties
- from .title import Title, TitleDescriptor
- class ChartLines(Serialisable):
- tagname = "chartLines"
- spPr = Typed(expected_type=GraphicalProperties, allow_none=True)
- graphicalProperties = Alias('spPr')
- def __init__(self, spPr=None):
- self.spPr = spPr
- class Scaling(Serialisable):
- tagname = "scaling"
- logBase = NestedFloat(allow_none=True)
- orientation = NestedSet(values=(['maxMin', 'minMax']))
- max = NestedFloat(allow_none=True)
- min = NestedFloat(allow_none=True)
- extLst = Typed(expected_type=ExtensionList, allow_none=True)
- __elements__ = ('logBase', 'orientation', 'max', 'min',)
- def __init__(self,
- logBase=None,
- orientation="minMax",
- max=None,
- min=None,
- extLst=None,
- ):
- self.logBase = logBase
- self.orientation = orientation
- self.max = max
- self.min = min
- class _BaseAxis(Serialisable):
- axId = NestedInteger(expected_type=int)
- scaling = Typed(expected_type=Scaling)
- delete = NestedBool(allow_none=True)
- axPos = NestedSet(values=(['b', 'l', 'r', 't']))
- majorGridlines = Typed(expected_type=ChartLines, allow_none=True)
- minorGridlines = Typed(expected_type=ChartLines, allow_none=True)
- title = TitleDescriptor()
- numFmt = NumberFormatDescriptor()
- number_format = Alias("numFmt")
- majorTickMark = NestedNoneSet(values=(['cross', 'in', 'out']), to_tree=_explicit_none)
- minorTickMark = NestedNoneSet(values=(['cross', 'in', 'out']), to_tree=_explicit_none)
- tickLblPos = NestedNoneSet(values=(['high', 'low', 'nextTo']))
- spPr = Typed(expected_type=GraphicalProperties, allow_none=True)
- graphicalProperties = Alias('spPr')
- txPr = Typed(expected_type=RichText, allow_none=True)
- textProperties = Alias('txPr')
- crossAx = NestedInteger(expected_type=int) # references other axis
- crosses = NestedNoneSet(values=(['autoZero', 'max', 'min']))
- crossesAt = NestedFloat(allow_none=True)
- # crosses & crossesAt are mutually exclusive
- __elements__ = ('axId', 'scaling', 'delete', 'axPos', 'majorGridlines',
- 'minorGridlines', 'title', 'numFmt', 'majorTickMark', 'minorTickMark',
- 'tickLblPos', 'spPr', 'txPr', 'crossAx', 'crosses', 'crossesAt')
- def __init__(self,
- axId=None,
- scaling=None,
- delete=None,
- axPos='l',
- majorGridlines=None,
- minorGridlines=None,
- title=None,
- numFmt=None,
- majorTickMark=None,
- minorTickMark=None,
- tickLblPos=None,
- spPr=None,
- txPr= None,
- crossAx=None,
- crosses=None,
- crossesAt=None,
- ):
- self.axId = axId
- if scaling is None:
- scaling = Scaling()
- self.scaling = scaling
- self.delete = delete
- self.axPos = axPos
- self.majorGridlines = majorGridlines
- self.minorGridlines = minorGridlines
- self.title = title
- self.numFmt = numFmt
- self.majorTickMark = majorTickMark
- self.minorTickMark = minorTickMark
- self.tickLblPos = tickLblPos
- self.spPr = spPr
- self.txPr = txPr
- self.crossAx = crossAx
- self.crosses = crosses
- self.crossesAt = None
- class DisplayUnitsLabel(Serialisable):
- tagname = "dispUnitsLbl"
- layout = Typed(expected_type=Layout, allow_none=True)
- tx = Typed(expected_type=Text, allow_none=True)
- text = Alias("tx")
- spPr = Typed(expected_type=GraphicalProperties, allow_none=True)
- graphicalProperties = Alias("spPr")
- txPr = Typed(expected_type=RichText, allow_none=True)
- textPropertes = Alias("txPr")
- __elements__ = ('layout', 'tx', 'spPr', 'txPr')
- def __init__(self,
- layout=None,
- tx=None,
- spPr=None,
- txPr=None,
- ):
- self.layout = layout
- self.tx = tx
- self.spPr = spPr
- self.txPr = txPr
- class DisplayUnitsLabelList(Serialisable):
- tagname = "dispUnits"
- custUnit = NestedFloat(allow_none=True)
- builtInUnit = NestedNoneSet(values=(['hundreds', 'thousands',
- 'tenThousands', 'hundredThousands', 'millions', 'tenMillions',
- 'hundredMillions', 'billions', 'trillions']))
- dispUnitsLbl = Typed(expected_type=DisplayUnitsLabel, allow_none=True)
- extLst = Typed(expected_type=ExtensionList, allow_none=True)
- __elements__ = ('custUnit', 'builtInUnit', 'dispUnitsLbl',)
- def __init__(self,
- custUnit=None,
- builtInUnit=None,
- dispUnitsLbl=None,
- extLst=None,
- ):
- self.custUnit = custUnit
- self.builtInUnit = builtInUnit
- self.dispUnitsLbl = dispUnitsLbl
- class NumericAxis(_BaseAxis):
- tagname = "valAx"
- axId = _BaseAxis.axId
- scaling = _BaseAxis.scaling
- delete = _BaseAxis.delete
- axPos = _BaseAxis.axPos
- majorGridlines = _BaseAxis.majorGridlines
- minorGridlines = _BaseAxis.minorGridlines
- title = _BaseAxis.title
- numFmt = _BaseAxis.numFmt
- majorTickMark = _BaseAxis.majorTickMark
- minorTickMark = _BaseAxis.minorTickMark
- tickLblPos = _BaseAxis.tickLblPos
- spPr = _BaseAxis.spPr
- txPr = _BaseAxis.txPr
- crossAx = _BaseAxis.crossAx
- crosses = _BaseAxis.crosses
- crossesAt = _BaseAxis.crossesAt
- crossBetween = NestedNoneSet(values=(['between', 'midCat']))
- majorUnit = NestedFloat(allow_none=True)
- minorUnit = NestedFloat(allow_none=True)
- dispUnits = Typed(expected_type=DisplayUnitsLabelList, allow_none=True)
- extLst = Typed(expected_type=ExtensionList, allow_none=True)
- __elements__ = _BaseAxis.__elements__ + ('crossBetween', 'majorUnit',
- 'minorUnit', 'dispUnits',)
- def __init__(self,
- crossBetween=None,
- majorUnit=None,
- minorUnit=None,
- dispUnits=None,
- extLst=None,
- **kw
- ):
- self.crossBetween = crossBetween
- self.majorUnit = majorUnit
- self.minorUnit = minorUnit
- self.dispUnits = dispUnits
- kw.setdefault('majorGridlines', ChartLines())
- kw.setdefault('axId', 100)
- kw.setdefault('crossAx', 10)
- super(NumericAxis, self).__init__(**kw)
- @classmethod
- def from_tree(cls, node):
- """
- Special case value axes with no gridlines
- """
- self = super(NumericAxis, cls).from_tree(node)
- gridlines = node.find("{%s}majorGridlines" % CHART_NS)
- if gridlines is None:
- self.majorGridlines = None
- return self
- class TextAxis(_BaseAxis):
- tagname = "catAx"
- axId = _BaseAxis.axId
- scaling = _BaseAxis.scaling
- delete = _BaseAxis.delete
- axPos = _BaseAxis.axPos
- majorGridlines = _BaseAxis.majorGridlines
- minorGridlines = _BaseAxis.minorGridlines
- title = _BaseAxis.title
- numFmt = _BaseAxis.numFmt
- majorTickMark = _BaseAxis.majorTickMark
- minorTickMark = _BaseAxis.minorTickMark
- tickLblPos = _BaseAxis.tickLblPos
- spPr = _BaseAxis.spPr
- txPr = _BaseAxis.txPr
- crossAx = _BaseAxis.crossAx
- crosses = _BaseAxis.crosses
- crossesAt = _BaseAxis.crossesAt
- auto = NestedBool(allow_none=True)
- lblAlgn = NestedNoneSet(values=(['ctr', 'l', 'r']))
- lblOffset = NestedMinMax(min=0, max=1000)
- tickLblSkip = NestedInteger(allow_none=True)
- tickMarkSkip = NestedInteger(allow_none=True)
- noMultiLvlLbl = NestedBool(allow_none=True)
- extLst = Typed(expected_type=ExtensionList, allow_none=True)
- __elements__ = _BaseAxis.__elements__ + ('auto', 'lblAlgn', 'lblOffset',
- 'tickLblSkip', 'tickMarkSkip', 'noMultiLvlLbl')
- def __init__(self,
- auto=None,
- lblAlgn=None,
- lblOffset=100,
- tickLblSkip=None,
- tickMarkSkip=None,
- noMultiLvlLbl=None,
- extLst=None,
- **kw
- ):
- self.auto = auto
- self.lblAlgn = lblAlgn
- self.lblOffset = lblOffset
- self.tickLblSkip = tickLblSkip
- self.tickMarkSkip = tickMarkSkip
- self.noMultiLvlLbl = noMultiLvlLbl
- kw.setdefault('axId', 10)
- kw.setdefault('crossAx', 100)
- super(TextAxis, self).__init__(**kw)
- class DateAxis(TextAxis):
- tagname = "dateAx"
- axId = _BaseAxis.axId
- scaling = _BaseAxis.scaling
- delete = _BaseAxis.delete
- axPos = _BaseAxis.axPos
- majorGridlines = _BaseAxis.majorGridlines
- minorGridlines = _BaseAxis.minorGridlines
- title = _BaseAxis.title
- numFmt = _BaseAxis.numFmt
- majorTickMark = _BaseAxis.majorTickMark
- minorTickMark = _BaseAxis.minorTickMark
- tickLblPos = _BaseAxis.tickLblPos
- spPr = _BaseAxis.spPr
- txPr = _BaseAxis.txPr
- crossAx = _BaseAxis.crossAx
- crosses = _BaseAxis.crosses
- crossesAt = _BaseAxis.crossesAt
- auto = NestedBool(allow_none=True)
- lblOffset = NestedInteger(allow_none=True)
- baseTimeUnit = NestedNoneSet(values=(['days', 'months', 'years']))
- majorUnit = NestedFloat(allow_none=True)
- majorTimeUnit = NestedNoneSet(values=(['days', 'months', 'years']))
- minorUnit = NestedFloat(allow_none=True)
- minorTimeUnit = NestedNoneSet(values=(['days', 'months', 'years']))
- extLst = Typed(expected_type=ExtensionList, allow_none=True)
- __elements__ = _BaseAxis.__elements__ + ('auto', 'lblOffset',
- 'baseTimeUnit', 'majorUnit', 'majorTimeUnit', 'minorUnit',
- 'minorTimeUnit')
- def __init__(self,
- auto=None,
- lblOffset=None,
- baseTimeUnit=None,
- majorUnit=None,
- majorTimeUnit=None,
- minorUnit=None,
- minorTimeUnit=None,
- extLst=None,
- **kw
- ):
- self.auto = auto
- self.lblOffset = lblOffset
- self.baseTimeUnit = baseTimeUnit
- self.majorUnit = majorUnit
- self.majorTimeUnit = majorTimeUnit
- self.minorUnit = minorUnit
- self.minorTimeUnit = minorTimeUnit
- kw.setdefault('axId', 500)
- kw.setdefault('lblOffset', lblOffset)
- super(DateAxis, self).__init__(**kw)
- class SeriesAxis(_BaseAxis):
- tagname = "serAx"
- axId = _BaseAxis.axId
- scaling = _BaseAxis.scaling
- delete = _BaseAxis.delete
- axPos = _BaseAxis.axPos
- majorGridlines = _BaseAxis.majorGridlines
- minorGridlines = _BaseAxis.minorGridlines
- title = _BaseAxis.title
- numFmt = _BaseAxis.numFmt
- majorTickMark = _BaseAxis.majorTickMark
- minorTickMark = _BaseAxis.minorTickMark
- tickLblPos = _BaseAxis.tickLblPos
- spPr = _BaseAxis.spPr
- txPr = _BaseAxis.txPr
- crossAx = _BaseAxis.crossAx
- crosses = _BaseAxis.crosses
- crossesAt = _BaseAxis.crossesAt
- tickLblSkip = NestedInteger(allow_none=True)
- tickMarkSkip = NestedInteger(allow_none=True)
- extLst = Typed(expected_type=ExtensionList, allow_none=True)
- __elements__ = _BaseAxis.__elements__ + ('tickLblSkip', 'tickMarkSkip')
- def __init__(self,
- tickLblSkip=None,
- tickMarkSkip=None,
- extLst=None,
- **kw
- ):
- self.tickLblSkip = tickLblSkip
- self.tickMarkSkip = tickMarkSkip
- kw.setdefault('axId', 1000)
- kw.setdefault('crossAx', 10)
- super(SeriesAxis, self).__init__(**kw)
|