1# -*- coding: ascii -*-
2"""
3lots of Excel Magic Numbers
4"""
5
6# Boundaries BIFF8+
7
8MAX_ROW = 65536
9MAX_COL = 256
10
11
12biff_records = {
13    0x0000: "DIMENSIONS",
14    0x0001: "BLANK",
15    0x0002: "INTEGER",
16    0x0003: "NUMBER",
17    0x0004: "LABEL",
18    0x0005: "BOOLERR",
19    0x0006: "FORMULA",
20    0x0007: "STRING",
21    0x0008: "ROW",
22    0x0009: "BOF",
23    0x000A: "EOF",
24    0x000B: "INDEX",
25    0x000C: "CALCCOUNT",
26    0x000D: "CALCMODE",
27    0x000E: "PRECISION",
28    0x000F: "REFMODE",
29    0x0010: "DELTA",
30    0x0011: "ITERATION",
31    0x0012: "PROTECT",
32    0x0013: "PASSWORD",
33    0x0014: "HEADER",
34    0x0015: "FOOTER",
35    0x0016: "EXTERNCOUNT",
36    0x0017: "EXTERNSHEET",
37    0x0018: "NAME",
38    0x0019: "WINDOWPROTECT",
39    0x001A: "VERTICALPAGEBREAKS",
40    0x001B: "HORIZONTALPAGEBREAKS",
41    0x001C: "NOTE",
42    0x001D: "SELECTION",
43    0x001E: "FORMAT",
44    0x001F: "FORMATCOUNT",
45    0x0020: "COLUMNDEFAULT",
46    0x0021: "ARRAY",
47    0x0022: "1904",
48    0x0023: "EXTERNNAME",
49    0x0024: "COLWIDTH",
50    0x0025: "DEFAULTROWHEIGHT",
51    0x0026: "LEFTMARGIN",
52    0x0027: "RIGHTMARGIN",
53    0x0028: "TOPMARGIN",
54    0x0029: "BOTTOMMARGIN",
55    0x002A: "PRINTHEADERS",
56    0x002B: "PRINTGRIDLINES",
57    0x002F: "FILEPASS",
58    0x0031: "FONT",
59    0x0036: "TABLE",
60    0x003C: "CONTINUE",
61    0x003D: "WINDOW1",
62    0x003E: "WINDOW2",
63    0x0040: "BACKUP",
64    0x0041: "PANE",
65    0x0042: "CODEPAGE",
66    0x0043: "XF",
67    0x0044: "IXFE",
68    0x0045: "EFONT",
69    0x004D: "PLS",
70    0x0050: "DCON",
71    0x0051: "DCONREF",
72    0x0053: "DCONNAME",
73    0x0055: "DEFCOLWIDTH",
74    0x0056: "BUILTINFMTCNT",
75    0x0059: "XCT",
76    0x005A: "CRN",
77    0x005B: "FILESHARING",
78    0x005C: "WRITEACCESS",
79    0x005D: "OBJ",
80    0x005E: "UNCALCED",
81    0x005F: "SAFERECALC",
82    0x0060: "TEMPLATE",
83    0x0063: "OBJPROTECT",
84    0x007D: "COLINFO",
85    0x007E: "RK",
86    0x007F: "IMDATA",
87    0x0080: "GUTS",
88    0x0081: "WSBOOL",
89    0x0082: "GRIDSET",
90    0x0083: "HCENTER",
91    0x0084: "VCENTER",
92    0x0085: "BOUNDSHEET",
93    0x0086: "WRITEPROT",
94    0x0087: "ADDIN",
95    0x0088: "EDG",
96    0x0089: "PUB",
97    0x008C: "COUNTRY",
98    0x008D: "HIDEOBJ",
99    0x008E: "BUNDLESOFFSET",
100    0x008F: "BUNDLEHEADER",
101    0x0090: "SORT",
102    0x0091: "SUB",
103    0x0092: "PALETTE",
104    0x0093: "STYLE",
105    0x0094: "LHRECORD",
106    0x0095: "LHNGRAPH",
107    0x0096: "SOUND",
108    0x0098: "LPR",
109    0x0099: "STANDARDWIDTH",
110    0x009A: "FNGROUPNAME",
111    0x009B: "FILTERMODE",
112    0x009C: "FNGROUPCOUNT",
113    0x009D: "AUTOFILTERINFO",
114    0x009E: "AUTOFILTER",
115    0x00A0: "SCL",
116    0x00A1: "SETUP",
117    0x00A9: "COORDLIST",
118    0x00AB: "GCW",
119    0x00AE: "SCENMAN",
120    0x00AF: "SCENARIO",
121    0x00B0: "SXVIEW",
122    0x00B1: "SXVD",
123    0x00B2: "SXVI",
124    0x00B4: "SXIVD",
125    0x00B5: "SXLI",
126    0x00B6: "SXPI",
127    0x00B8: "DOCROUTE",
128    0x00B9: "RECIPNAME",
129    0x00BC: "SHRFMLA",
130    0x00BD: "MULRK",
131    0x00BE: "MULBLANK",
132    0x00C1: "MMS",
133    0x00C2: "ADDMENU",
134    0x00C3: "DELMENU",
135    0x00C5: "SXDI",
136    0x00C6: "SXDB",
137    0x00C7: "SXFIELD",
138    0x00C8: "SXINDEXLIST",
139    0x00C9: "SXDOUBLE",
140    0x00CD: "SXSTRING",
141    0x00CE: "SXDATETIME",
142    0x00D0: "SXTBL",
143    0x00D1: "SXTBRGITEM",
144    0x00D2: "SXTBPG",
145    0x00D3: "OBPROJ",
146    0x00D5: "SXIDSTM",
147    0x00D6: "RSTRING",
148    0x00D7: "DBCELL",
149    0x00DA: "BOOKBOOL",
150    0x00DC: "SXEXT|PARAMQRY",
151    0x00DD: "SCENPROTECT",
152    0x00DE: "OLESIZE",
153    0x00DF: "UDDESC",
154    0x00E0: "XF",
155    0x00E1: "INTERFACEHDR",
156    0x00E2: "INTERFACEEND",
157    0x00E3: "SXVS",
158    0x00E5: "MERGEDCELLS",
159    0x00E9: "BITMAP",
160    0x00EB: "MSODRAWINGGROUP",
161    0x00EC: "MSODRAWING",
162    0x00ED: "MSODRAWINGSELECTION",
163    0x00F0: "SXRULE",
164    0x00F1: "SXEX",
165    0x00F2: "SXFILT",
166    0x00F6: "SXNAME",
167    0x00F7: "SXSELECT",
168    0x00F8: "SXPAIR",
169    0x00F9: "SXFMLA",
170    0x00FB: "SXFORMAT",
171    0x00FC: "SST",
172    0x00FD: "LABELSST",
173    0x00FF: "EXTSST",
174    0x0100: "SXVDEX",
175    0x0103: "SXFORMULA",
176    0x0122: "SXDBEX",
177    0x0137: "CHTRINSERT",
178    0x0138: "CHTRINFO",
179    0x013B: "CHTRCELLCONTENT",
180    0x013D: "TABID",
181    0x0140: "CHTRMOVERANGE",
182    0x014D: "CHTRINSERTTAB",
183    0x015F: "LABELRANGES",
184    0x0160: "USESELFS",
185    0x0161: "DSF",
186    0x0162: "XL5MODIFY",
187    0x0196: "CHTRHEADER",
188    0x01A9: "USERBVIEW",
189    0x01AA: "USERSVIEWBEGIN",
190    0x01AB: "USERSVIEWEND",
191    0x01AD: "QSI",
192    0x01AE: "SUPBOOK",
193    0x01AF: "PROT4REV",
194    0x01B0: "CONDFMT",
195    0x01B1: "CF",
196    0x01B2: "DVAL",
197    0x01B5: "DCONBIN",
198    0x01B6: "TXO",
199    0x01B7: "REFRESHALL",
200    0x01B8: "HLINK",
201    0x01BA: "CODENAME",
202    0x01BB: "SXFDBTYPE",
203    0x01BC: "PROT4REVPASS",
204    0x01BE: "DV",
205    0x01C0: "XL9FILE",
206    0x01C1: "RECALCID",
207    0x0200: "DIMENSIONS",
208    0x0201: "BLANK",
209    0x0203: "NUMBER",
210    0x0204: "LABEL",
211    0x0205: "BOOLERR",
212    0x0206: "FORMULA",
213    0x0207: "STRING",
214    0x0208: "ROW",
215    0x0209: "BOF",
216    0x020B: "INDEX",
217    0x0218: "NAME",
218    0x0221: "ARRAY",
219    0x0223: "EXTERNNAME",
220    0x0225: "DEFAULTROWHEIGHT",
221    0x0231: "FONT",
222    0x0236: "TABLE",
223    0x023E: "WINDOW2",
224    0x0243: "XF",
225    0x027E: "RK",
226    0x0293: "STYLE",
227    0x0406: "FORMULA",
228    0x0409: "BOF",
229    0x041E: "FORMAT",
230    0x0443: "XF",
231    0x04BC: "SHRFMLA",
232    0x0800: "SCREENTIP",
233    0x0803: "WEBQRYSETTINGS",
234    0x0804: "WEBQRYTABLES",
235    0x0809: "BOF",
236    0x0862: "SHEETLAYOUT",
237    0x0867: "SHEETPROTECTION",
238    0x1001: "UNITS",
239    0x1002: "ChartChart",
240    0x1003: "ChartSeries",
241    0x1006: "ChartDataformat",
242    0x1007: "ChartLineformat",
243    0x1009: "ChartMarkerformat",
244    0x100A: "ChartAreaformat",
245    0x100B: "ChartPieformat",
246    0x100C: "ChartAttachedlabel",
247    0x100D: "ChartSeriestext",
248    0x1014: "ChartChartformat",
249    0x1015: "ChartLegend",
250    0x1016: "ChartSerieslist",
251    0x1017: "ChartBar",
252    0x1018: "ChartLine",
253    0x1019: "ChartPie",
254    0x101A: "ChartArea",
255    0x101B: "ChartScatter",
256    0x101C: "ChartChartline",
257    0x101D: "ChartAxis",
258    0x101E: "ChartTick",
259    0x101F: "ChartValuerange",
260    0x1020: "ChartCatserrange",
261    0x1021: "ChartAxislineformat",
262    0x1022: "ChartFormatlink",
263    0x1024: "ChartDefaulttext",
264    0x1025: "ChartText",
265    0x1026: "ChartFontx",
266    0x1027: "ChartObjectLink",
267    0x1032: "ChartFrame",
268    0x1033: "BEGIN",
269    0x1034: "END",
270    0x1035: "ChartPlotarea",
271    0x103A: "Chart3D",
272    0x103C: "ChartPicf",
273    0x103D: "ChartDropbar",
274    0x103E: "ChartRadar",
275    0x103F: "ChartSurface",
276    0x1040: "ChartRadararea",
277    0x1041: "ChartAxisparent",
278    0x1043: "ChartLegendxn",
279    0x1044: "ChartShtprops",
280    0x1045: "ChartSertocrt",
281    0x1046: "ChartAxesused",
282    0x1048: "ChartSbaseref",
283    0x104A: "ChartSerparent",
284    0x104B: "ChartSerauxtrend",
285    0x104E: "ChartIfmt",
286    0x104F: "ChartPos",
287    0x1050: "ChartAlruns",
288    0x1051: "ChartAI",
289    0x105B: "ChartSerauxerrbar",
290    0x105D: "ChartSerfmt",
291    0x105F: "Chart3DDataFormat",
292    0x1060: "ChartFbi",
293    0x1061: "ChartBoppop",
294    0x1062: "ChartAxcext",
295    0x1063: "ChartDat",
296    0x1064: "ChartPlotgrowth",
297    0x1065: "ChartSiindex",
298    0x1066: "ChartGelframe",
299    0x1067: "ChartBoppcustom",
300    0xFFFF: ""
301}
302
303
304all_funcs_by_name = {
305    # Includes Analysis ToolPak aka ATP aka add-in aka xcall functions,
306    # distinguished by -ve opcode.
307    # name: (opcode, min # args, max # args, func return type, func arg types)
308    # + in func arg types means more of the same.
309    'ABS'         : ( 24, 1,  1, 'V', 'V'),
310    'ACCRINT'     : ( -1, 6,  7, 'V', 'VVVVVVV'),
311    'ACCRINTM'    : ( -1, 3,  5, 'V', 'VVVVV'),
312    'ACOS'        : ( 99, 1,  1, 'V', 'V'),
313    'ACOSH'       : (233, 1,  1, 'V', 'V'),
314    'ADDRESS'     : (219, 2,  5, 'V', 'VVVVV'),
315    'AMORDEGRC'   : ( -1, 7,  7, 'V', 'VVVVVVV'),
316    'AMORLINC'    : ( -1, 7,  7, 'V', 'VVVVVVV'),
317    'AND'         : ( 36, 1, 30, 'V', 'D+'),
318    'AREAS'       : ( 75, 1,  1, 'V', 'R'),
319    'ASC'         : (214, 1,  1, 'V', 'V'),
320    'ASIN'        : ( 98, 1,  1, 'V', 'V'),
321    'ASINH'       : (232, 1,  1, 'V', 'V'),
322    'ATAN'        : ( 18, 1,  1, 'V', 'V'),
323    'ATAN2'       : ( 97, 2,  2, 'V', 'VV'),
324    'ATANH'       : (234, 1,  1, 'V', 'V'),
325    'AVEDEV'      : (269, 1, 30, 'V', 'D+'),
326    'AVERAGE'     : (  5, 1, 30, 'V', 'D+'),
327    'AVERAGEA'    : (361, 1, 30, 'V', 'D+'),
328    'BAHTTEXT'    : (368, 1,  1, 'V', 'V'),
329    'BESSELI'     : ( -1, 2,  2, 'V', 'VV'),
330    'BESSELJ'     : ( -1, 2,  2, 'V', 'VV'),
331    'BESSELK'     : ( -1, 2,  2, 'V', 'VV'),
332    'BESSELY'     : ( -1, 2,  2, 'V', 'VV'),
333    'BETADIST'    : (270, 3,  5, 'V', 'VVVVV'),
334    'BETAINV'     : (272, 3,  5, 'V', 'VVVVV'),
335    'BIN2DEC'     : ( -1, 1,  1, 'V', 'V'),
336    'BIN2HEX'     : ( -1, 1,  2, 'V', 'VV'),
337    'BIN2OCT'     : ( -1, 1,  2, 'V', 'VV'),
338    'BINOMDIST'   : (273, 4,  4, 'V', 'VVVV'),
339    'CEILING'     : (288, 2,  2, 'V', 'VV'),
340    'CELL'        : (125, 1,  2, 'V', 'VR'),
341    'CHAR'        : (111, 1,  1, 'V', 'V'),
342    'CHIDIST'     : (274, 2,  2, 'V', 'VV'),
343    'CHIINV'      : (275, 2,  2, 'V', 'VV'),
344    'CHITEST'     : (306, 2,  2, 'V', 'AA'),
345    'CHOOSE'      : (100, 2, 30, 'R', 'VR+'),
346    'CLEAN'       : (162, 1,  1, 'V', 'V'),
347    'CODE'        : (121, 1,  1, 'V', 'V'),
348    'COLUMN'      : (  9, 0,  1, 'V', 'R'),
349    'COLUMNS'     : ( 77, 1,  1, 'V', 'R'),
350    'COMBIN'      : (276, 2,  2, 'V', 'VV'),
351    'COMPLEX'     : ( -1, 2,  3, 'V', 'VVV'),
352    'CONCATENATE' : (336, 1, 30, 'V', 'V+'),
353    'CONFIDENCE'  : (277, 3,  3, 'V', 'VVV'),
354    'CONVERT'     : ( -1, 3,  3, 'V', 'VVV'),
355    'CORREL'      : (307, 2,  2, 'V', 'AA'),
356    'COS'         : ( 16, 1,  1, 'V', 'V'),
357    'COSH'        : (230, 1,  1, 'V', 'V'),
358    'COUNT'       : (  0, 1, 30, 'V', 'D+'),
359    'COUNTA'      : (169, 1, 30, 'V', 'D+'),
360    'COUNTBLANK'  : (347, 1,  1, 'V', 'R'),
361    'COUNTIF'     : (346, 2,  2, 'V', 'RV'),
362    'COUPDAYBS'   : ( -1, 3,  5, 'V', 'VVVVV'),
363    'COUPDAYS'    : ( -1, 3,  5, 'V', 'VVVVV'),
364    'COUPDAYSNC'  : ( -1, 3,  5, 'V', 'VVVVV'),
365    'COUPNCD'     : ( -1, 3,  5, 'V', 'VVVVV'),
366    'COUPNUM'     : ( -1, 3,  5, 'V', 'VVVVV'),
367    'COUPPCD'     : ( -1, 3,  5, 'V', 'VVVVV'),
368    'COVAR'       : (308, 2,  2, 'V', 'AA'),
369    'CRITBINOM'   : (278, 3,  3, 'V', 'VVV'),
370    'CUMIPMT'     : ( -1, 6,  6, 'V', 'VVVVVV'),
371    'CUMPRINC'    : ( -1, 6,  6, 'V', 'VVVVVV'),
372    'DATE'        : ( 65, 3,  3, 'V', 'VVV'),
373    'DATEDIF'     : (351, 3,  3, 'V', 'VVV'),
374    'DATEVALUE'   : (140, 1,  1, 'V', 'V'),
375    'DAVERAGE'    : ( 42, 3,  3, 'V', 'RRR'),
376    'DAY'         : ( 67, 1,  1, 'V', 'V'),
377    'DAYS360'     : (220, 2,  3, 'V', 'VVV'),
378    'DB'          : (247, 4,  5, 'V', 'VVVVV'),
379    'DBCS'        : (215, 1,  1, 'V', 'V'),
380    'DCOUNT'      : ( 40, 3,  3, 'V', 'RRR'),
381    'DCOUNTA'     : (199, 3,  3, 'V', 'RRR'),
382    'DDB'         : (144, 4,  5, 'V', 'VVVVV'),
383    'DEC2BIN'     : ( -1, 1,  2, 'V', 'VV'),
384    'DEC2HEX'     : ( -1, 1,  2, 'V', 'VV'),
385    'DEC2OCT'     : ( -1, 1,  2, 'V', 'VV'),
386    'DEGREES'     : (343, 1,  1, 'V', 'V'),
387    'DELTA'       : ( -1, 1,  2, 'V', 'VV'),
388    'DEVSQ'       : (318, 1, 30, 'V', 'D+'),
389    'DGET'        : (235, 3,  3, 'V', 'RRR'),
390    'DISC'        : ( -1, 4,  5, 'V', 'VVVVV'),
391    'DMAX'        : ( 44, 3,  3, 'V', 'RRR'),
392    'DMIN'        : ( 43, 3,  3, 'V', 'RRR'),
393    'DOLLAR'      : ( 13, 1,  2, 'V', 'VV'),
394    'DOLLARDE'    : ( -1, 2,  2, 'V', 'VV'),
395    'DOLLARFR'    : ( -1, 2,  2, 'V', 'VV'),
396    'DPRODUCT'    : (189, 3,  3, 'V', 'RRR'),
397    'DSTDEV'      : ( 45, 3,  3, 'V', 'RRR'),
398    'DSTDEVP'     : (195, 3,  3, 'V', 'RRR'),
399    'DSUM'        : ( 41, 3,  3, 'V', 'RRR'),
400    'DURATION'    : ( -1, 5,  6, 'V', 'VVVVVV'),
401    'DVAR'        : ( 47, 3,  3, 'V', 'RRR'),
402    'DVARP'       : (196, 3,  3, 'V', 'RRR'),
403    'EDATE'       : ( -1, 2,  2, 'V', 'VV'),
404    'EFFECT'      : ( -1, 2,  2, 'V', 'VV'),
405    'EOMONTH'     : ( -1, 1,  2, 'V', 'VV'),
406    'ERF'         : ( -1, 1,  2, 'V', 'VV'),
407    'ERFC'        : ( -1, 1,  1, 'V', 'V'),
408    'ERROR.TYPE'  : (261, 1,  1, 'V', 'V'),
409    'EVEN'        : (279, 1,  1, 'V', 'V'),
410    'EXACT'       : (117, 2,  2, 'V', 'VV'),
411    'EXP'         : ( 21, 1,  1, 'V', 'V'),
412    'EXPONDIST'   : (280, 3,  3, 'V', 'VVV'),
413    'FACT'        : (184, 1,  1, 'V', 'V'),
414    'FACTDOUBLE'  : ( -1, 1,  1, 'V', 'V'),
415    'FALSE'       : ( 35, 0,  0, 'V', '-'),
416    'FDIST'       : (281, 3,  3, 'V', 'VVV'),
417    'FIND'        : (124, 2,  3, 'V', 'VVV'),
418    'FINDB'       : (205, 2,  3, 'V', 'VVV'),
419    'FINV'        : (282, 3,  3, 'V', 'VVV'),
420    'FISHER'      : (283, 1,  1, 'V', 'V'),
421    'FISHERINV'   : (284, 1,  1, 'V', 'V'),
422    'FIXED'       : ( 14, 2,  3, 'V', 'VVV'),
423    'FLOOR'       : (285, 2,  2, 'V', 'VV'),
424    'FORECAST'    : (309, 3,  3, 'V', 'VAA'),
425    'FREQUENCY'   : (252, 2,  2, 'A', 'RR'),
426    'FTEST'       : (310, 2,  2, 'V', 'AA'),
427    'FV'          : ( 57, 3,  5, 'V', 'VVVVV'),
428    'FVSCHEDULE'  : ( -1, 2,  2, 'V', 'VA'),
429    'GAMMADIST'   : (286, 4,  4, 'V', 'VVVV'),
430    'GAMMAINV'    : (287, 3,  3, 'V', 'VVV'),
431    'GAMMALN'     : (271, 1,  1, 'V', 'V'),
432    'GCD'         : ( -1, 1, 29, 'V', 'V+'),
433    'GEOMEAN'     : (319, 1, 30, 'V', 'D+'),
434    'GESTEP'      : ( -1, 1,  2, 'V', 'VV'),
435    'GETPIVOTDATA': (358, 2, 30, 'A', 'VAV+'),
436    'GROWTH'      : ( 52, 1,  4, 'A', 'RRRV'),
437    'HARMEAN'     : (320, 1, 30, 'V', 'D+'),
438    'HEX2BIN'     : ( -1, 1,  2, 'V', 'VV'),
439    'HEX2DEC'     : ( -1, 1,  1, 'V', 'V'),
440    'HEX2OCT'     : ( -1, 1,  2, 'V', 'VV'),
441    'HLOOKUP'     : (101, 3,  4, 'V', 'VRRV'),
442    'HOUR'        : ( 71, 1,  1, 'V', 'V'),
443    'HYPERLINK'   : (359, 1,  2, 'V', 'VV'),
444    'HYPGEOMDIST' : (289, 4,  4, 'V', 'VVVV'),
445    'IF'          : (  1, 2,  3, 'R', 'VRR'),
446    'IMABS'       : ( -1, 1,  1, 'V', 'V'),
447    'IMAGINARY'   : ( -1, 1,  1, 'V', 'V'),
448    'IMARGUMENT'  : ( -1, 1,  1, 'V', 'V'),
449    'IMCONJUGATE' : ( -1, 1,  1, 'V', 'V'),
450    'IMCOS'       : ( -1, 1,  1, 'V', 'V'),
451    'IMDIV'       : ( -1, 2,  2, 'V', 'VV'),
452    'IMEXP'       : ( -1, 1,  1, 'V', 'V'),
453    'IMLN'        : ( -1, 1,  1, 'V', 'V'),
454    'IMLOG10'     : ( -1, 1,  1, 'V', 'V'),
455    'IMLOG2'      : ( -1, 1,  1, 'V', 'V'),
456    'IMPOWER'     : ( -1, 2,  2, 'V', 'VV'),
457    'IMPRODUCT'   : ( -1, 2,  2, 'V', 'VV'),
458    'IMREAL'      : ( -1, 1,  1, 'V', 'V'),
459    'IMSIN'       : ( -1, 1,  1, 'V', 'V'),
460    'IMSQRT'      : ( -1, 1,  1, 'V', 'V'),
461    'IMSUB'       : ( -1, 2,  2, 'V', 'VV'),
462    'IMSUM'       : ( -1, 1, 29, 'V', 'V+'),
463    'INDEX'       : ( 29, 2,  4, 'R', 'RVVV'),
464    'INDIRECT'    : (148, 1,  2, 'R', 'VV'),
465    'INFO'        : (244, 1,  1, 'V', 'V'),
466    'INT'         : ( 25, 1,  1, 'V', 'V'),
467    'INTERCEPT'   : (311, 2,  2, 'V', 'AA'),
468    'INTRATE'     : ( -1, 4,  5, 'V', 'VVVVV'),
469    'IPMT'        : (167, 4,  6, 'V', 'VVVVVV'),
470    'IRR'         : ( 62, 1,  2, 'V', 'RV'),
471    'ISBLANK'     : (129, 1,  1, 'V', 'V'),
472    'ISERR'       : (126, 1,  1, 'V', 'V'),
473    'ISERROR'     : (  3, 1,  1, 'V', 'V'),
474    'ISEVEN'      : ( -1, 1,  1, 'V', 'V'),
475    'ISLOGICAL'   : (198, 1,  1, 'V', 'V'),
476    'ISNA'        : (  2, 1,  1, 'V', 'V'),
477    'ISNONTEXT'   : (190, 1,  1, 'V', 'V'),
478    'ISNUMBER'    : (128, 1,  1, 'V', 'V'),
479    'ISODD'       : ( -1, 1,  1, 'V', 'V'),
480    'ISPMT'       : (350, 4,  4, 'V', 'VVVV'),
481    'ISREF'       : (105, 1,  1, 'V', 'R'),
482    'ISTEXT'      : (127, 1,  1, 'V', 'V'),
483    'KURT'        : (322, 1, 30, 'V', 'D+'),
484    'LARGE'       : (325, 2,  2, 'V', 'RV'),
485    'LCM'         : ( -1, 1, 29, 'V', 'V+'),
486    'LEFT'        : (115, 1,  2, 'V', 'VV'),
487    'LEFTB'       : (208, 1,  2, 'V', 'VV'),
488    'LEN'         : ( 32, 1,  1, 'V', 'V'),
489    'LENB'        : (211, 1,  1, 'V', 'V'),
490    'LINEST'      : ( 49, 1,  4, 'A', 'RRVV'),
491    'LN'          : ( 22, 1,  1, 'V', 'V'),
492    'LOG'         : (109, 1,  2, 'V', 'VV'),
493    'LOG10'       : ( 23, 1,  1, 'V', 'V'),
494    'LOGEST'      : ( 51, 1,  4, 'A', 'RRVV'),
495    'LOGINV'      : (291, 3,  3, 'V', 'VVV'),
496    'LOGNORMDIST' : (290, 3,  3, 'V', 'VVV'),
497    'LOOKUP'      : ( 28, 2,  3, 'V', 'VRR'),
498    'LOWER'       : (112, 1,  1, 'V', 'V'),
499    'MATCH'       : ( 64, 2,  3, 'V', 'VRR'),
500    'MAX'         : (  7, 1, 30, 'V', 'D+'),
501    'MAXA'        : (362, 1, 30, 'V', 'D+'),
502    'MDETERM'     : (163, 1,  1, 'V', 'A'),
503    'MDURATION'   : ( -1, 5,  6, 'V', 'VVVVVV'),
504    'MEDIAN'      : (227, 1, 30, 'V', 'D+'),
505    'MID'         : ( 31, 3,  3, 'V', 'VVV'),
506    'MIDB'        : (210, 3,  3, 'V', 'VVV'),
507    'MIN'         : (  6, 1, 30, 'V', 'D+'),
508    'MINA'        : (363, 1, 30, 'V', 'D+'),
509    'MINUTE'      : ( 72, 1,  1, 'V', 'V'),
510    'MINVERSE'    : (164, 1,  1, 'A', 'A'),
511    'MIRR'        : ( 61, 3,  3, 'V', 'RVV'),
512    'MMULT'       : (165, 2,  2, 'A', 'AA'),
513    'MOD'         : ( 39, 2,  2, 'V', 'VV'),
514    'MODE'        : (330, 1, 30, 'V', 'A+'), ################ weird #################
515    'MONTH'       : ( 68, 1,  1, 'V', 'V'),
516    'MROUND'      : ( -1, 2,  2, 'V', 'VV'),
517    'MULTINOMIAL' : ( -1, 1, 29, 'V', 'V+'),
518    'N'           : (131, 1,  1, 'V', 'R'),
519    'NA'          : ( 10, 0,  0, 'V', '-'),
520    'NEGBINOMDIST': (292, 3,  3, 'V', 'VVV'),
521    'NETWORKDAYS' : ( -1, 2,  3, 'V', 'VVR'),
522    'NOMINAL'     : ( -1, 2,  2, 'V', 'VV'),
523    'NORMDIST'    : (293, 4,  4, 'V', 'VVVV'),
524    'NORMINV'     : (295, 3,  3, 'V', 'VVV'),
525    'NORMSDIST'   : (294, 1,  1, 'V', 'V'),
526    'NORMSINV'    : (296, 1,  1, 'V', 'V'),
527    'NOT'         : ( 38, 1,  1, 'V', 'V'),
528    'NOW'         : ( 74, 0,  0, 'V', '-'),
529    'NPER'        : ( 58, 3,  5, 'V', 'VVVVV'),
530    'NPV'         : ( 11, 2, 30, 'V', 'VD+'),
531    'OCT2BIN'     : ( -1, 1,  2, 'V', 'VV'),
532    'OCT2DEC'     : ( -1, 1,  1, 'V', 'V'),
533    'OCT2HEX'     : ( -1, 1,  2, 'V', 'VV'),
534    'ODD'         : (298, 1,  1, 'V', 'V'),
535    'ODDFPRICE'   : ( -1, 9,  9, 'V', 'VVVVVVVVV'),
536    'ODDFYIELD'   : ( -1, 9,  9, 'V', 'VVVVVVVVV'),
537    'ODDLPRICE'   : ( -1, 8,  8, 'V', 'VVVVVVVV'),
538    'ODDLYIELD'   : ( -1, 8,  8, 'V', 'VVVVVVVV'),
539    'OFFSET'      : ( 78, 3,  5, 'R', 'RVVVV'),
540    'OR'          : ( 37, 1, 30, 'V', 'D+'),
541    'PEARSON'     : (312, 2,  2, 'V', 'AA'),
542    'PERCENTILE'  : (328, 2,  2, 'V', 'RV'),
543    'PERCENTRANK' : (329, 2,  3, 'V', 'RVV'),
544    'PERMUT'      : (299, 2,  2, 'V', 'VV'),
545    'PHONETIC'    : (360, 1,  1, 'V', 'R'),
546    'PI'          : ( 19, 0,  0, 'V', '-'),
547    'PMT'         : ( 59, 3,  5, 'V', 'VVVVV'),
548    'POISSON'     : (300, 3,  3, 'V', 'VVV'),
549    'POWER'       : (337, 2,  2, 'V', 'VV'),
550    'PPMT'        : (168, 4,  6, 'V', 'VVVVVV'),
551    'PRICE'       : ( -1, 6,  7, 'V', 'VVVVVVV'),
552    'PRICEDISC'   : ( -1, 4,  5, 'V', 'VVVVV'),
553    'PRICEMAT'    : ( -1, 5,  6, 'V', 'VVVVVV'),
554    'PROB'        : (317, 3,  4, 'V', 'AAVV'),
555    'PRODUCT'     : (183, 1, 30, 'V', 'D+'),
556    'PROPER'      : (114, 1,  1, 'V', 'V'),
557    'PV'          : ( 56, 3,  5, 'V', 'VVVVV'),
558    'QUARTILE'    : (327, 2,  2, 'V', 'RV'),
559    'QUOTIENT'    : ( -1, 2,  2, 'V', 'VV'),
560    'RADIANS'     : (342, 1,  1, 'V', 'V'),
561    'RAND'        : ( 63, 0,  0, 'V', '-'),
562    'RANDBETWEEN' : ( -1, 2,  2, 'V', 'VV'),
563    'RANK'        : (216, 2,  3, 'V', 'VRV'),
564    'RATE'        : ( 60, 3,  6, 'V', 'VVVVVV'),
565    'RECEIVED'    : ( -1, 4,  5, 'V', 'VVVVV'),
566    'REPLACE'     : (119, 4,  4, 'V', 'VVVV'),
567    'REPLACEB'    : (207, 4,  4, 'V', 'VVVV'),
568    'REPT'        : ( 30, 2,  2, 'V', 'VV'),
569    'RIGHT'       : (116, 1,  2, 'V', 'VV'),
570    'RIGHTB'      : (209, 1,  2, 'V', 'VV'),
571    'ROMAN'       : (354, 1,  2, 'V', 'VV'),
572    'ROUND'       : ( 27, 2,  2, 'V', 'VV'),
573    'ROUNDDOWN'   : (213, 2,  2, 'V', 'VV'),
574    'ROUNDUP'     : (212, 2,  2, 'V', 'VV'),
575    'ROW'         : (  8, 0,  1, 'V', 'R'),
576    'ROWS'        : ( 76, 1,  1, 'V', 'R'),
577    'RSQ'         : (313, 2,  2, 'V', 'AA'),
578    'RTD'         : (379, 3, 30, 'A', 'VVV+'),
579    'SEARCH'      : ( 82, 2,  3, 'V', 'VVV'),
580    'SEARCHB'     : (206, 2,  3, 'V', 'VVV'),
581    'SECOND'      : ( 73, 1,  1, 'V', 'V'),
582    'SERIESSUM'   : ( -1, 4,  4, 'V', 'VVVA'),
583    'SIGN'        : ( 26, 1,  1, 'V', 'V'),
584    'SIN'         : ( 15, 1,  1, 'V', 'V'),
585    'SINH'        : (229, 1,  1, 'V', 'V'),
586    'SKEW'        : (323, 1, 30, 'V', 'D+'),
587    'SLN'         : (142, 3,  3, 'V', 'VVV'),
588    'SLOPE'       : (315, 2,  2, 'V', 'AA'),
589    'SMALL'       : (326, 2,  2, 'V', 'RV'),
590    'SQRT'        : ( 20, 1,  1, 'V', 'V'),
591    'SQRTPI'      : ( -1, 1,  1, 'V', 'V'),
592    'STANDARDIZE' : (297, 3,  3, 'V', 'VVV'),
593    'STDEV'       : ( 12, 1, 30, 'V', 'D+'),
594    'STDEVA'      : (366, 1, 30, 'V', 'D+'),
595    'STDEVP'      : (193, 1, 30, 'V', 'D+'),
596    'STDEVPA'     : (364, 1, 30, 'V', 'D+'),
597    'STEYX'       : (314, 2,  2, 'V', 'AA'),
598    'SUBSTITUTE'  : (120, 3,  4, 'V', 'VVVV'),
599    'SUBTOTAL'    : (344, 2, 30, 'V', 'VR+'),
600    'SUM'         : (  4, 1, 30, 'V', 'D+'),
601    'SUMIF'       : (345, 2,  3, 'V', 'RVR'),
602    'SUMPRODUCT'  : (228, 1, 30, 'V', 'A+'),
603    'SUMSQ'       : (321, 1, 30, 'V', 'D+'),
604    'SUMX2MY2'    : (304, 2,  2, 'V', 'AA'),
605    'SUMX2PY2'    : (305, 2,  2, 'V', 'AA'),
606    'SUMXMY2'     : (303, 2,  2, 'V', 'AA'),
607    'SYD'         : (143, 4,  4, 'V', 'VVVV'),
608    'T'           : (130, 1,  1, 'V', 'R'),
609    'TAN'         : ( 17, 1,  1, 'V', 'V'),
610    'TANH'        : (231, 1,  1, 'V', 'V'),
611    'TBILLEQ'     : ( -1, 3,  3, 'V', 'VVV'),
612    'TBILLPRICE'  : ( -1, 3,  3, 'V', 'VVV'),
613    'TBILLYIELD'  : ( -1, 3,  3, 'V', 'VVV'),
614    'TDIST'       : (301, 3,  3, 'V', 'VVV'),
615    'TEXT'        : ( 48, 2,  2, 'V', 'VV'),
616    'TIME'        : ( 66, 3,  3, 'V', 'VVV'),
617    'TIMEVALUE'   : (141, 1,  1, 'V', 'V'),
618    'TINV'        : (332, 2,  2, 'V', 'VV'),
619    'TODAY'       : (221, 0,  0, 'V', '-'),
620    'TRANSPOSE'   : ( 83, 1,  1, 'A', 'A'),
621    'TREND'       : ( 50, 1,  4, 'A', 'RRRV'),
622    'TRIM'        : (118, 1,  1, 'V', 'V'),
623    'TRIMMEAN'    : (331, 2,  2, 'V', 'RV'),
624    'TRUE'        : ( 34, 0,  0, 'V', '-'),
625    'TRUNC'       : (197, 1,  2, 'V', 'VV'),
626    'TTEST'       : (316, 4,  4, 'V', 'AAVV'),
627    'TYPE'        : ( 86, 1,  1, 'V', 'V'),
628    'UPPER'       : (113, 1,  1, 'V', 'V'),
629    'USDOLLAR'    : (204, 1,  2, 'V', 'VV'),
630    'VALUE'       : ( 33, 1,  1, 'V', 'V'),
631    'VAR'         : ( 46, 1, 30, 'V', 'D+'),
632    'VARA'        : (367, 1, 30, 'V', 'D+'),
633    'VARP'        : (194, 1, 30, 'V', 'D+'),
634    'VARPA'       : (365, 1, 30, 'V', 'D+'),
635    'VDB'         : (222, 5,  7, 'V', 'VVVVVVV'),
636    'VLOOKUP'     : (102, 3,  4, 'V', 'VRRV'),
637    'WEEKDAY'     : ( 70, 1,  2, 'V', 'VV'),
638    'WEEKNUM'     : ( -1, 1,  2, 'V', 'VV'),
639    'WEIBULL'     : (302, 4,  4, 'V', 'VVVV'),
640    'WORKDAY'     : ( -1, 2,  3, 'V', 'VVR'),
641    'XIRR'        : ( -1, 2,  3, 'V', 'AAV'),
642    'XNPV'        : ( -1, 3,  3, 'V', 'VAA'),
643    'YEAR'        : ( 69, 1,  1, 'V', 'V'),
644    'YEARFRAC'    : ( -1, 2,  3, 'V', 'VVV'),
645    'YIELD'       : ( -1, 6,  7, 'V', 'VVVVVVV'),
646    'YIELDDISC'   : ( -1, 4,  5, 'V', 'VVVVV'),
647    'YIELDMAT'    : ( -1, 5,  6, 'V', 'VVVVVV'),
648    'ZTEST'       : (324, 2,  3, 'V', 'RVV'),
649    }
650
651# Formulas Parse things
652
653ptgExp          = 0x01
654ptgTbl          = 0x02
655ptgAdd          = 0x03
656ptgSub          = 0x04
657ptgMul          = 0x05
658ptgDiv          = 0x06
659ptgPower        = 0x07
660ptgConcat       = 0x08
661ptgLT           = 0x09
662ptgLE           = 0x0a
663ptgEQ           = 0x0b
664ptgGE           = 0x0c
665ptgGT           = 0x0d
666ptgNE           = 0x0e
667ptgIsect        = 0x0f
668ptgUnion        = 0x10
669ptgRange        = 0x11
670ptgUplus        = 0x12
671ptgUminus       = 0x13
672ptgPercent      = 0x14
673ptgParen        = 0x15
674ptgMissArg      = 0x16
675ptgStr          = 0x17
676ptgExtend       = 0x18
677ptgAttr         = 0x19
678ptgSheet        = 0x1a
679ptgEndSheet     = 0x1b
680ptgErr          = 0x1c
681ptgBool         = 0x1d
682ptgInt          = 0x1e
683ptgNum          = 0x1f
684
685ptgArrayR       = 0x20
686ptgFuncR        = 0x21
687ptgFuncVarR     = 0x22
688ptgNameR        = 0x23
689ptgRefR         = 0x24
690ptgAreaR        = 0x25
691ptgMemAreaR     = 0x26
692ptgMemErrR      = 0x27
693ptgMemNoMemR    = 0x28
694ptgMemFuncR     = 0x29
695ptgRefErrR      = 0x2a
696ptgAreaErrR     = 0x2b
697ptgRefNR        = 0x2c
698ptgAreaNR       = 0x2d
699ptgMemAreaNR    = 0x2e
700ptgMemNoMemNR   = 0x2f
701ptgNameXR       = 0x39
702ptgRef3dR       = 0x3a
703ptgArea3dR      = 0x3b
704ptgRefErr3dR    = 0x3c
705ptgAreaErr3dR   = 0x3d
706
707ptgArrayV       = 0x40
708ptgFuncV        = 0x41
709ptgFuncVarV     = 0x42
710ptgNameV        = 0x43
711ptgRefV         = 0x44
712ptgAreaV        = 0x45
713ptgMemAreaV     = 0x46
714ptgMemErrV      = 0x47
715ptgMemNoMemV    = 0x48
716ptgMemFuncV     = 0x49
717ptgRefErrV      = 0x4a
718ptgAreaErrV     = 0x4b
719ptgRefNV        = 0x4c
720ptgAreaNV       = 0x4d
721ptgMemAreaNV    = 0x4e
722ptgMemNoMemNV   = 0x4f
723ptgFuncCEV      = 0x58
724ptgNameXV       = 0x59
725ptgRef3dV       = 0x5a
726ptgArea3dV      = 0x5b
727ptgRefErr3dV    = 0x5c
728ptgAreaErr3dV   = 0x5d
729
730ptgArrayA       = 0x60
731ptgFuncA        = 0x61
732ptgFuncVarA     = 0x62
733ptgNameA        = 0x63
734ptgRefA         = 0x64
735ptgAreaA        = 0x65
736ptgMemAreaA     = 0x66
737ptgMemErrA      = 0x67
738ptgMemNoMemA    = 0x68
739ptgMemFuncA     = 0x69
740ptgRefErrA      = 0x6a
741ptgAreaErrA     = 0x6b
742ptgRefNA        = 0x6c
743ptgAreaNA       = 0x6d
744ptgMemAreaNA    = 0x6e
745ptgMemNoMemNA   = 0x6f
746ptgFuncCEA      = 0x78
747ptgNameXA       = 0x79
748ptgRef3dA       = 0x7a
749ptgArea3dA      = 0x7b
750ptgRefErr3dA    = 0x7c
751ptgAreaErr3dA   = 0x7d
752
753
754PtgNames = {
755    ptgExp         : "ptgExp",
756    ptgTbl         : "ptgTbl",
757    ptgAdd         : "ptgAdd",
758    ptgSub         : "ptgSub",
759    ptgMul         : "ptgMul",
760    ptgDiv         : "ptgDiv",
761    ptgPower       : "ptgPower",
762    ptgConcat      : "ptgConcat",
763    ptgLT          : "ptgLT",
764    ptgLE          : "ptgLE",
765    ptgEQ          : "ptgEQ",
766    ptgGE          : "ptgGE",
767    ptgGT          : "ptgGT",
768    ptgNE          : "ptgNE",
769    ptgIsect       : "ptgIsect",
770    ptgUnion       : "ptgUnion",
771    ptgRange       : "ptgRange",
772    ptgUplus       : "ptgUplus",
773    ptgUminus      : "ptgUminus",
774    ptgPercent     : "ptgPercent",
775    ptgParen       : "ptgParen",
776    ptgMissArg     : "ptgMissArg",
777    ptgStr         : "ptgStr",
778    ptgExtend      : "ptgExtend",
779    ptgAttr        : "ptgAttr",
780    ptgSheet       : "ptgSheet",
781    ptgEndSheet    : "ptgEndSheet",
782    ptgErr         : "ptgErr",
783    ptgBool        : "ptgBool",
784    ptgInt         : "ptgInt",
785    ptgNum         : "ptgNum",
786    ptgArrayR      : "ptgArrayR",
787    ptgFuncR       : "ptgFuncR",
788    ptgFuncVarR    : "ptgFuncVarR",
789    ptgNameR       : "ptgNameR",
790    ptgRefR        : "ptgRefR",
791    ptgAreaR       : "ptgAreaR",
792    ptgMemAreaR    : "ptgMemAreaR",
793    ptgMemErrR     : "ptgMemErrR",
794    ptgMemNoMemR   : "ptgMemNoMemR",
795    ptgMemFuncR    : "ptgMemFuncR",
796    ptgRefErrR     : "ptgRefErrR",
797    ptgAreaErrR    : "ptgAreaErrR",
798    ptgRefNR       : "ptgRefNR",
799    ptgAreaNR      : "ptgAreaNR",
800    ptgMemAreaNR   : "ptgMemAreaNR",
801    ptgMemNoMemNR  : "ptgMemNoMemNR",
802    ptgNameXR      : "ptgNameXR",
803    ptgRef3dR      : "ptgRef3dR",
804    ptgArea3dR     : "ptgArea3dR",
805    ptgRefErr3dR   : "ptgRefErr3dR",
806    ptgAreaErr3dR  : "ptgAreaErr3dR",
807    ptgArrayV      : "ptgArrayV",
808    ptgFuncV       : "ptgFuncV",
809    ptgFuncVarV    : "ptgFuncVarV",
810    ptgNameV       : "ptgNameV",
811    ptgRefV        : "ptgRefV",
812    ptgAreaV       : "ptgAreaV",
813    ptgMemAreaV    : "ptgMemAreaV",
814    ptgMemErrV     : "ptgMemErrV",
815    ptgMemNoMemV   : "ptgMemNoMemV",
816    ptgMemFuncV    : "ptgMemFuncV",
817    ptgRefErrV     : "ptgRefErrV",
818    ptgAreaErrV    : "ptgAreaErrV",
819    ptgRefNV       : "ptgRefNV",
820    ptgAreaNV      : "ptgAreaNV",
821    ptgMemAreaNV   : "ptgMemAreaNV",
822    ptgMemNoMemNV  : "ptgMemNoMemNV",
823    ptgFuncCEV     : "ptgFuncCEV",
824    ptgNameXV      : "ptgNameXV",
825    ptgRef3dV      : "ptgRef3dV",
826    ptgArea3dV     : "ptgArea3dV",
827    ptgRefErr3dV   : "ptgRefErr3dV",
828    ptgAreaErr3dV  : "ptgAreaErr3dV",
829    ptgArrayA      : "ptgArrayA",
830    ptgFuncA       : "ptgFuncA",
831    ptgFuncVarA    : "ptgFuncVarA",
832    ptgNameA       : "ptgNameA",
833    ptgRefA        : "ptgRefA",
834    ptgAreaA       : "ptgAreaA",
835    ptgMemAreaA    : "ptgMemAreaA",
836    ptgMemErrA     : "ptgMemErrA",
837    ptgMemNoMemA   : "ptgMemNoMemA",
838    ptgMemFuncA    : "ptgMemFuncA",
839    ptgRefErrA     : "ptgRefErrA",
840    ptgAreaErrA    : "ptgAreaErrA",
841    ptgRefNA       : "ptgRefNA",
842    ptgAreaNA      : "ptgAreaNA",
843    ptgMemAreaNA   : "ptgMemAreaNA",
844    ptgMemNoMemNA  : "ptgMemNoMemNA",
845    ptgFuncCEA     : "ptgFuncCEA",
846    ptgNameXA      : "ptgNameXA",
847    ptgRef3dA      : "ptgRef3dA",
848    ptgArea3dA     : "ptgArea3dA",
849    ptgRefErr3dA   : "ptgRefErr3dA",
850    ptgAreaErr3dA  : "ptgAreaErr3dA"
851}
852
853
854error_msg_by_code = {
855    0x00: u"#NULL!",  # intersection of two cell ranges is empty
856    0x07: u"#DIV/0!", # division by zero
857    0x0F: u"#VALUE!", # wrong type of operand
858    0x17: u"#REF!",   # illegal or deleted cell reference
859    0x1D: u"#NAME?",  # wrong function or range name
860    0x24: u"#NUM!",   # value range overflow
861    0x2A: u"#N/A"    # argument or function not available
862}
863