diff options
Diffstat (limited to '.venv/lib/python3.12/site-packages/openpyxl/worksheet/dimensions.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/openpyxl/worksheet/dimensions.py | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/openpyxl/worksheet/dimensions.py b/.venv/lib/python3.12/site-packages/openpyxl/worksheet/dimensions.py new file mode 100644 index 00000000..482717a1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/openpyxl/worksheet/dimensions.py @@ -0,0 +1,306 @@ +# Copyright (c) 2010-2024 openpyxl + +from copy import copy + +from openpyxl.compat import safe_string +from openpyxl.utils import ( + get_column_letter, + get_column_interval, + column_index_from_string, + range_boundaries, +) +from openpyxl.utils.units import DEFAULT_COLUMN_WIDTH +from openpyxl.descriptors import ( + Integer, + Float, + Bool, + Strict, + String, + Alias, +) +from openpyxl.descriptors.serialisable import Serialisable +from openpyxl.styles.styleable import StyleableObject +from openpyxl.utils.bound_dictionary import BoundDictionary +from openpyxl.xml.functions import Element + + +class Dimension(Strict, StyleableObject): + """Information about the display properties of a row or column.""" + __fields__ = ('hidden', + 'outlineLevel', + 'collapsed',) + + index = Integer() + hidden = Bool() + outlineLevel = Integer(allow_none=True) + outline_level = Alias('outlineLevel') + collapsed = Bool() + style = Alias('style_id') + + + def __init__(self, index, hidden, outlineLevel, + collapsed, worksheet, visible=True, style=None): + super().__init__(sheet=worksheet, style_array=style) + self.index = index + self.hidden = hidden + self.outlineLevel = outlineLevel + self.collapsed = collapsed + + + def __iter__(self): + for key in self.__fields__: + value = getattr(self, key, None) + if value: + yield key, safe_string(value) + + + def __copy__(self): + cp = self.__new__(self.__class__) + attrib = self.__dict__ + attrib['worksheet'] = self.parent + cp.__init__(**attrib) + cp._style = copy(self._style) + return cp + + + def __repr__(self): + return f"<{self.__class__.__name__} Instance, Attributes={dict(self)}>" + + +class RowDimension(Dimension): + """Information about the display properties of a row.""" + + __fields__ = Dimension.__fields__ + ('ht', 'customFormat', 'customHeight', 's', + 'thickBot', 'thickTop') + r = Alias('index') + s = Alias('style_id') + ht = Float(allow_none=True) + height = Alias('ht') + thickBot = Bool() + thickTop = Bool() + + def __init__(self, + worksheet, + index=0, + ht=None, + customHeight=None, # do not write + s=None, + customFormat=None, # do not write + hidden=False, + outlineLevel=0, + outline_level=None, + collapsed=False, + visible=None, + height=None, + r=None, + spans=None, + thickBot=None, + thickTop=None, + **kw + ): + if r is not None: + index = r + if height is not None: + ht = height + self.ht = ht + if visible is not None: + hidden = not visible + if outline_level is not None: + outlineLevel = outline_level + self.thickBot = thickBot + self.thickTop = thickTop + super().__init__(index, hidden, outlineLevel, + collapsed, worksheet, style=s) + + @property + def customFormat(self): + """Always true if there is a style for the row""" + return self.has_style + + @property + def customHeight(self): + """Always true if there is a height for the row""" + return self.ht is not None + + +class ColumnDimension(Dimension): + """Information about the display properties of a column.""" + + width = Float() + bestFit = Bool() + auto_size = Alias('bestFit') + index = String() + min = Integer(allow_none=True) + max = Integer(allow_none=True) + collapsed = Bool() + + __fields__ = Dimension.__fields__ + ('width', 'bestFit', 'customWidth', 'style', + 'min', 'max') + + def __init__(self, + worksheet, + index='A', + width=DEFAULT_COLUMN_WIDTH, + bestFit=False, + hidden=False, + outlineLevel=0, + outline_level=None, + collapsed=False, + style=None, + min=None, + max=None, + customWidth=False, # do not write + visible=None, + auto_size=None,): + self.width = width + self.min = min + self.max = max + if visible is not None: + hidden = not visible + if auto_size is not None: + bestFit = auto_size + self.bestFit = bestFit + if outline_level is not None: + outlineLevel = outline_level + self.collapsed = collapsed + super().__init__(index, hidden, outlineLevel, + collapsed, worksheet, style=style) + + + @property + def customWidth(self): + """Always true if there is a width for the column""" + return bool(self.width) + + + def reindex(self): + """ + Set boundaries for column definition + """ + if not all([self.min, self.max]): + self.min = self.max = column_index_from_string(self.index) + + @property + def range(self): + """Return the range of cells actually covered""" + return f"{get_column_letter(self.min)}:{get_column_letter(self.max)}" + + + def to_tree(self): + attrs = dict(self) + if attrs.keys() != {'min', 'max'}: + return Element("col", **attrs) + + +class DimensionHolder(BoundDictionary): + """ + Allow columns to be grouped + """ + + def __init__(self, worksheet, reference="index", default_factory=None): + self.worksheet = worksheet + self.max_outline = None + self.default_factory = default_factory + super().__init__(reference, default_factory) + + + def group(self, start, end=None, outline_level=1, hidden=False): + """allow grouping a range of consecutive rows or columns together + + :param start: first row or column to be grouped (mandatory) + :param end: last row or column to be grouped (optional, default to start) + :param outline_level: outline level + :param hidden: should the group be hidden on workbook open or not + """ + if end is None: + end = start + + if isinstance(self.default_factory(), ColumnDimension): + new_dim = self[start] + new_dim.outline_level = outline_level + new_dim.hidden = hidden + work_sequence = get_column_interval(start, end)[1:] + for column_letter in work_sequence: + if column_letter in self: + del self[column_letter] + new_dim.min, new_dim.max = map(column_index_from_string, (start, end)) + elif isinstance(self.default_factory(), RowDimension): + for el in range(start, end + 1): + new_dim = self.worksheet.row_dimensions[el] + new_dim.outline_level = outline_level + new_dim.hidden = hidden + + + def to_tree(self): + + def sorter(value): + value.reindex() + return value.min + + el = Element('cols') + outlines = set() + + for col in sorted(self.values(), key=sorter): + obj = col.to_tree() + if obj is not None: + outlines.add(col.outlineLevel) + el.append(obj) + + if outlines: + self.max_outline = max(outlines) + + if len(el): + return el # must have at least one child + + +class SheetFormatProperties(Serialisable): + + tagname = "sheetFormatPr" + + baseColWidth = Integer(allow_none=True) + defaultColWidth = Float(allow_none=True) + defaultRowHeight = Float() + customHeight = Bool(allow_none=True) + zeroHeight = Bool(allow_none=True) + thickTop = Bool(allow_none=True) + thickBottom = Bool(allow_none=True) + outlineLevelRow = Integer(allow_none=True) + outlineLevelCol = Integer(allow_none=True) + + def __init__(self, + baseColWidth=8, #according to spec + defaultColWidth=None, + defaultRowHeight=15, + customHeight=None, + zeroHeight=None, + thickTop=None, + thickBottom=None, + outlineLevelRow=None, + outlineLevelCol=None, + ): + self.baseColWidth = baseColWidth + self.defaultColWidth = defaultColWidth + self.defaultRowHeight = defaultRowHeight + self.customHeight = customHeight + self.zeroHeight = zeroHeight + self.thickTop = thickTop + self.thickBottom = thickBottom + self.outlineLevelRow = outlineLevelRow + self.outlineLevelCol = outlineLevelCol + + +class SheetDimension(Serialisable): + + tagname = "dimension" + + ref = String() + + def __init__(self, + ref=None, + ): + self.ref = ref + + + @property + def boundaries(self): + return range_boundaries(self.ref) |