Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/openpyxl/workbook/child.py: 40%
98 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1# Copyright (c) 2010-2022 openpyxl
3import re
4import warnings
6from openpyxl.worksheet.header_footer import HeaderFooter
8"""
9Base class for worksheets, chartsheets, etc. that can be added to workbooks
10"""
12INVALID_TITLE_REGEX = re.compile(r'[\\*?:/\[\]]')
15def avoid_duplicate_name(names, value):
16 """
17 Naive check to see whether name already exists.
18 If name does exist suggest a name using an incrementer
19 Duplicates are case insensitive
20 """
21 # Check for an absolute match in which case we need to find an alternative
22 match = [n for n in names if n.lower() == value.lower()]
23 if match:
24 names = u",".join(names)
25 sheet_title_regex = re.compile(f'(?P<title>{re.escape(value)})(?P<count>\\d*),?', re.I)
26 matches = sheet_title_regex.findall(names)
27 if matches:
28 # use name, but append with the next highest integer
29 counts = [int(idx) for (t, idx) in matches if idx.isdigit()]
30 highest = 0
31 if counts:
32 highest = max(counts)
33 value = u"{0}{1}".format(value, highest + 1)
34 return value
37class _WorkbookChild(object):
39 __title = ""
40 _id = None
41 _path = "{0}"
42 _parent = None
43 _default_title = "Sheet"
45 def __init__(self, parent=None, title=None):
46 self._parent = parent
47 self.title = title or self._default_title
48 self.HeaderFooter = HeaderFooter()
51 def __repr__(self):
52 return '<{0} "{1}">'.format(self.__class__.__name__, self.title)
55 @property
56 def parent(self):
57 return self._parent
60 @property
61 def encoding(self):
62 return self._parent.encoding
65 @property
66 def title(self):
67 return self.__title
70 @title.setter
71 def title(self, value):
72 """
73 Set a sheet title, ensuring it is valid.
74 Limited to 31 characters, no special characters.
75 Duplicate titles will be incremented numerically
76 """
77 if not self._parent:
78 return
80 if not value:
81 raise ValueError("Title must have at least one character")
83 if hasattr(value, "decode"):
84 if not isinstance(value, str):
85 try:
86 value = value.decode("ascii")
87 except UnicodeDecodeError:
88 raise ValueError("Worksheet titles must be str")
90 m = INVALID_TITLE_REGEX.search(value)
91 if m:
92 msg = "Invalid character {0} found in sheet title".format(m.group(0))
93 raise ValueError(msg)
95 if self.title is not None and self.title != value:
96 value = avoid_duplicate_name(self.parent.sheetnames, value)
98 if len(value) > 31:
99 warnings.warn("Title is more than 31 characters. Some applications may not be able to read the file")
101 self.__title = value
104 @property
105 def oddHeader(self):
106 return self.HeaderFooter.oddHeader
109 @oddHeader.setter
110 def oddHeader(self, value):
111 self.HeaderFooter.oddHeader = value
114 @property
115 def oddFooter(self):
116 return self.HeaderFooter.oddFooter
119 @oddFooter.setter
120 def oddFooter(self, value):
121 self.HeaderFooter.oddFooter = value
124 @property
125 def evenHeader(self):
126 return self.HeaderFooter.evenHeader
129 @evenHeader.setter
130 def evenHeader(self, value):
131 self.HeaderFooter.evenHeader = value
134 @property
135 def evenFooter(self):
136 return self.HeaderFooter.evenFooter
139 @evenFooter.setter
140 def evenFooter(self, value):
141 self.HeaderFooter.evenFooter = value
144 @property
145 def firstHeader(self):
146 return self.HeaderFooter.firstHeader
149 @firstHeader.setter
150 def firstHeader(self, value):
151 self.HeaderFooter.firstHeader = value
154 @property
155 def firstFooter(self):
156 return self.HeaderFooter.firstFooter
159 @firstFooter.setter
160 def firstFooter(self, value):
161 self.HeaderFooter.firstFooter = value
164 @property
165 def path(self):
166 return self._path.format(self._id)