Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/openpyxl/cell/_writer.py: 40%

110 statements  

« prev     ^ index     » next       coverage.py v7.3.3, created at 2023-12-20 06:34 +0000

1# Copyright (c) 2010-2023 openpyxl 

2 

3from openpyxl.compat import safe_string 

4from openpyxl.xml.functions import Element, SubElement, whitespace, XML_NS, REL_NS 

5from openpyxl import LXML 

6from openpyxl.utils.datetime import to_excel, to_ISO8601 

7from datetime import timedelta 

8 

9from openpyxl.worksheet.formula import DataTableFormula, ArrayFormula 

10from openpyxl.cell.rich_text import TextBlock 

11 

12def _set_attributes(cell, styled=None): 

13 """ 

14 Set coordinate and datatype 

15 """ 

16 coordinate = cell.coordinate 

17 attrs = {'r': coordinate} 

18 if styled: 

19 attrs['s'] = f"{cell.style_id}" 

20 

21 if cell.data_type == "s": 

22 attrs['t'] = "inlineStr" 

23 elif cell.data_type != 'f': 

24 attrs['t'] = cell.data_type 

25 

26 value = cell._value 

27 

28 if cell.data_type == "d": 

29 if hasattr(value, "tzinfo") and value.tzinfo is not None: 

30 raise TypeError("Excel does not support timezones in datetimes. " 

31 "The tzinfo in the datetime/time object must be set to None.") 

32 

33 if cell.parent.parent.iso_dates and not isinstance(value, timedelta): 

34 value = to_ISO8601(value) 

35 else: 

36 attrs['t'] = "n" 

37 value = to_excel(value, cell.parent.parent.epoch) 

38 

39 if cell.hyperlink: 

40 cell.parent._hyperlinks.append(cell.hyperlink) 

41 

42 return value, attrs 

43 

44 

45def etree_write_cell(xf, worksheet, cell, styled=None): 

46 

47 value, attributes = _set_attributes(cell, styled) 

48 

49 el = Element("c", attributes) 

50 if value is None or value == "": 

51 xf.write(el) 

52 return 

53 

54 if cell.data_type == 'f': 

55 attrib = {} 

56 

57 if isinstance(value, ArrayFormula): 

58 attrib = dict(value) 

59 value = value.text 

60 

61 elif isinstance(value, DataTableFormula): 

62 attrib = dict(value) 

63 value = None 

64 

65 formula = SubElement(el, 'f', attrib) 

66 if value is not None and not attrib.get('t') == "dataTable": 

67 formula.text = value[1:] 

68 value = None 

69 

70 if cell.data_type == 's': 

71 inline_string = SubElement(el, 'is') 

72 if isinstance(value, str): 

73 text = SubElement(inline_string, 't') 

74 text.text = value 

75 whitespace(text) 

76 else: 

77 for r in value: 

78 se = SubElement(inline_string, 'r') 

79 if isinstance(r, TextBlock): 

80 se2 = SubElement(se, 'rPr') 

81 se2.append(r.font.to_tree()) 

82 text = r.name 

83 else: 

84 text = r 

85 text = SubElement(se, 't') 

86 text.text = text 

87 whitespace(text) 

88 

89 

90 

91 else: 

92 cell_content = SubElement(el, 'v') 

93 if value is not None: 

94 cell_content.text = safe_string(value) 

95 

96 xf.write(el) 

97 

98 

99def lxml_write_cell(xf, worksheet, cell, styled=False): 

100 value, attributes = _set_attributes(cell, styled) 

101 

102 if value == '' or value is None: 

103 with xf.element("c", attributes): 

104 return 

105 

106 with xf.element('c', attributes): 

107 if cell.data_type == 'f': 

108 attrib = {} 

109 

110 if isinstance(value, ArrayFormula): 

111 attrib = dict(value) 

112 value = value.text 

113 

114 elif isinstance(value, DataTableFormula): 

115 attrib = dict(value) 

116 value = None 

117 

118 with xf.element('f', attrib): 

119 if value is not None and not attrib.get('t') == "dataTable": 

120 xf.write(value[1:]) 

121 value = None 

122 

123 if cell.data_type == 's': 

124 with xf.element("is"): 

125 if isinstance(value, str): 

126 attrs = {} 

127 if value != value.strip(): 

128 attrs["{%s}space" % XML_NS] = "preserve" 

129 el = Element("t", attrs) # lxml can't handle xml-ns 

130 el.text = value 

131 xf.write(el) 

132 #with xf.element("t", attrs): 

133 #xf.write(value) 

134 else: 

135 for r in value: 

136 with xf.element("r"): 

137 if isinstance(r, TextBlock): 

138 xf.write(r.font.to_tree(tagname='rPr')) 

139 value = r.text 

140 else: 

141 value = r 

142 attrs = {} 

143 if value != value.strip(): 

144 attrs["{%s}space" % XML_NS] = "preserve" 

145 el = Element("t", attrs) # lxml can't handle xml-ns 

146 el.text = value 

147 xf.write(el) 

148 

149 else: 

150 with xf.element("v"): 

151 if value is not None: 

152 xf.write(safe_string(value)) 

153 

154 

155if LXML: 

156 write_cell = lxml_write_cell 

157else: 

158 write_cell = etree_write_cell