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
« prev ^ index » next coverage.py v7.3.3, created at 2023-12-20 06:34 +0000
1# Copyright (c) 2010-2023 openpyxl
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
9from openpyxl.worksheet.formula import DataTableFormula, ArrayFormula
10from openpyxl.cell.rich_text import TextBlock
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}"
21 if cell.data_type == "s":
22 attrs['t'] = "inlineStr"
23 elif cell.data_type != 'f':
24 attrs['t'] = cell.data_type
26 value = cell._value
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.")
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)
39 if cell.hyperlink:
40 cell.parent._hyperlinks.append(cell.hyperlink)
42 return value, attrs
45def etree_write_cell(xf, worksheet, cell, styled=None):
47 value, attributes = _set_attributes(cell, styled)
49 el = Element("c", attributes)
50 if value is None or value == "":
51 xf.write(el)
52 return
54 if cell.data_type == 'f':
55 attrib = {}
57 if isinstance(value, ArrayFormula):
58 attrib = dict(value)
59 value = value.text
61 elif isinstance(value, DataTableFormula):
62 attrib = dict(value)
63 value = None
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
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)
91 else:
92 cell_content = SubElement(el, 'v')
93 if value is not None:
94 cell_content.text = safe_string(value)
96 xf.write(el)
99def lxml_write_cell(xf, worksheet, cell, styled=False):
100 value, attributes = _set_attributes(cell, styled)
102 if value == '' or value is None:
103 with xf.element("c", attributes):
104 return
106 with xf.element('c', attributes):
107 if cell.data_type == 'f':
108 attrib = {}
110 if isinstance(value, ArrayFormula):
111 attrib = dict(value)
112 value = value.text
114 elif isinstance(value, DataTableFormula):
115 attrib = dict(value)
116 value = None
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
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)
149 else:
150 with xf.element("v"):
151 if value is not None:
152 xf.write(safe_string(value))
155if LXML:
156 write_cell = lxml_write_cell
157else:
158 write_cell = etree_write_cell