Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/openpyxl/styles/numbers.py: 62%
102 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
5from openpyxl.descriptors import (
6 String,
7 Sequence,
8 Integer,
9)
10from openpyxl.descriptors.serialisable import Serialisable
13BUILTIN_FORMATS = {
14 0: 'General',
15 1: '0',
16 2: '0.00',
17 3: '#,##0',
18 4: '#,##0.00',
19 5: '"$"#,##0_);("$"#,##0)',
20 6: '"$"#,##0_);[Red]("$"#,##0)',
21 7: '"$"#,##0.00_);("$"#,##0.00)',
22 8: '"$"#,##0.00_);[Red]("$"#,##0.00)',
23 9: '0%',
24 10: '0.00%',
25 11: '0.00E+00',
26 12: '# ?/?',
27 13: '# ??/??',
28 14: 'mm-dd-yy',
29 15: 'd-mmm-yy',
30 16: 'd-mmm',
31 17: 'mmm-yy',
32 18: 'h:mm AM/PM',
33 19: 'h:mm:ss AM/PM',
34 20: 'h:mm',
35 21: 'h:mm:ss',
36 22: 'm/d/yy h:mm',
38 37: '#,##0_);(#,##0)',
39 38: '#,##0_);[Red](#,##0)',
40 39: '#,##0.00_);(#,##0.00)',
41 40: '#,##0.00_);[Red](#,##0.00)',
43 41: r'_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)',
44 42: r'_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)',
45 43: r'_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)',
47 44: r'_("$"* #,##0.00_)_("$"* \(#,##0.00\)_("$"* "-"??_)_(@_)',
48 45: 'mm:ss',
49 46: '[h]:mm:ss',
50 47: 'mmss.0',
51 48: '##0.0E+0',
52 49: '@', }
54BUILTIN_FORMATS_MAX_SIZE = 164
55BUILTIN_FORMATS_REVERSE = dict(
56 [(value, key) for key, value in BUILTIN_FORMATS.items()])
58FORMAT_GENERAL = BUILTIN_FORMATS[0]
59FORMAT_TEXT = BUILTIN_FORMATS[49]
60FORMAT_NUMBER = BUILTIN_FORMATS[1]
61FORMAT_NUMBER_00 = BUILTIN_FORMATS[2]
62FORMAT_NUMBER_COMMA_SEPARATED1 = BUILTIN_FORMATS[4]
63FORMAT_NUMBER_COMMA_SEPARATED2 = '#,##0.00_-'
64FORMAT_PERCENTAGE = BUILTIN_FORMATS[9]
65FORMAT_PERCENTAGE_00 = BUILTIN_FORMATS[10]
66FORMAT_DATE_YYYYMMDD2 = 'yyyy-mm-dd'
67FORMAT_DATE_YYMMDD = 'yy-mm-dd'
68FORMAT_DATE_DDMMYY = 'dd/mm/yy'
69FORMAT_DATE_DMYSLASH = 'd/m/y'
70FORMAT_DATE_DMYMINUS = 'd-m-y'
71FORMAT_DATE_DMMINUS = 'd-m'
72FORMAT_DATE_MYMINUS = 'm-y'
73FORMAT_DATE_XLSX14 = BUILTIN_FORMATS[14]
74FORMAT_DATE_XLSX15 = BUILTIN_FORMATS[15]
75FORMAT_DATE_XLSX16 = BUILTIN_FORMATS[16]
76FORMAT_DATE_XLSX17 = BUILTIN_FORMATS[17]
77FORMAT_DATE_XLSX22 = BUILTIN_FORMATS[22]
78FORMAT_DATE_DATETIME = 'yyyy-mm-dd h:mm:ss'
79FORMAT_DATE_TIME1 = BUILTIN_FORMATS[18]
80FORMAT_DATE_TIME2 = BUILTIN_FORMATS[19]
81FORMAT_DATE_TIME3 = BUILTIN_FORMATS[20]
82FORMAT_DATE_TIME4 = BUILTIN_FORMATS[21]
83FORMAT_DATE_TIME5 = BUILTIN_FORMATS[45]
84FORMAT_DATE_TIME6 = BUILTIN_FORMATS[21]
85FORMAT_DATE_TIME7 = 'i:s.S'
86FORMAT_DATE_TIME8 = 'h:mm:ss@'
87FORMAT_DATE_TIMEDELTA = '[hh]:mm:ss'
88FORMAT_DATE_YYMMDDSLASH = 'yy/mm/dd@'
89FORMAT_CURRENCY_USD_SIMPLE = '"$"#,##0.00_-'
90FORMAT_CURRENCY_USD = '$#,##0_-'
91FORMAT_CURRENCY_EUR_SIMPLE = '[$EUR ]#,##0.00_-'
94COLORS = r"\[(BLACK|BLUE|CYAN|GREEN|MAGENTA|RED|WHITE|YELLOW)\]"
95LITERAL_GROUP = r'".*?"' # anything in quotes
96LOCALE_GROUP = r'\[(?!hh?\]|mm?\]|ss?\])[^\]]*\]' # anything in square brackets, except hours or minutes or seconds
97STRIP_RE = re.compile(f"{LITERAL_GROUP}|{LOCALE_GROUP}")
98TIMEDELTA_RE = re.compile(r'\[hh?\](:mm(:ss(\.0*)?)?)?|\[mm?\](:ss(\.0*)?)?|\[ss?\](\.0*)?', re.I)
101# Spec 18.8.31 numFmts
102# +ve;-ve;zero;text
104def is_date_format(fmt):
105 if fmt is None:
106 return False
107 fmt = fmt.split(";")[0] # only look at the first format
108 fmt = STRIP_RE.sub("", fmt) # ignore some formats
109 return re.search(r"[^\\][dmhysDMHYS]", fmt) is not None
112def is_timedelta_format(fmt):
113 if fmt is None:
114 return False
115 fmt = fmt.split(";")[0] # only look at the first format
116 return TIMEDELTA_RE.search(fmt) is not None
119def is_datetime(fmt):
120 """
121 Return date, time or datetime
122 """
123 if not is_date_format(fmt):
124 return
126 DATE = TIME = False
128 if any((x in fmt for x in 'dy')):
129 DATE = True
130 if any((x in fmt for x in 'hs')):
131 TIME = True
133 if DATE and TIME:
134 return "datetime"
135 if DATE:
136 return "date"
137 return "time"
140def is_builtin(fmt):
141 return fmt in BUILTIN_FORMATS.values()
144def builtin_format_code(index):
145 """Return one of the standard format codes by index."""
146 try:
147 fmt = BUILTIN_FORMATS[index]
148 except KeyError:
149 fmt = None
150 return fmt
153def builtin_format_id(fmt):
154 """Return the id of a standard style."""
155 return BUILTIN_FORMATS_REVERSE.get(fmt)
158class NumberFormatDescriptor(String):
160 def __set__(self, instance, value):
161 if value is None:
162 value = FORMAT_GENERAL
163 super(NumberFormatDescriptor, self).__set__(instance, value)
166class NumberFormat(Serialisable):
168 numFmtId = Integer()
169 formatCode = String()
171 def __init__(self,
172 numFmtId=None,
173 formatCode=None,
174 ):
175 self.numFmtId = numFmtId
176 self.formatCode = formatCode
179class NumberFormatList(Serialisable):
181 count = Integer(allow_none=True)
182 numFmt = Sequence(expected_type=NumberFormat)
184 __elements__ = ('numFmt',)
185 __attrs__ = ("count",)
187 def __init__(self,
188 count=None,
189 numFmt=(),
190 ):
191 self.numFmt = numFmt
194 @property
195 def count(self):
196 return len(self.numFmt)
199 def __getitem__(self, idx):
200 return self.numFmt[idx]