aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/openpyxl/workbook/child.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/openpyxl/workbook/child.py')
-rw-r--r--.venv/lib/python3.12/site-packages/openpyxl/workbook/child.py166
1 files changed, 166 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/openpyxl/workbook/child.py b/.venv/lib/python3.12/site-packages/openpyxl/workbook/child.py
new file mode 100644
index 00000000..19dd29fb
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/openpyxl/workbook/child.py
@@ -0,0 +1,166 @@
+# Copyright (c) 2010-2024 openpyxl
+
+import re
+import warnings
+
+from openpyxl.worksheet.header_footer import HeaderFooter
+
+"""
+Base class for worksheets, chartsheets, etc. that can be added to workbooks
+"""
+
+INVALID_TITLE_REGEX = re.compile(r'[\\*?:/\[\]]')
+
+
+def avoid_duplicate_name(names, value):
+ """
+ Naive check to see whether name already exists.
+ If name does exist suggest a name using an incrementer
+ Duplicates are case insensitive
+ """
+ # Check for an absolute match in which case we need to find an alternative
+ match = [n for n in names if n.lower() == value.lower()]
+ if match:
+ names = u",".join(names)
+ sheet_title_regex = re.compile(f'(?P<title>{re.escape(value)})(?P<count>\\d*),?', re.I)
+ matches = sheet_title_regex.findall(names)
+ if matches:
+ # use name, but append with the next highest integer
+ counts = [int(idx) for (t, idx) in matches if idx.isdigit()]
+ highest = 0
+ if counts:
+ highest = max(counts)
+ value = u"{0}{1}".format(value, highest + 1)
+ return value
+
+
+class _WorkbookChild:
+
+ __title = ""
+ _id = None
+ _path = "{0}"
+ _parent = None
+ _default_title = "Sheet"
+
+ def __init__(self, parent=None, title=None):
+ self._parent = parent
+ self.title = title or self._default_title
+ self.HeaderFooter = HeaderFooter()
+
+
+ def __repr__(self):
+ return '<{0} "{1}">'.format(self.__class__.__name__, self.title)
+
+
+ @property
+ def parent(self):
+ return self._parent
+
+
+ @property
+ def encoding(self):
+ return self._parent.encoding
+
+
+ @property
+ def title(self):
+ return self.__title
+
+
+ @title.setter
+ def title(self, value):
+ """
+ Set a sheet title, ensuring it is valid.
+ Limited to 31 characters, no special characters.
+ Duplicate titles will be incremented numerically
+ """
+ if not self._parent:
+ return
+
+ if not value:
+ raise ValueError("Title must have at least one character")
+
+ if hasattr(value, "decode"):
+ if not isinstance(value, str):
+ try:
+ value = value.decode("ascii")
+ except UnicodeDecodeError:
+ raise ValueError("Worksheet titles must be str")
+
+ m = INVALID_TITLE_REGEX.search(value)
+ if m:
+ msg = "Invalid character {0} found in sheet title".format(m.group(0))
+ raise ValueError(msg)
+
+ if self.title is not None and self.title != value:
+ value = avoid_duplicate_name(self.parent.sheetnames, value)
+
+ if len(value) > 31:
+ warnings.warn("Title is more than 31 characters. Some applications may not be able to read the file")
+
+ self.__title = value
+
+
+ @property
+ def oddHeader(self):
+ return self.HeaderFooter.oddHeader
+
+
+ @oddHeader.setter
+ def oddHeader(self, value):
+ self.HeaderFooter.oddHeader = value
+
+
+ @property
+ def oddFooter(self):
+ return self.HeaderFooter.oddFooter
+
+
+ @oddFooter.setter
+ def oddFooter(self, value):
+ self.HeaderFooter.oddFooter = value
+
+
+ @property
+ def evenHeader(self):
+ return self.HeaderFooter.evenHeader
+
+
+ @evenHeader.setter
+ def evenHeader(self, value):
+ self.HeaderFooter.evenHeader = value
+
+
+ @property
+ def evenFooter(self):
+ return self.HeaderFooter.evenFooter
+
+
+ @evenFooter.setter
+ def evenFooter(self, value):
+ self.HeaderFooter.evenFooter = value
+
+
+ @property
+ def firstHeader(self):
+ return self.HeaderFooter.firstHeader
+
+
+ @firstHeader.setter
+ def firstHeader(self, value):
+ self.HeaderFooter.firstHeader = value
+
+
+ @property
+ def firstFooter(self):
+ return self.HeaderFooter.firstFooter
+
+
+ @firstFooter.setter
+ def firstFooter(self, value):
+ self.HeaderFooter.firstFooter = value
+
+
+ @property
+ def path(self):
+ return self._path.format(self._id)