slayer-surpass 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,406 @@
1
+ class Reader
2
+ DIR_ENTRY_SIZE = 128
3
+
4
+ attr_accessor :header
5
+ attr_accessor :data
6
+
7
+ attr_accessor :doc_magic
8
+ attr_accessor :file_uid
9
+ attr_accessor :rev_num
10
+ attr_accessor :ver_num
11
+ attr_accessor :byte_order
12
+ attr_accessor :sect_size
13
+ attr_accessor :short_sect_size
14
+
15
+ attr_accessor :total_sat_sectors
16
+ attr_accessor :dir_start_sid
17
+ attr_accessor :min_stream_size
18
+ attr_accessor :ssat_start_sid
19
+ attr_accessor :total_ssat_sectors
20
+ attr_accessor :msat_start_sid
21
+ attr_accessor :total_msat_sectors
22
+
23
+ attr_accessor :msat
24
+ attr_accessor :sat
25
+ attr_accessor :ssat
26
+ attr_accessor :dir_entry_list
27
+
28
+ def initialize(file)
29
+ @streams = {}
30
+
31
+ file = File.open(file, 'rb') unless file.respond_to?(:read)
32
+ doc = file.read
33
+ @header, @data = doc[0...512], doc[512..-1]
34
+
35
+ build_header
36
+ build_msat
37
+ build_sat
38
+ build_directory
39
+ build_short_sectors_data
40
+
41
+ if @short_sectors_data.length > 0
42
+ build_ssat
43
+ else
44
+ @ssat_start_sid = -2
45
+ @total_ssat_sectors = 0
46
+ @ssat = [-2]
47
+ end
48
+
49
+ @dir_entry_list[1..-1].each do |d|
50
+ did, sz, name, t, c, did_left, did_right, did_root, dentry_start_sid, stream_size = d
51
+ stream_data = ''
52
+ if stream_size > 0
53
+ if stream_size > @min_stream_size
54
+ args = [@data, @sat, dentry_start_sid, @sect_size]
55
+ else
56
+ args = [@short_sectors_data, @ssat, dentry_start_sid, @short_sect_size]
57
+ end
58
+ stream_data = stream_data(*args)
59
+ end
60
+ # BAD IDEA: names may be equal. NEED use full paths...
61
+ @streams[name] = stream_data if !name.length == 0
62
+ end
63
+ end
64
+
65
+ def build_header
66
+ @doc_magic = @header[0...8]
67
+ raise 'Not an OLE file.' unless @doc_magic === "\320\317\021\340\241\261\032\341"
68
+
69
+ @file_uid = @header[8...24]
70
+ @rev_num = @header[24...26]
71
+ @ver_num = @header[26...28]
72
+ @byte_order = @header[28...30]
73
+ @log2_sect_size = @header[30...32].unpack('v')[0]
74
+ @log2_short_sect_size = @header[32...34].unpack('v')[0]
75
+ @total_sat_sectors = @header[44...48].unpack('V')[0]
76
+ @dir_start_sid = @header[48...52].unpack('V')[0]
77
+ @min_stream_size = @header[56...60].unpack('V')[0]
78
+ @ssat_start_sid = @header[60...64].unpack('V')[0]
79
+ @total_ssat_sectors = @header[64...68].unpack('V')[0]
80
+ @msat_start_sid = @header[68...72].unpack('V')[0]
81
+ @total_msat_sectors = @header[72...76].unpack('V')[0]
82
+
83
+ @sect_size = 1 << @log2_sect_size
84
+ @short_sect_size = 1 << @log2_short_sect_size
85
+ end
86
+
87
+ def build_msat
88
+ @msat = @header[76..-1].unpack('V109')
89
+ next_sector = @msat_start_sid
90
+ while next_sector > 0 do
91
+ raise "not implemented"
92
+ start = next_sector * @sect_size
93
+ finish = (next_sector + 1) * @sect_size
94
+ msat_sector = @data[start...finish]
95
+ @msat << msat_sector
96
+ next_sector = msat_sector[-1]
97
+ end
98
+ end
99
+
100
+ def build_sat
101
+ sat_stream = @msat.collect {|i| i >= 0 ? @data[(i*@sect_size)...((i+1)*@sect_size)] : '' }.join
102
+ @sat = sat_stream.unpack('V*')
103
+ end
104
+
105
+ def build_ssat
106
+ ssat_stream = stream_data(@data, @sat, @ssat_start_sid, @sect_size)
107
+ @ssat = ssat_stream.unpack('V*')
108
+ end
109
+
110
+ def build_directory
111
+ dir_stream = stream_data(@data, @sat, @dir_start_sid, @sect_size)
112
+ @dir_entry_list = []
113
+ i = 0
114
+ while i < dir_stream.length do
115
+ dentry = dir_stream[i...(i+DIR_ENTRY_SIZE)]
116
+ i += DIR_ENTRY_SIZE
117
+
118
+ did = @dir_entry_list.length
119
+ sz = dentry[64...66].unpack('C')[0]
120
+
121
+ if sz > 0
122
+ name = dentry[0...(sz-2)] # TODO unicode
123
+ else
124
+ name = ''
125
+ end
126
+
127
+ t = dentry[66...67].unpack('C')[0]
128
+ c = dentry[67...68].unpack('C')[0]
129
+ did_left = dentry[68...72].unpack('V')[0]
130
+ did_right = dentry[72...76].unpack('V')[0]
131
+ did_root = dentry[76...80].unpack('V')[0]
132
+ dentry_start_sid = dentry[116...120].unpack('V')[0]
133
+ stream_size = dentry[120...124].unpack('V')[0]
134
+
135
+ @dir_entry_list << [did, sz, name, t, c, did_left, did_right, did_root, dentry_start_sid, stream_size]
136
+ end
137
+ end
138
+
139
+ def build_short_sectors_data
140
+ did, sz, name, t, c, did_left, did_right, did_root, dentry_start_sid, stream_size = @dir_entry_list[0]
141
+ raise unless t == 0x05 # Short-Stream Container Stream (SSCS) resides in Root Storage
142
+
143
+ if stream_size == 0
144
+ @short_sectors_data = ''
145
+ else
146
+ @short_sectors_data = stream_data(@data, @sat, dentry_start_sid, @sect_size)
147
+ end
148
+ end
149
+
150
+ def stream_data(data, sat, start_sid, sect_size)
151
+ sid = start_sid
152
+ chunks = [[sid, sid]]
153
+ stream_data = ''
154
+ while sat[sid] >= 0 do
155
+ next_in_chain = sat[sid]
156
+ last_chunk_start, last_chunk_finish = chunks[-1]
157
+ if next_in_chain == last_chunk_finish + 1
158
+ chunks[-1] = last_chunk_start, next_in_chain
159
+ else
160
+ chunks << [next_in_chain, next_in_chain]
161
+ end
162
+ sid = next_in_chain
163
+ end
164
+
165
+ chunks.each do |s, f|
166
+ stream_data += data[s*sect_size...(f+1)*sect_size]
167
+ end
168
+ stream_data
169
+ end
170
+ end
171
+
172
+
173
+ # This implementation writes only 'Root Entry', 'Workbook' streams
174
+ # and 2 empty streams for aligning directory stream on sector boundary
175
+ #
176
+ # LAYOUT:
177
+ # 0 header
178
+ # 76 MSAT (1st part: 109 SID)
179
+ # 512 workbook stream
180
+ # ... additional MSAT sectors if streams' size > about 7 Mb == (109*512 * 128)
181
+ # ... SAT
182
+ # ... directory stream
183
+ #
184
+ # NOTE: this layout is "ad hoc". It can be more general. RTFM
185
+ class ExcelDocument
186
+ SECTOR_SIZE = 0x0200
187
+ MIN_LIMIT = 0x1000
188
+
189
+ SID_FREE_SECTOR = -1
190
+ SID_END_OF_CHAIN = -2
191
+ SID_USED_BY_SAT = -3
192
+ SID_USED_BY_MSAT = -4
193
+
194
+ def initialize
195
+ @book_stream_sect = []
196
+ @dir_stream_sect = []
197
+
198
+ @packed_sat = ''
199
+ @sat_sect = []
200
+
201
+ @packed_msat_1st = ''
202
+ @packed_msat_2nd = ''
203
+ @msat_sect_2nd = []
204
+ @header = ''
205
+ end
206
+
207
+ def build_directory
208
+ @dir_stream = ''
209
+
210
+ name = 'Root Entry'
211
+ type = 0x05 # root storage
212
+ colour = 0x01 # black
213
+ did_left = -1
214
+ did_right = -1
215
+ did_root = 1
216
+ start_sid = -2
217
+ stream_sz = 0
218
+ @dir_stream += pack_directory(name, type, colour, did_left, did_right, did_root, start_sid, stream_sz)
219
+
220
+ name = 'Workbook'
221
+ type = 0x02 # user stream
222
+ colour = 0x01 # black
223
+ did_left = -1
224
+ did_right = -1
225
+ did_root = -1
226
+ start_sid = 0
227
+ stream_sz = @book_stream_len
228
+ @dir_stream += pack_directory(name, type, colour, did_left, did_right, did_root, start_sid, stream_sz)
229
+ # padding
230
+ name = ''
231
+ type = 0x00 # empty
232
+ colour = 0x01 # black
233
+ did_left = -1
234
+ did_right = -1
235
+ did_root = -1
236
+ start_sid = -2
237
+ stream_sz = 0
238
+ @dir_stream += pack_directory(name, type, colour, did_left, did_right, did_root, start_sid, stream_sz) * 2
239
+ end
240
+
241
+ def pack_directory(name, type, colour, did_left, did_right, did_root, start_sid, stream_sz)
242
+ encoded_name = ''
243
+ 0.upto(name.length) do |i|
244
+ encoded_name << name[i, 1] + "\000"
245
+ end
246
+ encoded_name << "\000"
247
+ name_sz = encoded_name.length
248
+
249
+ args = [encoded_name, name_sz, type, colour, did_left, did_right, did_root, 0, 0, 0, 0, 0, 0, 0, 0, 0, start_sid, stream_sz, 0]
250
+ args.pack('a64 v C2 V3 V9 V V2')
251
+ end
252
+
253
+ def build_sat
254
+ book_sect_count = @book_stream_len >> 9
255
+ dir_sect_count = @dir_stream.length >> 9
256
+ total_sect_count = book_sect_count + dir_sect_count
257
+ sat_sect_count = 0
258
+ msat_sect_count = 0
259
+ sat_sect_count_limit = 109
260
+
261
+ while (total_sect_count > 128*sat_sect_count) || (sat_sect_count > sat_sect_count_limit) do
262
+ sat_sect_count += 1
263
+ total_sect_count += 1
264
+ if sat_sect_count > sat_sect_count_limit
265
+ msat_sect_count += 1
266
+ total_sect_count += 1
267
+ sat_sect_count_limit += 127
268
+ end
269
+ end
270
+
271
+ # initialize the sat array to be filled with the "empty" character specified by SID_FREE_SECTOR
272
+ sat = [SID_FREE_SECTOR]*128*sat_sect_count
273
+
274
+ sect = 0
275
+ while sect < book_sect_count - 1 do
276
+ @book_stream_sect << sect
277
+ sat[sect] = sect + 1
278
+ sect += 1
279
+ end
280
+ @book_stream_sect << sect
281
+ sat[sect] = SID_END_OF_CHAIN
282
+ sect += 1
283
+
284
+ while sect < book_sect_count + msat_sect_count do
285
+ @msat_sect_2nd << sect
286
+ sat[sect] = SID_USED_BY_MSAT
287
+ sect += 1
288
+ end
289
+
290
+ while sect < book_sect_count + msat_sect_count + sat_sect_count do
291
+ @sat_sect << sect
292
+ sat[sect] = SID_USED_BY_SAT
293
+ sect += 1
294
+ end
295
+
296
+ while sect < book_sect_count + msat_sect_count + sat_sect_count + dir_sect_count - 1 do
297
+ @dir_stream_sect << sect
298
+ sat[sect] = sect + 1
299
+ sect += 1
300
+ end
301
+
302
+ @dir_stream_sect << sect
303
+ sat[sect] = SID_END_OF_CHAIN
304
+ sect += 1
305
+
306
+ @packed_sat = sat.pack('V*')
307
+
308
+ msat_1st = []
309
+ 109.times do |i|
310
+ msat_1st[i] = @sat_sect[i] || SID_FREE_SECTOR
311
+ end
312
+ @packed_msat_1st = msat_1st.pack('V*')
313
+
314
+ msat_2nd = [SID_FREE_SECTOR] * 128 * msat_sect_count
315
+ msat_2nd[-1] = SID_END_OF_CHAIN if msat_sect_count > 0
316
+
317
+ i = 109
318
+ msat_sect = 0
319
+ sid_num = 0
320
+
321
+ while i < sat_sect_count do
322
+ if (sid_num + 1) % 128 == 0
323
+ msat_sect += 1
324
+ msat_2nd[sid_num] = @msat_sect_2nd[msat_sect] if msat_sect < @msat_sect_2nd.length
325
+ else
326
+ msat_2nd[sid_num] = @sat_sect[i]
327
+ i += 1
328
+ end
329
+ sid_num += 1
330
+ end
331
+
332
+ @packed_msat_2nd = msat_2nd.pack('V*')
333
+ end
334
+
335
+ def build_header
336
+ doc_magic = "\320\317\021\340\241\261\032\341"
337
+ file_uid = "\000" * 16
338
+ rev_num = ">\000"
339
+ ver_num = "\003\000"
340
+ byte_order = "\376\377"
341
+ log_sect_size = [9].pack('v')
342
+ log_short_sect_size = [6].pack('v')
343
+ not_used0 = "\000"*10
344
+ total_sat_sectors = [@sat_sect.length].pack('V')
345
+ dir_start_sid = [@dir_stream_sect[0]].pack('V')
346
+ not_used1 = "\000"*4
347
+ min_stream_size = [0x1000].pack('V')
348
+ ssat_start_sid = [-2].pack('V')
349
+ total_ssat_sectors = [0].pack('V')
350
+
351
+ if @msat_sect_2nd.length == 0
352
+ msat_start_sid = [-2].pack('V')
353
+ else
354
+ msat_start_sid = [@msat_sect_2nd[0]].pack('V')
355
+ end
356
+
357
+ total_msat_sectors = [@msat_sect_2nd.length].pack('V')
358
+
359
+ @header = [
360
+ doc_magic,
361
+ file_uid,
362
+ rev_num,
363
+ ver_num,
364
+ byte_order,
365
+ log_sect_size,
366
+ log_short_sect_size,
367
+ not_used0,
368
+ total_sat_sectors,
369
+ dir_start_sid,
370
+ not_used1,
371
+ min_stream_size,
372
+ ssat_start_sid,
373
+ total_ssat_sectors,
374
+ msat_start_sid,
375
+ total_msat_sectors
376
+ ].join
377
+ end
378
+
379
+ def data(stream)
380
+ distance_to_end_of_next_sector_boundary = 0x1000 - (stream.length % 0x1000)
381
+ @book_stream_len = stream.length + distance_to_end_of_next_sector_boundary
382
+ padding = "\000" * distance_to_end_of_next_sector_boundary
383
+
384
+ build_directory
385
+ build_sat
386
+ build_header
387
+
388
+ s = StringIO.new
389
+ s.write(@header)
390
+ s.write(@packed_msat_1st)
391
+ s.write(stream)
392
+ s.write(padding)
393
+ s.write(@packed_msat_2nd)
394
+ s.write(@packed_sat)
395
+ s.write(@dir_stream)
396
+ s.rewind
397
+ s
398
+ end
399
+
400
+ def save(file, stream)
401
+ we_own_it = !file.respond_to?(:write)
402
+ file = File.open(file, 'wb') if we_own_it
403
+ file.write data(stream).read
404
+ file.close if we_own_it
405
+ end
406
+ end
@@ -0,0 +1,1016 @@
1
+ module ExcelMagic
2
+ # lots of Excel Magic Numbers
3
+ # Boundaries BIFF8+
4
+
5
+ MAX_ROW = 65536
6
+ MAX_COL = 256
7
+
8
+
9
+ BIFF_RECORDS = {
10
+ 0x0000 => "DIMENSIONS",
11
+ 0x0001 => "BLANK",
12
+ 0x0002 => "INTEGER",
13
+ 0x0003 => "NUMBER",
14
+ 0x0004 => "LABEL",
15
+ 0x0005 => "BOOLERR",
16
+ 0x0006 => "FORMULA",
17
+ 0x0007 => "STRING",
18
+ 0x0008 => "ROW",
19
+ 0x0009 => "BOF",
20
+ 0x000A => "EOF",
21
+ 0x000B => "INDEX",
22
+ 0x000C => "CALCCOUNT",
23
+ 0x000D => "CALCMODE",
24
+ 0x000E => "PRECISION",
25
+ 0x000F => "REFMODE",
26
+ 0x0010 => "DELTA",
27
+ 0x0011 => "ITERATION",
28
+ 0x0012 => "PROTECT",
29
+ 0x0013 => "PASSWORD",
30
+ 0x0014 => "HEADER",
31
+ 0x0015 => "FOOTER",
32
+ 0x0016 => "EXTERNCOUNT",
33
+ 0x0017 => "EXTERNSHEET",
34
+ 0x0018 => "NAME",
35
+ 0x0019 => "WINDOWPROTECT",
36
+ 0x001A => "VERTICALPAGEBREAKS",
37
+ 0x001B => "HORIZONTALPAGEBREAKS",
38
+ 0x001C => "NOTE",
39
+ 0x001D => "SELECTION",
40
+ 0x001E => "FORMAT",
41
+ 0x001F => "FORMATCOUNT",
42
+ 0x0020 => "COLUMNDEFAULT",
43
+ 0x0021 => "ARRAY",
44
+ 0x0022 => "1904",
45
+ 0x0023 => "EXTERNNAME",
46
+ 0x0024 => "COLWIDTH",
47
+ 0x0025 => "DEFAULTROWHEIGHT",
48
+ 0x0026 => "LEFTMARGIN",
49
+ 0x0027 => "RIGHTMARGIN",
50
+ 0x0028 => "TOPMARGIN",
51
+ 0x0029 => "BOTTOMMARGIN",
52
+ 0x002A => "PRINTHEADERS",
53
+ 0x002B => "PRINTGRIDLINES",
54
+ 0x002F => "FILEPASS",
55
+ 0x0031 => "FONT",
56
+ 0x0036 => "TABLE",
57
+ 0x003C => "CONTINUE",
58
+ 0x003D => "WINDOW1",
59
+ 0x003E => "WINDOW2",
60
+ 0x0040 => "BACKUP",
61
+ 0x0041 => "PANE",
62
+ 0x0042 => "CODEPAGE",
63
+ 0x0043 => "XF",
64
+ 0x0044 => "IXFE",
65
+ 0x0045 => "EFONT",
66
+ 0x004D => "PLS",
67
+ 0x0050 => "DCON",
68
+ 0x0051 => "DCONREF",
69
+ 0x0053 => "DCONNAME",
70
+ 0x0055 => "DEFCOLWIDTH",
71
+ 0x0056 => "BUILTINFMTCNT",
72
+ 0x0059 => "XCT",
73
+ 0x005A => "CRN",
74
+ 0x005B => "FILESHARING",
75
+ 0x005C => "WRITEACCESS",
76
+ 0x005D => "OBJ",
77
+ 0x005E => "UNCALCED",
78
+ 0x005F => "SAFERECALC",
79
+ 0x0060 => "TEMPLATE",
80
+ 0x0063 => "OBJPROTECT",
81
+ 0x007D => "COLINFO",
82
+ 0x007E => "RK",
83
+ 0x007F => "IMDATA",
84
+ 0x0080 => "GUTS",
85
+ 0x0081 => "WSBOOL",
86
+ 0x0082 => "GRIDSET",
87
+ 0x0083 => "HCENTER",
88
+ 0x0084 => "VCENTER",
89
+ 0x0085 => "BOUNDSHEET",
90
+ 0x0086 => "WRITEPROT",
91
+ 0x0087 => "ADDIN",
92
+ 0x0088 => "EDG",
93
+ 0x0089 => "PUB",
94
+ 0x008C => "COUNTRY",
95
+ 0x008D => "HIDEOBJ",
96
+ 0x008E => "BUNDLESOFFSET",
97
+ 0x008F => "BUNDLEHEADER",
98
+ 0x0090 => "SORT",
99
+ 0x0091 => "SUB",
100
+ 0x0092 => "PALETTE",
101
+ 0x0093 => "STYLE",
102
+ 0x0094 => "LHRECORD",
103
+ 0x0095 => "LHNGRAPH",
104
+ 0x0096 => "SOUND",
105
+ 0x0098 => "LPR",
106
+ 0x0099 => "STANDARDWIDTH",
107
+ 0x009A => "FNGROUPNAME",
108
+ 0x009B => "FILTERMODE",
109
+ 0x009C => "FNGROUPCOUNT",
110
+ 0x009D => "AUTOFILTERINFO",
111
+ 0x009E => "AUTOFILTER",
112
+ 0x00A0 => "SCL",
113
+ 0x00A1 => "SETUP",
114
+ 0x00A9 => "COORDLIST",
115
+ 0x00AB => "GCW",
116
+ 0x00AE => "SCENMAN",
117
+ 0x00AF => "SCENARIO",
118
+ 0x00B0 => "SXVIEW",
119
+ 0x00B1 => "SXVD",
120
+ 0x00B2 => "SXVI",
121
+ 0x00B4 => "SXIVD",
122
+ 0x00B5 => "SXLI",
123
+ 0x00B6 => "SXPI",
124
+ 0x00B8 => "DOCROUTE",
125
+ 0x00B9 => "RECIPNAME",
126
+ 0x00BC => "SHRFMLA",
127
+ 0x00BD => "MULRK",
128
+ 0x00BE => "MULBLANK",
129
+ 0x00C1 => "MMS",
130
+ 0x00C2 => "ADDMENU",
131
+ 0x00C3 => "DELMENU",
132
+ 0x00C5 => "SXDI",
133
+ 0x00C6 => "SXDB",
134
+ 0x00C7 => "SXFIELD",
135
+ 0x00C8 => "SXINDEXLIST",
136
+ 0x00C9 => "SXDOUBLE",
137
+ 0x00CD => "SXSTRING",
138
+ 0x00CE => "SXDATETIME",
139
+ 0x00D0 => "SXTBL",
140
+ 0x00D1 => "SXTBRGITEM",
141
+ 0x00D2 => "SXTBPG",
142
+ 0x00D3 => "OBPROJ",
143
+ 0x00D5 => "SXIDSTM",
144
+ 0x00D6 => "RSTRING",
145
+ 0x00D7 => "DBCELL",
146
+ 0x00DA => "BOOKBOOL",
147
+ 0x00DC => "SXEXT|PARAMQRY",
148
+ 0x00DD => "SCENPROTECT",
149
+ 0x00DE => "OLESIZE",
150
+ 0x00DF => "UDDESC",
151
+ 0x00E0 => "XF",
152
+ 0x00E1 => "INTERFACEHDR",
153
+ 0x00E2 => "INTERFACEEND",
154
+ 0x00E3 => "SXVS",
155
+ 0x00E5 => "MERGEDCELLS",
156
+ 0x00E9 => "BITMAP",
157
+ 0x00EB => "MSODRAWINGGROUP",
158
+ 0x00EC => "MSODRAWING",
159
+ 0x00ED => "MSODRAWINGSELECTION",
160
+ 0x00F0 => "SXRULE",
161
+ 0x00F1 => "SXEX",
162
+ 0x00F2 => "SXFILT",
163
+ 0x00F6 => "SXNAME",
164
+ 0x00F7 => "SXSELECT",
165
+ 0x00F8 => "SXPAIR",
166
+ 0x00F9 => "SXFMLA",
167
+ 0x00FB => "SXFORMAT",
168
+ 0x00FC => "SST",
169
+ 0x00FD => "LABELSST",
170
+ 0x00FF => "EXTSST",
171
+ 0x0100 => "SXVDEX",
172
+ 0x0103 => "SXFORMULA",
173
+ 0x0122 => "SXDBEX",
174
+ 0x0137 => "CHTRINSERT",
175
+ 0x0138 => "CHTRINFO",
176
+ 0x013B => "CHTRCELLCONTENT",
177
+ 0x013D => "TABID",
178
+ 0x0140 => "CHTRMOVERANGE",
179
+ 0x014D => "CHTRINSERTTAB",
180
+ 0x015F => "LABELRANGES",
181
+ 0x0160 => "USESELFS",
182
+ 0x0161 => "DSF",
183
+ 0x0162 => "XL5MODIFY",
184
+ 0x0196 => "CHTRHEADER",
185
+ 0x01A9 => "USERBVIEW",
186
+ 0x01AA => "USERSVIEWBEGIN",
187
+ 0x01AB => "USERSVIEWEND",
188
+ 0x01AD => "QSI",
189
+ 0x01AE => "SUPBOOK",
190
+ 0x01AF => "PROT4REV",
191
+ 0x01B0 => "CONDFMT",
192
+ 0x01B1 => "CF",
193
+ 0x01B2 => "DVAL",
194
+ 0x01B5 => "DCONBIN",
195
+ 0x01B6 => "TXO",
196
+ 0x01B7 => "REFRESHALL",
197
+ 0x01B8 => "HLINK",
198
+ 0x01BA => "CODENAME",
199
+ 0x01BB => "SXFDBTYPE",
200
+ 0x01BC => "PROT4REVPASS",
201
+ 0x01BE => "DV",
202
+ 0x01C0 => "XL9FILE",
203
+ 0x01C1 => "RECALCID",
204
+ 0x0200 => "DIMENSIONS",
205
+ 0x0201 => "BLANK",
206
+ 0x0203 => "NUMBER",
207
+ 0x0204 => "LABEL",
208
+ 0x0205 => "BOOLERR",
209
+ 0x0206 => "FORMULA",
210
+ 0x0207 => "STRING",
211
+ 0x0208 => "ROW",
212
+ 0x0209 => "BOF",
213
+ 0x020B => "INDEX",
214
+ 0x0218 => "NAME",
215
+ 0x0221 => "ARRAY",
216
+ 0x0223 => "EXTERNNAME",
217
+ 0x0225 => "DEFAULTROWHEIGHT",
218
+ 0x0231 => "FONT",
219
+ 0x0236 => "TABLE",
220
+ 0x023E => "WINDOW2",
221
+ 0x0243 => "XF",
222
+ 0x027E => "RK",
223
+ 0x0293 => "STYLE",
224
+ 0x0406 => "FORMULA",
225
+ 0x0409 => "BOF",
226
+ 0x041E => "FORMAT",
227
+ 0x0443 => "XF",
228
+ 0x04BC => "SHRFMLA",
229
+ 0x0800 => "SCREENTIP",
230
+ 0x0803 => "WEBQRYSETTINGS",
231
+ 0x0804 => "WEBQRYTABLES",
232
+ 0x0809 => "BOF",
233
+ 0x0862 => "SHEETLAYOUT",
234
+ 0x0867 => "SHEETPROTECTION",
235
+ 0x1001 => "UNITS",
236
+ 0x1002 => "ChartChart",
237
+ 0x1003 => "ChartSeries",
238
+ 0x1006 => "ChartDataformat",
239
+ 0x1007 => "ChartLineformat",
240
+ 0x1009 => "ChartMarkerformat",
241
+ 0x100A => "ChartAreaformat",
242
+ 0x100B => "ChartPieformat",
243
+ 0x100C => "ChartAttachedlabel",
244
+ 0x100D => "ChartSeriestext",
245
+ 0x1014 => "ChartChartformat",
246
+ 0x1015 => "ChartLegend",
247
+ 0x1016 => "ChartSerieslist",
248
+ 0x1017 => "ChartBar",
249
+ 0x1018 => "ChartLine",
250
+ 0x1019 => "ChartPie",
251
+ 0x101A => "ChartArea",
252
+ 0x101B => "ChartScatter",
253
+ 0x101C => "ChartChartline",
254
+ 0x101D => "ChartAxis",
255
+ 0x101E => "ChartTick",
256
+ 0x101F => "ChartValuerange",
257
+ 0x1020 => "ChartCatserrange",
258
+ 0x1021 => "ChartAxislineformat",
259
+ 0x1022 => "ChartFormatlink",
260
+ 0x1024 => "ChartDefaulttext",
261
+ 0x1025 => "ChartText",
262
+ 0x1026 => "ChartFontx",
263
+ 0x1027 => "ChartObjectLink",
264
+ 0x1032 => "ChartFrame",
265
+ 0x1033 => "BEGIN",
266
+ 0x1034 => "END",
267
+ 0x1035 => "ChartPlotarea",
268
+ 0x103A => "Chart3D",
269
+ 0x103C => "ChartPicf",
270
+ 0x103D => "ChartDropbar",
271
+ 0x103E => "ChartRadar",
272
+ 0x103F => "ChartSurface",
273
+ 0x1040 => "ChartRadararea",
274
+ 0x1041 => "ChartAxisparent",
275
+ 0x1043 => "ChartLegendxn",
276
+ 0x1044 => "ChartShtprops",
277
+ 0x1045 => "ChartSertocrt",
278
+ 0x1046 => "ChartAxesused",
279
+ 0x1048 => "ChartSbaseref",
280
+ 0x104A => "ChartSerparent",
281
+ 0x104B => "ChartSerauxtrend",
282
+ 0x104E => "ChartIfmt",
283
+ 0x104F => "ChartPos",
284
+ 0x1050 => "ChartAlruns",
285
+ 0x1051 => "ChartAI",
286
+ 0x105B => "ChartSerauxerrbar",
287
+ 0x105D => "ChartSerfmt",
288
+ 0x105F => "Chart3DDataFormat",
289
+ 0x1060 => "ChartFbi",
290
+ 0x1061 => "ChartBoppop",
291
+ 0x1062 => "ChartAxcext",
292
+ 0x1063 => "ChartDat",
293
+ 0x1064 => "ChartPlotgrowth",
294
+ 0x1065 => "ChartSiindex",
295
+ 0x1066 => "ChartGelframe",
296
+ 0x1067 => "ChartBoppcustom",
297
+ 0xFFFF => ""
298
+ }
299
+
300
+
301
+ STD_FUNC_BY_NAME = {
302
+ "ABS" => [0x018, 1, 1, "V", "V", false], # 1
303
+ "ACOS" => [0x063, 1, 1, "V", "V", false], # 2
304
+ "ACOSH" => [0x0e9, 1, 1, "V", "V", false], # 3
305
+ "ADDRESS" => [0x0db, 2, 5, "V", "V V V V V", false], # 4
306
+ "AND" => [0x024, 1, 30, "V", "R ...", false], # 5
307
+ "ARCTAN" => [0x012, 1, 1, "V", "V", false], # 6
308
+ "AREAS" => [0x04b, 1, 1, "V", "R", false], # 7
309
+ "ASC" => [0x0d6, 1, 1, "V", "V", false], # 8
310
+ "ASIN" => [0x062, 1, 1, "V", "V", false], # 9
311
+ "ASINH" => [0x0e8, 1, 1, "V", "V", false], # 10
312
+ "ATAN2" => [0x061, 2, 2, "V", "V V", false], # 11
313
+ "ATANH" => [0x0ea, 1, 1, "V", "V", false], # 12
314
+ "AVEDEV" => [0x10d, 1, 30, "V", "R ...", false], # 13
315
+ "AVERAGE" => [0x005, 1, 30, "V", "R ...", false], # 14
316
+ "AVERAGEA" => [0x169, 1, 30, "V", "R ...", false], # 15
317
+ "BETADIST" => [0x10e, 3, 5, "V", "V V V V V", false], # 16
318
+ "BETAINV" => [0x110, 3, 5, "V", "V V V V V", false], # 17
319
+ "BINOMDIST" => [0x111, 4, 4, "V", "V V V V", false], # 18
320
+ "CEILING" => [0x120, 2, 2, "V", "V V", false], # 19
321
+ "CELL" => [0x07d, 1, 2, "V", "V R", true], # 20
322
+ "CHAR" => [0x06f, 1, 1, "V", "V", false], # 21
323
+ "CHIDIST" => [0x112, 2, 2, "V", "V V", false], # 22
324
+ "CHIINV" => [0x113, 2, 2, "V", "V V", false], # 23
325
+ "CHITEST" => [0x132, 2, 2, "V", "A A", false], # 24
326
+ "CHOOSE" => [0x064, 2, 30, "R", "V R ...", false], # 25
327
+ "CLEAN" => [0x0a2, 1, 1, "V", "V", false], # 26
328
+ "CODE" => [0x079, 1, 1, "V", "V", false], # 27
329
+ "COLUMN" => [0x009, 0, 1, "V", "R", false], # 28
330
+ "COLUMNS" => [0x04d, 1, 1, "V", "R", false], # 29
331
+ "COMBIN" => [0x114, 2, 2, "V", "V V", false], # 30
332
+ "CONCATENATE" => [0x150, 0, 30, "V", "V ...", false], # 31
333
+ "CONFIDENCE" => [0x115, 3, 3, "V", "V V V", false], # 32
334
+ "CORREL" => [0x133, 2, 2, "V", "A A", false], # 33
335
+ "COS" => [0x010, 1, 1, "V", "V", false], # 34
336
+ "COSH" => [0x0e6, 1, 1, "V", "V", false], # 35
337
+ "COUNT" => [0x000, 0, 30, "V", "R ...", false], # 36
338
+ "COUNTA" => [0x0a9, 0, 30, "V", "R ...", false], # 37
339
+ "COUNTBLANK" => [0x15b, 1, 1, "V", "R", false], # 38
340
+ "COUNTIF" => [0x15a, 2, 2, "V", "R V", false], # 39
341
+ "COVAR" => [0x134, 2, 2, "V", "A A", false], # 40
342
+ "CRITBINOM" => [0x116, 3, 3, "V", "V V V", false], # 41
343
+ "DATE" => [0x041, 3, 3, "V", "V V V", false], # 42
344
+ "DATEDIF" => [0x15f, 3, 3, "V", "V V V", false], # 43
345
+ "DATESTRING" => [0x160, 1, 1, "V", "V", false], # 44
346
+ "DATEVALUE" => [0x08c, 1, 1, "V", "V", false], # 45
347
+ "DAVERAGE" => [0x02a, 3, 3, "V", "R R R", false], # 46
348
+ "DAY" => [0x043, 1, 1, "V", "V", false], # 47
349
+ "DAYS360" => [0x0dc, 2, 3, "V", "V V V", false], # 48
350
+ "DB" => [0x0f7, 4, 5, "V", "V V V V V", false], # 49
351
+ "DBSC" => [0x0d7, 1, 1, "V", "V", false], # 50
352
+ "DCOUNT" => [0x028, 3, 3, "V", "R R R", false], # 51
353
+ "DCOUNTA" => [0x0c7, 3, 3, "V", "R R R", false], # 52
354
+ "DDB" => [0x090, 4, 5, "V", "V V V V V", false], # 53
355
+ "DEGREES" => [0x157, 1, 1, "V", "V", false], # 54
356
+ "DEVSQ" => [0x13e, 1, 30, "V", "R ...", false], # 55
357
+ "DGET" => [0x0eb, 3, 3, "V", "R R R", false], # 56
358
+ "DMAX" => [0x02c, 3, 3, "V", "R R R", false], # 57
359
+ "DMIN" => [0x02b, 3, 3, "V", "R R R", false], # 58
360
+ "DOLLAR" => [0x00d, 1, 2, "V", "V V", false], # 59
361
+ "DPRODUCT" => [0x0bf, 3, 3, "V", "R R R", false], # 60
362
+ "DSTDEV" => [0x02d, 3, 3, "V", "R R R", false], # 61
363
+ "DSTDEVP" => [0x0c3, 3, 3, "V", "R R R", false], # 62
364
+ "DSUM" => [0x029, 3, 3, "V", "R R R", false], # 63
365
+ "DVAR" => [0x02f, 3, 3, "V", "R R R", false], # 64
366
+ "DVARP" => [0x0c4, 3, 3, "V", "R R R", false], # 65
367
+ "ERROR.TYPE" => [0x105, 1, 1, "V", "V", false], # 66
368
+ "EVEN" => [0x117, 1, 1, "V", "V", false], # 67
369
+ "EXACT" => [0x075, 2, 2, "V", "V V", false], # 68
370
+ "EXP" => [0x015, 1, 1, "V", "V", false], # 69
371
+ "EXPONDIST" => [0x118, 3, 3, "V", "V V V", false], # 70
372
+ "FACT" => [0x0b8, 1, 1, "V", "V", false], # 71
373
+ "FALSE" => [0x023, 0, 0, "V", "-", false], # 72
374
+ "FDIST" => [0x119, 3, 3, "V", "V V V", false], # 73
375
+ "FIND" => [0x07c, 2, 3, "V", "V V V", false], # 74
376
+ "FINDB" => [0x0cd, 2, 3, "V", "V V V", false], # 75
377
+ "FINV" => [0x11a, 3, 3, "V", "V V V", false], # 76
378
+ "FISHER" => [0x11b, 1, 1, "V", "V", false], # 77
379
+ "FISHERINV" => [0x11c, 1, 1, "V", "V", false], # 78
380
+ "FIXED" => [0x00e, 2, 3, "V", "V V V", false], # 79
381
+ "FLOOR" => [0x11d, 2, 2, "V", "V V", false], # 80
382
+ "FORECAST" => [0x135, 3, 3, "V", "V A A", false], # 81
383
+ "FREQUENCY" => [0x0fc, 2, 2, "A", "R R", false], # 82
384
+ "FTEST" => [0x136, 2, 2, "V", "A A", false], # 83
385
+ "FV" => [0x039, 3, 5, "V", "V V V V V", false], # 84
386
+ "GAMMADIST" => [0x11e, 4, 4, "V", "V V V V", false], # 85
387
+ "GAMMAINV" => [0x11f, 3, 3, "V", "V V V", false], # 86
388
+ "GAMMALN" => [0x10f, 1, 1, "V", "V", false], # 87
389
+ "GEOMEAN" => [0x13f, 1, 30, "V", "R ...", false], # 88
390
+ "GETPIVOTDATA" => [0x166, 2, 30, "A", "-", false], # 89
391
+ "GROWTH" => [0x034, 1, 4, "A", "R R R V", false], # 90
392
+ "HARMEAN" => [0x140, 1, 30, "V", "R ...", false], # 91
393
+ "HLOOKUP" => [0x065, 3, 4, "V", "V R R V", false], # 92
394
+ "HOUR" => [0x047, 1, 1, "V", "V", false], # 93
395
+ "HYPERLINK" => [0x167, 1, 2, "V", "V V", false], # 94
396
+ "HYPGEOMVERT" => [0x121, 4, 4, "V", "V V V V", false], # 95
397
+ "IF" => [0x001, 2, 3, "V", "V V V", false], # 96
398
+ "INDEX" => [0x01d, 2, 4, "R", "R V V V", false], # 97
399
+ "INDIRECT" => [0x094, 1, 2, "R", "V V", true], # 98
400
+ "INFO" => [0x0f4, 1, 1, "V", "V", false], # 99
401
+ "INT" => [0x019, 1, 1, "V", "V", false], # 100
402
+ "INTERCEPT" => [0x137, 2, 2, "V", "A A", false], # 101
403
+ "IPMT" => [0x0a7, 4, 6, "V", "V V V V V V", false], # 102
404
+ "IRR" => [0x03e, 1, 2, "V", "R V", false], # 103
405
+ "ISBLANK" => [0x081, 1, 1, "V", "V", false], # 104
406
+ "ISERR" => [0x07e, 1, 1, "V", "V", false], # 105
407
+ "ISERROR" => [0x003, 1, 1, "V", "V", false], # 106
408
+ "ISLOGICAL" => [0x0c6, 1, 1, "V", "V", false], # 107
409
+ "ISNA" => [0x002, 1, 1, "V", "V", false], # 108
410
+ "ISNONTEXT" => [0x0c0, 1, 1, "V", "V", false], # 109
411
+ "ISNUMBER" => [0x080, 1, 1, "V", "V", false], # 110
412
+ "ISPMT" => [0x15e, 4, 4, "V", "V V V V", false], # 111
413
+ "ISREF" => [0x069, 1, 1, "V", "R", false], # 112
414
+ "ISTEXT" => [0x07f, 1, 1, "V", "V", false], # 113
415
+ "KURT" => [0x142, 1, 30, "V", "R ...", false], # 114
416
+ "LARGE" => [0x145, 2, 2, "V", "R V", false], # 115
417
+ "LEFT" => [0x073, 1, 2, "V", "V V", false], # 116
418
+ "LEFTB" => [0x0d0, 1, 2, "V", "V V", false], # 117
419
+ "LEN" => [0x020, 1, 1, "V", "V", false], # 118
420
+ "LENB" => [0x0d3, 1, 1, "V", "V", false], # 119
421
+ "LINEST" => [0x031, 1, 4, "A", "R R V V", false], # 120
422
+ "LN" => [0x016, 1, 1, "V", "V", false], # 121
423
+ "LOG" => [0x06d, 1, 2, "V", "V V", false], # 122
424
+ "LOG10" => [0x017, 1, 1, "V", "V", false], # 123
425
+ "LOGEST" => [0x033, 1, 4, "A", "R R V V", false], # 124
426
+ "LOGINV" => [0x123, 3, 3, "V", "V V V", false], # 125
427
+ "LOGNORMDIST" => [0x122, 3, 3, "V", "V V V", false], # 126
428
+ "LOOKUP" => [0x01c, 2, 3, "V", "V R R", false], # 127
429
+ "LOWER" => [0x070, 1, 1, "V", "V", false], # 128
430
+ "MATCH" => [0x040, 2, 3, "V", "V R R", false], # 129
431
+ "MAX" => [0x007, 1, 30, "V", "R ...", false], # 130
432
+ "MAXA" => [0x16a, 1, 30, "V", "R ...", false], # 131
433
+ "MDETERM" => [0x0a3, 1, 1, "V", "A", false], # 132
434
+ "MEDIAN" => [0x0e3, 1, 30, "V", "R ...", false], # 133
435
+ "MID" => [0x01f, 3, 3, "V", "V V V", false], # 134
436
+ "MIDB" => [0x0d2, 3, 3, "V", "V V V", false], # 135
437
+ "MIN" => [0x006, 1, 30, "V", "R ...", false], # 136
438
+ "MINA" => [0x16b, 1, 30, "V", "R ...", false], # 137
439
+ "MINUTE" => [0x048, 1, 1, "V", "V", false], # 138
440
+ "MINVERSE" => [0x0a4, 1, 1, "A", "A", false], # 139
441
+ "MIRR" => [0x03d, 3, 3, "V", "R V V", false], # 140
442
+ "MMULT" => [0x0a5, 2, 2, "A", "A A", false], # 141
443
+ "MNORMSINV" => [0x128, 1, 1, "V", "V", false], # 142
444
+ "MOD" => [0x027, 2, 2, "V", "V V", false], # 143
445
+ "MODE" => [0x14a, 1, 30, "V", "A ...", false], # 144
446
+ "MONTH" => [0x044, 1, 1, "V", "V", false], # 145
447
+ "N" => [0x083, 1, 1, "V", "R", false], # 146
448
+ "NA" => [0x00a, 0, 0, "V", "-", false], # 147
449
+ "NEGBINOMDIST" => [0x124, 3, 3, "V", "V V V", false], # 148
450
+ "NORMDIST" => [0x125, 4, 4, "V", "V V V V", false], # 149
451
+ "NORMINV" => [0x127, 3, 3, "V", "V V V", false], # 150
452
+ "NORMSDIST" => [0x126, 1, 1, "V", "V", false], # 151
453
+ "NOT" => [0x026, 1, 1, "V", "V", false], # 152
454
+ "NOW" => [0x04a, 0, 0, "V", "-", true], # 153
455
+ "NPER" => [0x03a, 3, 5, "V", "V V V V V", false], # 154
456
+ "NPV" => [0x00b, 2, 30, "V", "V R ...", false], # 155
457
+ "NUMBERSTRING" => [0x161, 2, 2, "V", "V V", false], # 156
458
+ "ODD" => [0x12a, 1, 1, "V", "V", false], # 157
459
+ "OFFSET" => [0x04e, 3, 5, "R", "R V V V V", true], # 158
460
+ "OR" => [0x025, 1, 30, "V", "R ...", false], # 159
461
+ "PEARSON" => [0x138, 2, 2, "V", "A A", false], # 160
462
+ "PERCENTILE" => [0x148, 2, 2, "V", "R V", false], # 161
463
+ "PERCENTRANK" => [0x149, 2, 3, "V", "R V V", false], # 162
464
+ "PERMUT" => [0x12b, 2, 2, "V", "V V", false], # 163
465
+ "PHONETIC" => [0x168, 1, 1, "V", "R", false], # 164
466
+ "PI" => [0x013, 0, 0, "V", "-", false], # 165
467
+ "PMT" => [0x03b, 3, 5, "V", "V V V V V", false], # 166
468
+ "POISSON" => [0x12c, 3, 3, "V", "V V V", false], # 167
469
+ "POWER" => [0x151, 2, 2, "V", "V V", false], # 168
470
+ "PPMT" => [0x0a8, 4, 6, "V", "V V V V V V", false], # 169
471
+ "PROB" => [0x13d, 3, 4, "V", "A A V V", false], # 170
472
+ "PRODUCT" => [0x0b7, 0, 30, "V", "R ...", false], # 171
473
+ "PROPER" => [0x072, 1, 1, "V", "V", false], # 172
474
+ "PV" => [0x038, 3, 5, "V", "V V V V V", false], # 173
475
+ "QUARTILE" => [0x147, 2, 2, "V", "R V", false], # 174
476
+ "RADIANS" => [0x156, 1, 1, "V", "V", false], # 175
477
+ "RAND" => [0x03f, 0, 0, "V", "-", true], # 176
478
+ "RANK" => [0x0d8, 2, 3, "V", "V R V", false], # 177
479
+ "RATE" => [0x03c, 3, 6, "V", "V V V V V V", false], # 178
480
+ "REPLACE" => [0x077, 4, 4, "V", "V V V V", false], # 179
481
+ "REPLACEB" => [0x0cf, 4, 4, "V", "V V V V", false], # 180
482
+ "REPT" => [0x01e, 2, 2, "V", "V V", false], # 181
483
+ "RIGHT" => [0x074, 1, 2, "V", "V V", false], # 182
484
+ "RIGHTB" => [0x0d1, 1, 2, "V", "V V", false], # 183
485
+ "ROMAN" => [0x162, 1, 2, "V", "V V", false], # 184
486
+ "ROUND" => [0x01b, 2, 2, "V", "V V", false], # 185
487
+ "ROUNDDOWN" => [0x0d5, 2, 2, "V", "V V", false], # 186
488
+ "ROUNDUP" => [0x0d4, 2, 2, "V", "V V", false], # 187
489
+ "ROW" => [0x008, 0, 1, "V", "R", false], # 188
490
+ "ROWS" => [0x04c, 1, 1, "V", "R", false], # 189
491
+ "RSQ" => [0x139, 2, 2, "V", "A A", false], # 190
492
+ "SEARCH" => [0x052, 2, 3, "V", "V V V", false], # 191
493
+ "SEARCHB" => [0x0ce, 2, 3, "V", "V V V", false], # 192
494
+ "SECOND" => [0x049, 1, 1, "V", "V", false], # 193
495
+ "SIGN" => [0x01a, 1, 1, "V", "V", false], # 194
496
+ "SIN" => [0x00f, 1, 1, "V", "V", false], # 195
497
+ "SINH" => [0x0e5, 1, 1, "V", "V", false], # 196
498
+ "SKEW" => [0x143, 1, 30, "V", "R ...", false], # 197
499
+ "SLN" => [0x08e, 3, 3, "V", "V V V", false], # 198
500
+ "SLOPE" => [0x13b, 2, 2, "V", "A A", false], # 199
501
+ "SMALL" => [0x146, 2, 2, "V", "R V", false], # 200
502
+ "SQRT" => [0x014, 1, 1, "V", "V", false], # 201
503
+ "STANDARDIZE" => [0x129, 3, 3, "V", "V V V", false], # 202
504
+ "STDEV" => [0x00c, 1, 30, "V", "R ...", false], # 203
505
+ "STDEVA" => [0x16e, 1, 30, "V", "R ...", false], # 204
506
+ "STDEVP" => [0x0c1, 1, 30, "V", "R ...", false], # 205
507
+ "STDEVPA" => [0x16c, 1, 30, "V", "R ...", false], # 206
508
+ "STEYX" => [0x13a, 2, 2, "V", "A A", false], # 207
509
+ "SUBSTITUTE" => [0x078, 3, 4, "V", "V V V V", false], # 208
510
+ "SUBTOTAL" => [0x158, 2, 30, "V", "V R ...", false], # 209
511
+ "SUM" => [0x004, 0, 30, "V", "R ...", false], # 210
512
+ "SUMIF" => [0x159, 2, 3, "V", "R V R", false], # 211
513
+ "SUMPRODUCT" => [0x0e4, 1, 30, "V", "A ...", false], # 212
514
+ "SUMSQ" => [0x141, 0, 30, "V", "R ...", false], # 213
515
+ "SUMX2MY2" => [0x130, 2, 2, "V", "A A", false], # 214
516
+ "SUMX2PY2" => [0x131, 2, 2, "V", "A A", false], # 215
517
+ "SUMXMY2" => [0x12f, 2, 2, "V", "A A", false], # 216
518
+ "SYD" => [0x08f, 4, 4, "V", "V V V V", false], # 217
519
+ "T" => [0x082, 1, 1, "V", "R", false], # 218
520
+ "TAN" => [0x011, 1, 1, "V", "V", false], # 219
521
+ "TANH" => [0x0e7, 1, 1, "V", "V", false], # 220
522
+ "TDIST" => [0x12d, 3, 3, "V", "V V V", false], # 221
523
+ "TEXT" => [0x030, 2, 2, "V", "V V", false], # 222
524
+ "TIME" => [0x042, 3, 3, "V", "V V V", false], # 223
525
+ "TIMEVALUE" => [0x08d, 1, 1, "V", "V", false], # 224
526
+ "TINV" => [0x14c, 2, 2, "V", "V V", false], # 225
527
+ "TODAY" => [0x0dd, 0, 0, "V", "-", true], # 226
528
+ "TRANSPOSE" => [0x053, 1, 1, "A", "A", false], # 227
529
+ "TREND" => [0x032, 1, 4, "A", "R R R V", false], # 228
530
+ "TRIM" => [0x076, 1, 1, "V", "V", false], # 229
531
+ "TRIMMEAN" => [0x14b, 2, 2, "V", "R V", false], # 230
532
+ "TRUE" => [0x022, 0, 0, "V", "-", false], # 231
533
+ "TRUNC" => [0x0c5, 1, 2, "V", "V V", false], # 232
534
+ "TTEST" => [0x13c, 4, 4, "V", "A A V V", false], # 233
535
+ "TYPE" => [0x056, 1, 1, "V", "V", false], # 234
536
+ "UPPER" => [0x071, 1, 1, "V", "V", false], # 235
537
+ "USDOLLAR" => [0x0cc, 1, 2, "V", "V V", false], # 236
538
+ "VALUE" => [0x021, 1, 1, "V", "V", false], # 237
539
+ "VAR" => [0x02e, 1, 30, "V", "R ...", false], # 238
540
+ "VARA" => [0x16f, 1, 30, "V", "R ...", false], # 239
541
+ "VARP" => [0x0c2, 1, 30, "V", "R ...", false], # 240
542
+ "VARPA" => [0x16d, 1, 30, "V", "R ...", false], # 241
543
+ "VDB" => [0x0de, 5, 7, "V", "V V V V V V V", false], # 242
544
+ "VLOOKUP" => [0x066, 3, 4, "V", "V R R V", false], # 243
545
+ "WEEKDAY" => [0x046, 1, 2, "V", "V V", false], # 244
546
+ "WEIBULL" => [0x12e, 4, 4, "V", "V V V V", false], # 245
547
+ "YEAR" => [0x045, 1, 1, "V", "V", false], # 246
548
+ "ZTEST" => [0x144, 2, 3, "V", "R V V", false] # 247
549
+ }
550
+
551
+
552
+ STD_FUNC_BY_NUM = {
553
+ 0x000 => [ "COUNT", 0, 30, "V", "R ...", false], # 1
554
+ 0x001 => [ "IF", 2, 3, "R", "V R R", false], # 2
555
+ 0x002 => [ "ISNA", 1, 1, "V", "V", false], # 3
556
+ 0x003 => [ "ISERROR", 1, 1, "V", "V", false], # 4
557
+ 0x004 => [ "SUM", 0, 30, "V", "R ...", false], # 5
558
+ 0x005 => [ "AVERAGE", 1, 30, "V", "R ...", false], # 6
559
+ 0x006 => [ "MIN", 1, 30, "V", "R ...", false], # 7
560
+ 0x007 => [ "MAX", 1, 30, "V", "R ...", false], # 8
561
+ 0x008 => [ "ROW", 0, 1, "V", "R", false], # 9
562
+ 0x009 => [ "COLUMN", 0, 1, "V", "R", false], # 10
563
+ 0x00a => [ "NA", 0, 0, "V", "-", false], # 11
564
+ 0x00b => [ "NPV", 2, 30, "V", "V R ...", false], # 12
565
+ 0x00c => [ "STDEV", 1, 30, "V", "R ...", false], # 13
566
+ 0x00d => [ "DOLLAR", 1, 2, "V", "V V", false], # 14
567
+ 0x00e => [ "FIXED", 2, 3, "V", "V V V", false], # 15
568
+ 0x00f => [ "SIN", 1, 1, "V", "V", false], # 16
569
+ 0x010 => [ "COS", 1, 1, "V", "V", false], # 17
570
+ 0x011 => [ "TAN", 1, 1, "V", "V", false], # 18
571
+ 0x012 => [ "ARCTAN", 1, 1, "V", "V", false], # 19
572
+ 0x013 => [ "PI", 0, 0, "V", "-", false], # 20
573
+ 0x014 => [ "SQRT", 1, 1, "V", "V", false], # 21
574
+ 0x015 => [ "EXP", 1, 1, "V", "V", false], # 22
575
+ 0x016 => [ "LN", 1, 1, "V", "V", false], # 23
576
+ 0x017 => [ "LOG10", 1, 1, "V", "V", false], # 24
577
+ 0x018 => [ "ABS", 1, 1, "V", "V", false], # 25
578
+ 0x019 => [ "INT", 1, 1, "V", "V", false], # 26
579
+ 0x01a => [ "SIGN", 1, 1, "V", "V", false], # 27
580
+ 0x01b => [ "ROUND", 2, 2, "V", "V V", false], # 28
581
+ 0x01c => [ "LOOKUP", 2, 3, "V", "V R R", false], # 29
582
+ 0x01d => [ "INDEX", 2, 4, "R", "R V V V", false], # 30
583
+ 0x01e => [ "REPT", 2, 2, "V", "V V", false], # 31
584
+ 0x01f => [ "MID", 3, 3, "V", "V V V", false], # 32
585
+ 0x020 => [ "LEN", 1, 1, "V", "V", false], # 33
586
+ 0x021 => [ "VALUE", 1, 1, "V", "V", false], # 34
587
+ 0x022 => [ "TRUE", 0, 0, "V", "-", false], # 35
588
+ 0x023 => [ "FALSE", 0, 0, "V", "-", false], # 36
589
+ 0x024 => [ "AND", 1, 30, "V", "R ...", false], # 37
590
+ 0x025 => [ "OR", 1, 30, "V", "R ...", false], # 38
591
+ 0x026 => [ "NOT", 1, 1, "V", "V", false], # 39
592
+ 0x027 => [ "MOD", 2, 2, "V", "V V", false], # 40
593
+ 0x028 => [ "DCOUNT", 3, 3, "V", "R R R", false], # 41
594
+ 0x029 => [ "DSUM", 3, 3, "V", "R R R", false], # 42
595
+ 0x02a => [ "DAVERAGE", 3, 3, "V", "R R R", false], # 43
596
+ 0x02b => [ "DMIN", 3, 3, "V", "R R R", false], # 44
597
+ 0x02c => [ "DMAX", 3, 3, "V", "R R R", false], # 45
598
+ 0x02d => [ "DSTDEV", 3, 3, "V", "R R R", false], # 46
599
+ 0x02e => [ "VAR", 1, 30, "V", "R ...", false], # 47
600
+ 0x02f => [ "DVAR", 3, 3, "V", "R R R", false], # 48
601
+ 0x030 => [ "TEXT", 2, 2, "V", "V V", false], # 49
602
+ 0x031 => [ "LINEST", 1, 4, "A", "R R V V", false], # 50
603
+ 0x032 => [ "TREND", 1, 4, "A", "R R R V", false], # 51
604
+ 0x033 => [ "LOGEST", 1, 4, "A", "R R V V", false], # 52
605
+ 0x034 => [ "GROWTH", 1, 4, "A", "R R R V", false], # 53
606
+ 0x038 => [ "PV", 3, 5, "V", "V V V V V", false], # 54
607
+ 0x039 => [ "FV", 3, 5, "V", "V V V V V", false], # 55
608
+ 0x03a => [ "NPER", 3, 5, "V", "V V V V V", false], # 56
609
+ 0x03b => [ "PMT", 3, 5, "V", "V V V V V", false], # 57
610
+ 0x03c => [ "RATE", 3, 6, "V", "V V V V V V", false], # 58
611
+ 0x03d => [ "MIRR", 3, 3, "V", "R V V", false], # 59
612
+ 0x03e => [ "IRR", 1, 2, "V", "R V", false], # 60
613
+ 0x03f => [ "RAND", 0, 0, "V", "-", true], # 61
614
+ 0x040 => [ "MATCH", 2, 3, "V", "V R R", false], # 62
615
+ 0x041 => [ "DATE", 3, 3, "V", "V V V", false], # 63
616
+ 0x042 => [ "TIME", 3, 3, "V", "V V V", false], # 64
617
+ 0x043 => [ "DAY", 1, 1, "V", "V", false], # 65
618
+ 0x044 => [ "MONTH", 1, 1, "V", "V", false], # 66
619
+ 0x045 => [ "YEAR", 1, 1, "V", "V", false], # 67
620
+ 0x046 => [ "WEEKDAY", 1, 2, "V", "V V", false], # 68
621
+ 0x047 => [ "HOUR", 1, 1, "V", "V", false], # 69
622
+ 0x048 => [ "MINUTE", 1, 1, "V", "V", false], # 70
623
+ 0x049 => [ "SECOND", 1, 1, "V", "V", false], # 71
624
+ 0x04a => [ "NOW", 0, 0, "V", "-", true], # 72
625
+ 0x04b => [ "AREAS", 1, 1, "V", "R", false], # 73
626
+ 0x04c => [ "ROWS", 1, 1, "V", "R", false], # 74
627
+ 0x04d => [ "COLUMNS", 1, 1, "V", "R", false], # 75
628
+ 0x04e => [ "OFFSET", 3, 5, "R", "R V V V V", true], # 76
629
+ 0x052 => [ "SEARCH", 2, 3, "V", "V V V", false], # 77
630
+ 0x053 => [ "TRANSPOSE", 1, 1, "A", "A", false], # 78
631
+ 0x056 => [ "TYPE", 1, 1, "V", "V", false], # 79
632
+ 0x061 => [ "ATAN2", 2, 2, "V", "V V", false], # 80
633
+ 0x062 => [ "ASIN", 1, 1, "V", "V", false], # 81
634
+ 0x063 => [ "ACOS", 1, 1, "V", "V", false], # 82
635
+ 0x064 => [ "CHOOSE", 2, 30, "R", "V R ...", false], # 83
636
+ 0x065 => [ "HLOOKUP", 3, 4, "V", "V R R V", false], # 84
637
+ 0x066 => [ "VLOOKUP", 3, 4, "V", "V R R V", false], # 85
638
+ 0x069 => [ "ISREF", 1, 1, "V", "R", false], # 86
639
+ 0x06d => [ "LOG", 1, 2, "V", "V V", false], # 87
640
+ 0x06f => [ "CHAR", 1, 1, "V", "V", false], # 88
641
+ 0x070 => [ "LOWER", 1, 1, "V", "V", false], # 89
642
+ 0x071 => [ "UPPER", 1, 1, "V", "V", false], # 90
643
+ 0x072 => [ "PROPER", 1, 1, "V", "V", false], # 91
644
+ 0x073 => [ "LEFT", 1, 2, "V", "V V", false], # 92
645
+ 0x074 => [ "RIGHT", 1, 2, "V", "V V", false], # 93
646
+ 0x075 => [ "EXACT", 2, 2, "V", "V V", false], # 94
647
+ 0x076 => [ "TRIM", 1, 1, "V", "V", false], # 95
648
+ 0x077 => [ "REPLACE", 4, 4, "V", "V V V V", false], # 96
649
+ 0x078 => [ "SUBSTITUTE", 3, 4, "V", "V V V V", false], # 97
650
+ 0x079 => [ "CODE", 1, 1, "V", "V", false], # 98
651
+ 0x07c => [ "FIND", 2, 3, "V", "V V V", false], # 99
652
+ 0x07d => [ "CELL", 1, 2, "V", "V R", true], # 100
653
+ 0x07e => [ "ISERR", 1, 1, "V", "V", false], # 101
654
+ 0x07f => [ "ISTEXT", 1, 1, "V", "V", false], # 102
655
+ 0x080 => [ "ISNUMBER", 1, 1, "V", "V", false], # 103
656
+ 0x081 => [ "ISBLANK", 1, 1, "V", "V", false], # 104
657
+ 0x082 => [ "T", 1, 1, "V", "R", false], # 105
658
+ 0x083 => [ "N", 1, 1, "V", "R", false], # 106
659
+ 0x08c => [ "DATEVALUE", 1, 1, "V", "V", false], # 107
660
+ 0x08d => [ "TIMEVALUE", 1, 1, "V", "V", false], # 108
661
+ 0x08e => [ "SLN", 3, 3, "V", "V V V", false], # 109
662
+ 0x08f => [ "SYD", 4, 4, "V", "V V V V", false], # 110
663
+ 0x090 => [ "DDB", 4, 5, "V", "V V V V V", false], # 111
664
+ 0x094 => [ "INDIRECT", 1, 2, "R", "V V", true], # 112
665
+ 0x0a2 => [ "CLEAN", 1, 1, "V", "V", false], # 113
666
+ 0x0a3 => [ "MDETERM", 1, 1, "V", "A", false], # 114
667
+ 0x0a4 => [ "MINVERSE", 1, 1, "A", "A", false], # 115
668
+ 0x0a5 => [ "MMULT", 2, 2, "A", "A A", false], # 116
669
+ 0x0a7 => [ "IPMT", 4, 6, "V", "V V V V V V", false], # 117
670
+ 0x0a8 => [ "PPMT", 4, 6, "V", "V V V V V V", false], # 118
671
+ 0x0a9 => [ "COUNTA", 0, 30, "V", "R ...", false], # 119
672
+ 0x0b7 => [ "PRODUCT", 0, 30, "V", "R ...", false], # 120
673
+ 0x0b8 => [ "FACT", 1, 1, "V", "V", false], # 121
674
+ 0x0bf => [ "DPRODUCT", 3, 3, "V", "R R R", false], # 122
675
+ 0x0c0 => [ "ISNONTEXT", 1, 1, "V", "V", false], # 123
676
+ 0x0c1 => [ "STDEVP", 1, 30, "V", "R ...", false], # 124
677
+ 0x0c2 => [ "VARP", 1, 30, "V", "R ...", false], # 125
678
+ 0x0c3 => [ "DSTDEVP", 3, 3, "V", "R R R", false], # 126
679
+ 0x0c4 => [ "DVARP", 3, 3, "V", "R R R", false], # 127
680
+ 0x0c5 => [ "TRUNC", 1, 2, "V", "V V", false], # 128
681
+ 0x0c6 => [ "ISLOGICAL", 1, 1, "V", "V", false], # 129
682
+ 0x0c7 => [ "DCOUNTA", 3, 3, "V", "R R R", false], # 130
683
+ 0x0cc => [ "USDOLLAR", 1, 2, "V", "V V", false], # 131
684
+ 0x0cd => [ "FINDB", 2, 3, "V", "V V V", false], # 132
685
+ 0x0ce => [ "SEARCHB", 2, 3, "V", "V V V", false], # 133
686
+ 0x0cf => [ "REPLACEB", 4, 4, "V", "V V V V", false], # 134
687
+ 0x0d0 => [ "LEFTB", 1, 2, "V", "V V", false], # 135
688
+ 0x0d1 => [ "RIGHTB", 1, 2, "V", "V V", false], # 136
689
+ 0x0d2 => [ "MIDB", 3, 3, "V", "V V V", false], # 137
690
+ 0x0d3 => [ "LENB", 1, 1, "V", "V", false], # 138
691
+ 0x0d4 => [ "ROUNDUP", 2, 2, "V", "V V", false], # 139
692
+ 0x0d5 => [ "ROUNDDOWN", 2, 2, "V", "V V", false], # 140
693
+ 0x0d6 => [ "ASC", 1, 1, "V", "V", false], # 141
694
+ 0x0d7 => [ "DBSC", 1, 1, "V", "V", false], # 142
695
+ 0x0d8 => [ "RANK", 2, 3, "V", "V R V", false], # 143
696
+ 0x0db => [ "ADDRESS", 2, 5, "V", "V V V V V", false], # 144
697
+ 0x0dc => [ "DAYS360", 2, 3, "V", "V V V", false], # 145
698
+ 0x0dd => [ "TODAY", 0, 0, "V", "-", true], # 146
699
+ 0x0de => [ "VDB", 5, 7, "V", "V V V V V V V", false], # 147
700
+ 0x0e3 => [ "MEDIAN", 1, 30, "V", "R ...", false], # 148
701
+ 0x0e4 => [ "SUMPRODUCT", 1, 30, "V", "A ...", false], # 149
702
+ 0x0e5 => [ "SINH", 1, 1, "V", "V", false], # 150
703
+ 0x0e6 => [ "COSH", 1, 1, "V", "V", false], # 151
704
+ 0x0e7 => [ "TANH", 1, 1, "V", "V", false], # 152
705
+ 0x0e8 => [ "ASINH", 1, 1, "V", "V", false], # 153
706
+ 0x0e9 => [ "ACOSH", 1, 1, "V", "V", false], # 154
707
+ 0x0ea => [ "ATANH", 1, 1, "V", "V", false], # 155
708
+ 0x0eb => [ "DGET", 3, 3, "V", "R R R", false], # 156
709
+ 0x0f4 => [ "INFO", 1, 1, "V", "V", false], # 157
710
+ 0x0f7 => [ "DB", 4, 5, "V", "V V V V V", false], # 158
711
+ 0x0fc => [ "FREQUENCY", 2, 2, "A", "R R", false], # 159
712
+ 0x105 => [ "ERROR.TYPE", 1, 1, "V", "V", false], # 160
713
+ 0x10d => [ "AVEDEV", 1, 30, "V", "R ...", false], # 161
714
+ 0x10e => [ "BETADIST", 3, 5, "V", "V V V V V", false], # 162
715
+ 0x10f => [ "GAMMALN", 1, 1, "V", "V", false], # 163
716
+ 0x110 => [ "BETAINV", 3, 5, "V", "V V V V V", false], # 164
717
+ 0x111 => [ "BINOMDIST", 4, 4, "V", "V V V V", false], # 165
718
+ 0x112 => [ "CHIDIST", 2, 2, "V", "V V", false], # 166
719
+ 0x113 => [ "CHIINV", 2, 2, "V", "V V", false], # 167
720
+ 0x114 => [ "COMBIN", 2, 2, "V", "V V", false], # 168
721
+ 0x115 => [ "CONFIDENCE", 3, 3, "V", "V V V", false], # 169
722
+ 0x116 => [ "CRITBINOM", 3, 3, "V", "V V V", false], # 170
723
+ 0x117 => [ "EVEN", 1, 1, "V", "V", false], # 171
724
+ 0x118 => [ "EXPONDIST", 3, 3, "V", "V V V", false], # 172
725
+ 0x119 => [ "FDIST", 3, 3, "V", "V V V", false], # 173
726
+ 0x11a => [ "FINV", 3, 3, "V", "V V V", false], # 174
727
+ 0x11b => [ "FISHER", 1, 1, "V", "V", false], # 175
728
+ 0x11c => [ "FISHERINV", 1, 1, "V", "V", false], # 176
729
+ 0x11d => [ "FLOOR", 2, 2, "V", "V V", false], # 177
730
+ 0x11e => [ "GAMMADIST", 4, 4, "V", "V V V V", false], # 178
731
+ 0x11f => [ "GAMMAINV", 3, 3, "V", "V V V", false], # 179
732
+ 0x120 => [ "CEILING", 2, 2, "V", "V V", false], # 180
733
+ 0x121 => [ "HYPGEOMVERT", 4, 4, "V", "V V V V", false], # 181
734
+ 0x122 => [ "LOGNORMDIST", 3, 3, "V", "V V V", false], # 182
735
+ 0x123 => [ "LOGINV", 3, 3, "V", "V V V", false], # 183
736
+ 0x124 => ["NEGBINOMDIST", 3, 3, "V", "V V V", false], # 184
737
+ 0x125 => [ "NORMDIST", 4, 4, "V", "V V V V", false], # 185
738
+ 0x126 => [ "NORMSDIST", 1, 1, "V", "V", false], # 186
739
+ 0x127 => [ "NORMINV", 3, 3, "V", "V V V", false], # 187
740
+ 0x128 => [ "MNORMSINV", 1, 1, "V", "V", false], # 188
741
+ 0x129 => [ "STANDARDIZE", 3, 3, "V", "V V V", false], # 189
742
+ 0x12a => [ "ODD", 1, 1, "V", "V", false], # 190
743
+ 0x12b => [ "PERMUT", 2, 2, "V", "V V", false], # 191
744
+ 0x12c => [ "POISSON", 3, 3, "V", "V V V", false], # 192
745
+ 0x12d => [ "TDIST", 3, 3, "V", "V V V", false], # 193
746
+ 0x12e => [ "WEIBULL", 4, 4, "V", "V V V V", false], # 194
747
+ 0x12f => [ "SUMXMY2", 2, 2, "V", "A A", false], # 195
748
+ 0x130 => [ "SUMX2MY2", 2, 2, "V", "A A", false], # 196
749
+ 0x131 => [ "SUMX2PY2", 2, 2, "V", "A A", false], # 197
750
+ 0x132 => [ "CHITEST", 2, 2, "V", "A A", false], # 198
751
+ 0x133 => [ "CORREL", 2, 2, "V", "A A", false], # 199
752
+ 0x134 => [ "COVAR", 2, 2, "V", "A A", false], # 200
753
+ 0x135 => [ "FORECAST", 3, 3, "V", "V A A", false], # 201
754
+ 0x136 => [ "FTEST", 2, 2, "V", "A A", false], # 202
755
+ 0x137 => [ "INTERCEPT", 2, 2, "V", "A A", false], # 203
756
+ 0x138 => [ "PEARSON", 2, 2, "V", "A A", false], # 204
757
+ 0x139 => [ "RSQ", 2, 2, "V", "A A", false], # 205
758
+ 0x13a => [ "STEYX", 2, 2, "V", "A A", false], # 206
759
+ 0x13b => [ "SLOPE", 2, 2, "V", "A A", false], # 207
760
+ 0x13c => [ "TTEST", 4, 4, "V", "A A V V", false], # 208
761
+ 0x13d => [ "PROB", 3, 4, "V", "A A V V", false], # 209
762
+ 0x13e => [ "DEVSQ", 1, 30, "V", "R ...", false], # 210
763
+ 0x13f => [ "GEOMEAN", 1, 30, "V", "R ...", false], # 211
764
+ 0x140 => [ "HARMEAN", 1, 30, "V", "R ...", false], # 212
765
+ 0x141 => [ "SUMSQ", 0, 30, "V", "R ...", false], # 213
766
+ 0x142 => [ "KURT", 1, 30, "V", "R ...", false], # 214
767
+ 0x143 => [ "SKEW", 1, 30, "V", "R ...", false], # 215
768
+ 0x144 => [ "ZTEST", 2, 3, "V", "R V V", false], # 216
769
+ 0x145 => [ "LARGE", 2, 2, "V", "R V", false], # 217
770
+ 0x146 => [ "SMALL", 2, 2, "V", "R V", false], # 218
771
+ 0x147 => [ "QUARTILE", 2, 2, "V", "R V", false], # 219
772
+ 0x148 => [ "PERCENTILE", 2, 2, "V", "R V", false], # 220
773
+ 0x149 => [ "PERCENTRANK", 2, 3, "V", "R V V", false], # 221
774
+ 0x14a => [ "MODE", 1, 30, "V", "A ...", false], # 222
775
+ 0x14b => [ "TRIMMEAN", 2, 2, "V", "R V", false], # 223
776
+ 0x14c => [ "TINV", 2, 2, "V", "V V", false], # 224
777
+ 0x150 => [ "CONCATENATE", 0, 30, "V", "V ...", false], # 225
778
+ 0x151 => [ "POWER", 2, 2, "V", "V V", false], # 226
779
+ 0x156 => [ "RADIANS", 1, 1, "V", "V", false], # 227
780
+ 0x157 => [ "DEGREES", 1, 1, "V", "V", false], # 228
781
+ 0x158 => [ "SUBTOTAL", 2, 30, "V", "V R ...", false], # 229
782
+ 0x159 => [ "SUMIF", 2, 3, "V", "R V R", false], # 230
783
+ 0x15a => [ "COUNTIF", 2, 2, "V", "R V", false], # 231
784
+ 0x15b => [ "COUNTBLANK", 1, 1, "V", "R", false], # 232
785
+ 0x15e => [ "ISPMT", 4, 4, "V", "V V V V", false], # 233
786
+ 0x15f => [ "DATEDIF", 3, 3, "V", "V V V", false], # 234
787
+ 0x160 => [ "DATESTRING", 1, 1, "V", "V", false], # 235
788
+ 0x161 => ["NUMBERSTRING", 2, 2, "V", "V V", false], # 236
789
+ 0x162 => [ "ROMAN", 1, 2, "V", "V V", false], # 237
790
+ 0x166 => ["GETPIVOTDATA", 2, 30, "A", "-", false], # 238
791
+ 0x167 => [ "HYPERLINK", 1, 2, "V", "V V", false], # 239
792
+ 0x168 => [ "PHONETIC", 1, 1, "V", "R", false], # 240
793
+ 0x169 => [ "AVERAGEA", 1, 30, "V", "R ...", false], # 241
794
+ 0x16a => [ "MAXA", 1, 30, "V", "R ...", false], # 242
795
+ 0x16b => [ "MINA", 1, 30, "V", "R ...", false], # 243
796
+ 0x16c => [ "STDEVPA", 1, 30, "V", "R ...", false], # 244
797
+ 0x16d => [ "VARPA", 1, 30, "V", "R ...", false], # 245
798
+ 0x16e => [ "STDEVA", 1, 30, "V", "R ...", false], # 246
799
+ 0x16f => [ "VARA", 1, 30, "V", "R ...", false] # 247
800
+ }
801
+
802
+
803
+ # Formulas Parse things
804
+
805
+ PTGEXP = 0x01
806
+ PTGTBL = 0x02
807
+ PTGADD = 0x03
808
+ PTGSUB = 0x04
809
+ PTGMUL = 0x05
810
+ PTGDIV = 0x06
811
+ PTGPOWER = 0x07
812
+ PTGCONCAT = 0x08
813
+ PTGLT = 0x09
814
+ PTGLE = 0x0a
815
+ PTGEQ = 0x0b
816
+ PTGGE = 0x0c
817
+ PTGGT = 0x0d
818
+ PTGNE = 0x0e
819
+ PTGISECT = 0x0f
820
+ PTGUNION = 0x10
821
+ PTGRANGE = 0x11
822
+ PTGUPLUS = 0x12
823
+ PTGUMINUS = 0x13
824
+ PTGPERCENT = 0x14
825
+ PTGPAREN = 0x15
826
+ PTGMISSARG = 0x16
827
+ PTGSTR = 0x17
828
+ PTGEXTEND = 0x18
829
+ PTGATTR = 0x19
830
+ PTGSHEET = 0x1a
831
+ PTGENDSHEET = 0x1b
832
+ PTGERR = 0x1c
833
+ PTGBOOL = 0x1d
834
+ PTGINT = 0x1e
835
+ PTGNUM = 0x1f
836
+
837
+ PTGARRAYR = 0x20
838
+ PTGFUNCR = 0x21
839
+ PTGFUNCVARR = 0x22
840
+ PTGNAMER = 0x23
841
+ PTGREFR = 0x24
842
+ PTGAREAR = 0x25
843
+ PTGMEMAREAR = 0x26
844
+ PTGMEMERRR = 0x27
845
+ PTGMEMNOMEMR = 0x28
846
+ PTGMEMFUNCR = 0x29
847
+ PTGREFERRR = 0x2a
848
+ PTGAREAERRR = 0x2b
849
+ PTGREFNR = 0x2c
850
+ PTGAREANR = 0x2d
851
+ PTGMEMAREANR = 0x2e
852
+ PTGMEMNOMEMNR = 0x2f
853
+ PTGNAMEXR = 0x39
854
+ PTGREF3DR = 0x3a
855
+ PTGAREA3DR = 0x3b
856
+ PTGREFERR3DR = 0x3c
857
+ PTGAREAERR3DR = 0x3d
858
+
859
+ PTGARRAYV = 0x40
860
+ PTGFUNCV = 0x41
861
+ PTGFUNCVARV = 0x42
862
+ PTGNAMEV = 0x43
863
+ PTGREFV = 0x44
864
+ PTGAREAV = 0x45
865
+ PTGMEMAREAV = 0x46
866
+ PTGMEMERRV = 0x47
867
+ PTGMEMNOMEMV = 0x48
868
+ PTGMEMFUNCV = 0x49
869
+ PTGREFERRV = 0x4a
870
+ PTGAREAERRV = 0x4b
871
+ PTGREFNV = 0x4c
872
+ PTGAREANV = 0x4d
873
+ PTGMEMAREANV = 0x4e
874
+ PTGMEMNOMEMNV = 0x4f
875
+ PTGFUNCCEV = 0x58
876
+ PTGNAMEXV = 0x59
877
+ PTGREF3DV = 0x5a
878
+ PTGAREA3DV = 0x5b
879
+ PTGREFERR3DV = 0x5c
880
+ PTGAREAERR3DV = 0x5d
881
+
882
+ PTGARRAYA = 0x60
883
+ PTGFUNCA = 0x61
884
+ PTGFUNCVARA = 0x62
885
+ PTGNAMEA = 0x63
886
+ PTGREFA = 0x64
887
+ PTGAREAA = 0x65
888
+ PTGMEMAREAA = 0x66
889
+ PTGMEMERRA = 0x67
890
+ PTGMEMNOMEMA = 0x68
891
+ PTGMEMFUNCA = 0x69
892
+ PTGREFERRA = 0x6a
893
+ PTGAREAERRA = 0x6b
894
+ PTGREFNA = 0x6c
895
+ PTGAREANA = 0x6d
896
+ PTGMEMAREANA = 0x6e
897
+ PTGMEMNOMEMNA = 0x6f
898
+ PTGFUNCCEA = 0x78
899
+ PTGNAMEXA = 0x79
900
+ PTGREF3DA = 0x7a
901
+ PTGAREA3DA = 0x7b
902
+ PTGREFERR3DA = 0x7c
903
+ PTGAREAERR3DA = 0x7d
904
+
905
+
906
+ PTG_NAMES = {
907
+ :ptgExp => "ptgExp",
908
+ :ptgTbl => "ptgTbl",
909
+ :ptgAdd => "ptgAdd",
910
+ :ptgSub => "ptgSub",
911
+ :ptgMul => "ptgMul",
912
+ :ptgDiv => "ptgDiv",
913
+ :ptgPower => "ptgPower",
914
+ :ptgConcat => "ptgConcat",
915
+ :ptgLT => "ptgLT",
916
+ :ptgLE => "ptgLE",
917
+ :ptgEQ => "ptgEQ",
918
+ :ptgGE => "ptgGE",
919
+ :ptgGT => "ptgGT",
920
+ :ptgNE => "ptgNE",
921
+ :ptgIsect => "ptgIsect",
922
+ :ptgUnion => "ptgUnion",
923
+ :ptgRange => "ptgRange",
924
+ :ptgUplus => "ptgUplus",
925
+ :ptgUminus => "ptgUminus",
926
+ :ptgPercent => "ptgPercent",
927
+ :ptgParen => "ptgParen",
928
+ :ptgMissArg => "ptgMissArg",
929
+ :ptgStr => "ptgStr",
930
+ :ptgExtend => "ptgExtend",
931
+ :ptgAttr => "ptgAttr",
932
+ :ptgSheet => "ptgSheet",
933
+ :ptgEndSheet => "ptgEndSheet",
934
+ :ptgErr => "ptgErr",
935
+ :ptgBool => "ptgBool",
936
+ :ptgInt => "ptgInt",
937
+ :ptgNum => "ptgNum",
938
+ :ptgArrayR => "ptgArrayR",
939
+ :ptgFuncR => "ptgFuncR",
940
+ :ptgFuncVarR => "ptgFuncVarR",
941
+ :ptgNameR => "ptgNameR",
942
+ :ptgRefR => "ptgRefR",
943
+ :ptgAreaR => "ptgAreaR",
944
+ :ptgMemAreaR => "ptgMemAreaR",
945
+ :ptgMemErrR => "ptgMemErrR",
946
+ :ptgMemNoMemR => "ptgMemNoMemR",
947
+ :ptgMemFuncR => "ptgMemFuncR",
948
+ :ptgRefErrR => "ptgRefErrR",
949
+ :ptgAreaErrR => "ptgAreaErrR",
950
+ :ptgRefNR => "ptgRefNR",
951
+ :ptgAreaNR => "ptgAreaNR",
952
+ :ptgMemAreaNR => "ptgMemAreaNR",
953
+ :ptgMemNoMemNR => "ptgMemNoMemNR",
954
+ :ptgNameXR => "ptgNameXR",
955
+ :ptgRef3dR => "ptgRef3dR",
956
+ :ptgArea3dR => "ptgArea3dR",
957
+ :ptgRefErr3dR => "ptgRefErr3dR",
958
+ :ptgAreaErr3dR => "ptgAreaErr3dR",
959
+ :ptgArrayV => "ptgArrayV",
960
+ :ptgFuncV => "ptgFuncV",
961
+ :ptgFuncVarV => "ptgFuncVarV",
962
+ :ptgNameV => "ptgNameV",
963
+ :ptgRefV => "ptgRefV",
964
+ :ptgAreaV => "ptgAreaV",
965
+ :ptgMemAreaV => "ptgMemAreaV",
966
+ :ptgMemErrV => "ptgMemErrV",
967
+ :ptgMemNoMemV => "ptgMemNoMemV",
968
+ :ptgMemFuncV => "ptgMemFuncV",
969
+ :ptgRefErrV => "ptgRefErrV",
970
+ :ptgAreaErrV => "ptgAreaErrV",
971
+ :ptgRefNV => "ptgRefNV",
972
+ :ptgAreaNV => "ptgAreaNV",
973
+ :ptgMemAreaNV => "ptgMemAreaNV",
974
+ :ptgMemNoMemNV => "ptgMemNoMemNV",
975
+ :ptgFuncCEV => "ptgFuncCEV",
976
+ :ptgNameXV => "ptgNameXV",
977
+ :ptgRef3dV => "ptgRef3dV",
978
+ :ptgArea3dV => "ptgArea3dV",
979
+ :ptgRefErr3dV => "ptgRefErr3dV",
980
+ :ptgAreaErr3dV => "ptgAreaErr3dV",
981
+ :ptgArrayA => "ptgArrayA",
982
+ :ptgFuncA => "ptgFuncA",
983
+ :ptgFuncVarA => "ptgFuncVarA",
984
+ :ptgNameA => "ptgNameA",
985
+ :ptgRefA => "ptgRefA",
986
+ :ptgAreaA => "ptgAreaA",
987
+ :ptgMemAreaA => "ptgMemAreaA",
988
+ :ptgMemErrA => "ptgMemErrA",
989
+ :ptgMemNoMemA => "ptgMemNoMemA",
990
+ :ptgMemFuncA => "ptgMemFuncA",
991
+ :ptgRefErrA => "ptgRefErrA",
992
+ :ptgAreaErrA => "ptgAreaErrA",
993
+ :ptgRefNA => "ptgRefNA",
994
+ :ptgAreaNA => "ptgAreaNA",
995
+ :ptgMemAreaNA => "ptgMemAreaNA",
996
+ :ptgMemNoMemNA => "ptgMemNoMemNA",
997
+ :ptgFuncCEA => "ptgFuncCEA",
998
+ :ptgNameXA => "ptgNameXA",
999
+ :ptgRef3dA => "ptgRef3dA",
1000
+ :ptgArea3dA => "ptgArea3dA",
1001
+ :ptgRefErr3dA => "ptgRefErr3dA",
1002
+ :ptgAreaErr3dA => "ptgAreaErr3dA"
1003
+ }
1004
+
1005
+
1006
+ ERROR_MSG_BY_CODE = {
1007
+ 0x00 => "#NULL!", # intersection of two cell ranges is empty
1008
+ 0x07 => "#DIV/0!", # division by zero
1009
+ 0x0F => "#VALUE!", # wrong type of operand
1010
+ 0x17 => "#REF!", # illegal or deleted cell reference
1011
+ 0x1D => "#NAME?", # wrong function or range name
1012
+ 0x24 => "#NUM!", # value range overflow
1013
+ 0x2A => "#N/A!" # argument or function not available
1014
+ }
1015
+
1016
+ end