about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/openpyxl/worksheet/dimensions.py
diff options
context:
space:
mode:
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.py306
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)