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

1# Copyright (c) 2010-2022 openpyxl 

2 

3import re 

4import warnings 

5 

6from openpyxl.worksheet.header_footer import HeaderFooter 

7 

8""" 

9Base class for worksheets, chartsheets, etc. that can be added to workbooks 

10""" 

11 

12INVALID_TITLE_REGEX = re.compile(r'[\\*?:/\[\]]') 

13 

14 

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 

35 

36 

37class _WorkbookChild(object): 

38 

39 __title = "" 

40 _id = None 

41 _path = "{0}" 

42 _parent = None 

43 _default_title = "Sheet" 

44 

45 def __init__(self, parent=None, title=None): 

46 self._parent = parent 

47 self.title = title or self._default_title 

48 self.HeaderFooter = HeaderFooter() 

49 

50 

51 def __repr__(self): 

52 return '<{0} "{1}">'.format(self.__class__.__name__, self.title) 

53 

54 

55 @property 

56 def parent(self): 

57 return self._parent 

58 

59 

60 @property 

61 def encoding(self): 

62 return self._parent.encoding 

63 

64 

65 @property 

66 def title(self): 

67 return self.__title 

68 

69 

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 

79 

80 if not value: 

81 raise ValueError("Title must have at least one character") 

82 

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") 

89 

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) 

94 

95 if self.title is not None and self.title != value: 

96 value = avoid_duplicate_name(self.parent.sheetnames, value) 

97 

98 if len(value) > 31: 

99 warnings.warn("Title is more than 31 characters. Some applications may not be able to read the file") 

100 

101 self.__title = value 

102 

103 

104 @property 

105 def oddHeader(self): 

106 return self.HeaderFooter.oddHeader 

107 

108 

109 @oddHeader.setter 

110 def oddHeader(self, value): 

111 self.HeaderFooter.oddHeader = value 

112 

113 

114 @property 

115 def oddFooter(self): 

116 return self.HeaderFooter.oddFooter 

117 

118 

119 @oddFooter.setter 

120 def oddFooter(self, value): 

121 self.HeaderFooter.oddFooter = value 

122 

123 

124 @property 

125 def evenHeader(self): 

126 return self.HeaderFooter.evenHeader 

127 

128 

129 @evenHeader.setter 

130 def evenHeader(self, value): 

131 self.HeaderFooter.evenHeader = value 

132 

133 

134 @property 

135 def evenFooter(self): 

136 return self.HeaderFooter.evenFooter 

137 

138 

139 @evenFooter.setter 

140 def evenFooter(self, value): 

141 self.HeaderFooter.evenFooter = value 

142 

143 

144 @property 

145 def firstHeader(self): 

146 return self.HeaderFooter.firstHeader 

147 

148 

149 @firstHeader.setter 

150 def firstHeader(self, value): 

151 self.HeaderFooter.firstHeader = value 

152 

153 

154 @property 

155 def firstFooter(self): 

156 return self.HeaderFooter.firstFooter 

157 

158 

159 @firstFooter.setter 

160 def firstFooter(self, value): 

161 self.HeaderFooter.firstFooter = value 

162 

163 

164 @property 

165 def path(self): 

166 return self._path.format(self._id)