slayer-surpass 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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