WriteExcel 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +47 -0
  6. data/VERSION +1 -0
  7. data/examples/a_simple.rb +42 -0
  8. data/examples/autofilters.rb +266 -0
  9. data/examples/bigfile.rb +30 -0
  10. data/examples/copyformat.rb +51 -0
  11. data/examples/data_validate.rb +278 -0
  12. data/examples/date_time.rb +86 -0
  13. data/examples/demo.rb +118 -0
  14. data/examples/diag_border.rb +35 -0
  15. data/examples/formats.rb +489 -0
  16. data/examples/header.rb +136 -0
  17. data/examples/hidden.rb +28 -0
  18. data/examples/hyperlink.rb +42 -0
  19. data/examples/images.rb +52 -0
  20. data/examples/merge1.rb +39 -0
  21. data/examples/merge2.rb +44 -0
  22. data/examples/merge3.rb +65 -0
  23. data/examples/merge4.rb +82 -0
  24. data/examples/merge5.rb +79 -0
  25. data/examples/protection.rb +46 -0
  26. data/examples/regions.rb +52 -0
  27. data/examples/repeat.rb +42 -0
  28. data/examples/stats.rb +75 -0
  29. data/examples/stocks.rb +80 -0
  30. data/examples/tab_colors.rb +30 -0
  31. data/lib/WriteExcel.rb +30 -0
  32. data/lib/WriteExcel/biffwriter.rb +259 -0
  33. data/lib/WriteExcel/chart.rb +217 -0
  34. data/lib/WriteExcel/excelformula.y +138 -0
  35. data/lib/WriteExcel/excelformulaparser.rb +573 -0
  36. data/lib/WriteExcel/format.rb +1108 -0
  37. data/lib/WriteExcel/formula.rb +986 -0
  38. data/lib/WriteExcel/olewriter.rb +322 -0
  39. data/lib/WriteExcel/properties.rb +250 -0
  40. data/lib/WriteExcel/storage_lite.rb +590 -0
  41. data/lib/WriteExcel/workbook.rb +2602 -0
  42. data/lib/WriteExcel/worksheet.rb +6378 -0
  43. data/spec/WriteExcel_spec.rb +7 -0
  44. data/spec/spec.opts +1 -0
  45. data/spec/spec_helper.rb +9 -0
  46. data/test/tc_all.rb +31 -0
  47. data/test/tc_biff.rb +104 -0
  48. data/test/tc_chart.rb +22 -0
  49. data/test/tc_example_match.rb +1280 -0
  50. data/test/tc_format.rb +1264 -0
  51. data/test/tc_formula.rb +63 -0
  52. data/test/tc_ole.rb +110 -0
  53. data/test/tc_storage_lite.rb +102 -0
  54. data/test/tc_workbook.rb +115 -0
  55. data/test/tc_worksheet.rb +115 -0
  56. data/test/test_00_IEEE_double.rb +14 -0
  57. data/test/test_01_add_worksheet.rb +12 -0
  58. data/test/test_02_merge_formats.rb +58 -0
  59. data/test/test_04_dimensions.rb +397 -0
  60. data/test/test_05_rows.rb +182 -0
  61. data/test/test_06_extsst.rb +80 -0
  62. data/test/test_11_date_time.rb +484 -0
  63. data/test/test_12_date_only.rb +506 -0
  64. data/test/test_13_date_seconds.rb +486 -0
  65. data/test/test_21_escher.rb +629 -0
  66. data/test/test_22_mso_drawing_group.rb +739 -0
  67. data/test/test_23_note.rb +78 -0
  68. data/test/test_24_txo.rb +80 -0
  69. data/test/test_26_autofilter.rb +327 -0
  70. data/test/test_27_autofilter.rb +144 -0
  71. data/test/test_28_autofilter.rb +174 -0
  72. data/test/test_29_process_jpg.rb +131 -0
  73. data/test/test_30_validation_dval.rb +82 -0
  74. data/test/test_31_validation_dv_strings.rb +131 -0
  75. data/test/test_32_validation_dv_formula.rb +211 -0
  76. data/test/test_40_property_types.rb +191 -0
  77. data/test/test_41_properties.rb +238 -0
  78. data/test/test_42_set_properties.rb +430 -0
  79. data/test/ts_all.rb +34 -0
  80. metadata +154 -0
@@ -0,0 +1,217 @@
1
+ ###############################################################################
2
+ #
3
+ # Chart - A writer class for Excel Charts.
4
+ #
5
+ #
6
+ # Used in conjunction with Spreadsheet::WriteExcel
7
+ #
8
+ # Copyright 2000-2008, John McNamara, jmcnamara@cpan.org
9
+ #
10
+ # original written in Perl by John McNamara
11
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
12
+ #
13
+
14
+ #require 'WriteExcel/biffwriter'
15
+
16
+ class Chart
17
+
18
+
19
+ attr_reader :name
20
+
21
+
22
+ ###############################################################################
23
+ #
24
+ # new()
25
+ #
26
+ # Constructor. Creates a new Chart object from a BIFFwriter object
27
+ #
28
+ def initialize(filename, name, index, encoding, activesheet, firstsheet)
29
+ @filename = filename
30
+ @name = name
31
+ @index = index
32
+ @encoding = encoding
33
+ @activesheet = activesheet
34
+ @firstsheet = firstsheet
35
+
36
+ @type = 0x0200
37
+ @ext_sheets = []
38
+ @using_tmpfile = 1
39
+ @filehandle = ""
40
+ @fileclosed = false
41
+ @offset = 0
42
+ @xls_rowmax = 0
43
+ @xls_colmax = 0
44
+ @xls_strmax = 0
45
+ @dim_rowmin = 0
46
+ @dim_rowmax = 0
47
+ @dim_colmin = 0
48
+ @dim_colmax = 0
49
+ @dim_changed = 0
50
+ @colinfo = []
51
+ @selection = [0, 0]
52
+ @panes = []
53
+ @active_pane = 3
54
+ @frozen = 0
55
+ @selected = 0
56
+ @hidden = 0
57
+
58
+ @paper_size = 0x0
59
+ @orientation = 0x1
60
+ @header = ''
61
+ @footer = ''
62
+ @hcenter = 0
63
+ @vcenter = 0
64
+ @margin_head = 0.50
65
+ @margin_foot = 0.50
66
+ @margin_left = 0.75
67
+ @margin_right = 0.75
68
+ @margin_top = 1.00
69
+ @margin_bottom = 1.00
70
+
71
+ @title_rowmin = nil
72
+ @title_rowmax = nil
73
+ @title_colmin = nil
74
+ @title_colmax = nil
75
+ @print_rowmin = nil
76
+ @print_rowmax = nil
77
+ @print_colmin = nil
78
+ @print_colmax = nil
79
+
80
+ @print_gridlines = 1
81
+ @screen_gridlines = 1
82
+ @print_headers = 0
83
+
84
+ @fit_page = 0
85
+ @fit_width = 0
86
+ @fit_height = 0
87
+
88
+ @hbreaks = []
89
+ @vbreaks = []
90
+
91
+ @protect = 0
92
+ @password = nil
93
+
94
+ @col_sizes = {}
95
+ @row_sizes = {}
96
+
97
+ @col_formats = {}
98
+ @row_formats = {}
99
+
100
+ @zoom = 100
101
+ @print_scale = 100
102
+
103
+ @leading_zeros = 0
104
+
105
+ @outline_row_level = 0
106
+ @outline_style = 0
107
+ @outline_below = 1
108
+ @outline_right = 1
109
+ @outline_on = 1
110
+
111
+ _initialize
112
+ end
113
+
114
+ ###############################################################################
115
+ #
116
+ # get_data().
117
+ #
118
+ # Retrieves data from memory in one chunk, or from disk in $buffer
119
+ # sized chunks.
120
+ #
121
+ def get_data
122
+ buffer = 4096
123
+
124
+ return tmp if read(@filehandle, tmp, buffer)
125
+
126
+ # No data to return
127
+ return nil
128
+ end
129
+
130
+
131
+ ###############################################################################
132
+ #
133
+ # select()
134
+ #
135
+ # Set this worksheet as a selected worksheet, i.e. the worksheet has its tab
136
+ # highlighted.
137
+ #
138
+ def select
139
+ @hidden = 0 # Selected worksheet can't be hidden.
140
+ @selected = 1
141
+ end
142
+
143
+
144
+ ###############################################################################
145
+ #
146
+ # activate()
147
+ #
148
+ # Set this worksheet as the active worksheet, i.e. the worksheet that is
149
+ # displayed when the workbook is opened. Also set it as selected.
150
+ #
151
+ def activate
152
+ @hidden = 0 # Active worksheet can't be hidden.
153
+ @selected = 1
154
+ @activesheet = @index
155
+ end
156
+
157
+
158
+ ###############################################################################
159
+ #
160
+ # hide()
161
+ #
162
+ # Hide this worksheet.
163
+ #
164
+ def hide
165
+ @hidd = 1
166
+
167
+ # A hidden worksheet shouldn't be active or selected.
168
+ @selecte = 0
169
+ @activesheet = 0
170
+ @firstsheet = 0
171
+ end
172
+
173
+
174
+ ###############################################################################
175
+ #
176
+ # set_first_sheet()
177
+ #
178
+ # Set this worksheet as the first visible sheet. This is necessary
179
+ # when there are a large number of worksheets and the activated
180
+ # worksheet is not visible on the screen.
181
+ #
182
+ def set_first_sheet
183
+ hidden = 0 # Active worksheet can't be hidden.
184
+ firstsheet = index
185
+ end
186
+
187
+
188
+
189
+ ###############################################################################
190
+
191
+ private
192
+
193
+ ###############################################################################
194
+
195
+
196
+ ###############################################################################
197
+ #
198
+ # _initialize()
199
+ #
200
+ def _initialize
201
+ filehandle = open(@filename, "rb") or
202
+ die "Couldn't open #{@filename} in add_chart_ext(): $!.\n"
203
+ @filehandle = filehandle
204
+ @datasize = File.Stat.size(@filename)
205
+ end
206
+
207
+ ###############################################################################
208
+ #
209
+ # _close()
210
+ #
211
+ # Add data to the beginning of the workbook (note the reverse order)
212
+ # and to the end of the workbook.
213
+ #
214
+ def _close
215
+ end
216
+
217
+ end
@@ -0,0 +1,138 @@
1
+ #
2
+ # copyright (c) 2009 Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
3
+
4
+
5
+ class ExcelFormulaParser
6
+
7
+ prechigh
8
+ nonassoc UMINUS
9
+ right '^'
10
+ left '&'
11
+ left '*' '/'
12
+ left '+' '-'
13
+ left '<' '>' '<=' '>=' '<>'
14
+ left '='
15
+ preclow
16
+
17
+ rule
18
+
19
+ formula : expr_list
20
+
21
+ expr_list : { result = [] }
22
+ | expr_list expr EOL { result.push val[1], '_arg', '1' }
23
+ | expr_list EOL
24
+
25
+ expr : expr '+' expr { result = [ val[0], val[2], 'ptgAdd' ] }
26
+ | expr '-' expr { result = [ val[0], val[2], 'ptgSub' ] }
27
+ | expr '*' expr { result = [ val[0], val[2], 'ptgMul' ] }
28
+ | expr '/' expr { result = [ val[0], val[2], 'ptgDiv' ] }
29
+ | expr '^' expr { result = [ val[0], val[2], 'ptgPower' ] }
30
+ | expr '&' expr { result = [ val[0], val[2], 'ptgConcat' ] }
31
+ | expr LT expr { result = [ val[0], val[2], 'ptgLT' ] }
32
+ | expr GT expr { result = [ val[0], val[2], 'ptgGT' ] }
33
+ | expr LE expr { result = [ val[0], val[2], 'ptgLE' ] }
34
+ | expr GE expr { result = [ val[0], val[2], 'ptgGE' ] }
35
+ | expr NE expr { result = [ val[0], val[2], 'ptgNE' ] }
36
+ | expr '=' expr { result = [ val[0], val[2], 'ptgEQ' ] }
37
+ | primary
38
+
39
+ primary : '(' expr ')' { result = [ val[1], '_arg', '1', 'ptgParen'] }
40
+ | '-' expr = UMINUS { result = [ '_num', '-1', val[1], 'ptgMul' ] }
41
+ | FUNC
42
+ | NUMBER { result = [ '_num', val[0] ] }
43
+ | STRING { result = [ '_str', val[0] ] }
44
+ | REF2D { result = [ '_ref2d', val[0] ] }
45
+ | REF3D { result = [ '_ref3d', val[0] ] }
46
+ | RANGE2D { result = [ '_range2d', val[0] ] }
47
+ | RANGE3D { result = [ '_range3d', val[0] ] }
48
+ | TRUE { result = [ 'ptgBool', '1' ] }
49
+ | FALSE { result = [ 'ptgBool', '0' ] }
50
+ | funcall
51
+
52
+ funcall : FUNC '(' args ')' { result = [ '_class', val[0], val[2], '_arg', val[2].size.to_s, '_func', val[0] ] }
53
+ | FUNC '(' ')' { result = [ '_func', val[0] ] }
54
+
55
+ args : expr { result = val }
56
+ | args ',' expr { result.push val[2] }
57
+
58
+ end
59
+
60
+
61
+ ---- footer
62
+
63
+ class ExcelFormulaParserError < StandardError; end
64
+
65
+ class Node
66
+
67
+ def exec_list(nodes)
68
+ v = nil
69
+ nodes.each { |i| v = i.evaluate }
70
+ v
71
+ end
72
+
73
+ def excelformulaparser_error(msg)
74
+ raise ExcelFormulaParserError,
75
+ "in #{fname}:#{lineno}: #{msg}"
76
+ end
77
+
78
+ end
79
+
80
+ class RootNode < Node
81
+
82
+ def initialize(tree)
83
+ @tree = tree
84
+ end
85
+
86
+ def evaluate
87
+ exec_list @tree
88
+ end
89
+
90
+ end
91
+
92
+
93
+ class FuncallNode < Node
94
+
95
+ def initialize(func, args)
96
+ @func = func
97
+ @args = args
98
+ end
99
+
100
+ def evaluate
101
+ arg = @args.collect {|i| i.evaluate }
102
+ out = []
103
+ arg.each { |i| o.push i }
104
+ o.push @func
105
+ p o
106
+ end
107
+
108
+ end
109
+
110
+ class NumberNode < Node
111
+
112
+ def initialize(val)
113
+ @val = val
114
+ end
115
+
116
+ def evaluate
117
+ p @val
118
+ end
119
+
120
+ end
121
+
122
+ class OperateNode < Node
123
+
124
+ def initialize(op, left, right)
125
+ @op = op
126
+ @left = left
127
+ @right = right
128
+ end
129
+
130
+ def evaluate
131
+ o = []
132
+ o.push @left
133
+ o.push @right
134
+ o.push @op
135
+ p o
136
+ end
137
+ end
138
+
@@ -0,0 +1,573 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.6
4
+ # from Racc grammer file "".
5
+ #
6
+
7
+
8
+ class ExcelFormulaParser < Racc::Parser
9
+ ##### State transition tables begin ###
10
+
11
+ racc_action_table = [
12
+ 16, 52, 25, 27, 29, 31, 33, 20, 19, 3,
13
+ nil, 53, 22, 18, nil, 4, 5, 6, 8, 12,
14
+ 13, 14, 15, 17, 16, 25, 27, 29, 31, 33,
15
+ nil, 10, nil, nil, nil, 16, nil, 18, nil, 4,
16
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
17
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
18
+ 16, nil, 18, nil, 4, 5, 6, 8, 12, 13,
19
+ 14, 15, 17, 18, 16, 4, 5, 6, 8, 12,
20
+ 13, 14, 15, 17, nil, 16, nil, 18, nil, 4,
21
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
22
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
23
+ 16, nil, 18, 36, 4, 5, 6, 8, 12, 13,
24
+ 14, 15, 17, 18, 16, 4, 5, 6, 8, 12,
25
+ 13, 14, 15, 17, nil, 16, nil, 18, nil, 4,
26
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
27
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
28
+ 16, nil, 18, nil, 4, 5, 6, 8, 12, 13,
29
+ 14, 15, 17, 18, 16, 4, 5, 6, 8, 12,
30
+ 13, 14, 15, 17, nil, 16, nil, 18, nil, 4,
31
+ 5, 6, 8, 12, 13, 14, 15, 17, 18, 16,
32
+ 4, 5, 6, 8, 12, 13, 14, 15, 17, nil,
33
+ 16, nil, 18, nil, 4, 5, 6, 8, 12, 13,
34
+ 14, 15, 17, 18, nil, 4, 5, 6, 8, 12,
35
+ 13, 14, 15, 17, 22, 23, 26, 28, 30, 32,
36
+ nil, nil, nil, nil, nil, 21, nil, 25, 27, 29,
37
+ 31, 33, nil, 51, 22, 23, 26, 28, 30, 32,
38
+ 22, 23, 26, 28, nil, nil, nil, 25, 27, 29,
39
+ 31, 33, nil, 25, 27, 29, 31, 33, 22, 23,
40
+ 26, 28, nil, nil, nil, 22, 23, 26, 28, 30,
41
+ 32, 25, 27, 29, 31, 33, 21, 24, 25, 27,
42
+ 29, 31, 33, 22, 23, 26, 28, 30, 32, nil,
43
+ nil, nil, nil, nil, 21, nil, 25, 27, 29, 31,
44
+ 33, 22, 23, 26, 28, 30, 32, nil, nil, nil,
45
+ nil, nil, 21, nil, 25, 27, 29, 31, 33, 22,
46
+ 23, 26, 28, 30, 32, 22, nil, nil, nil, nil,
47
+ 21, nil, 25, 27, 29, 31, 33, nil, 25, 27,
48
+ 29, 31, 33, 22, 23, 26, 28, 30, 32, 22,
49
+ 23, nil, nil, nil, 21, nil, 25, 27, 29, 31,
50
+ 33, nil, 25, 27, 29, 31, 33, 22, 23, 26,
51
+ 28, 30, 32, 22, 23, nil, nil, nil, 21, nil,
52
+ 25, 27, 29, 31, 33, nil, 25, 27, 29, 31,
53
+ 33, 22, 23, 26, 28, 30, 32, nil, nil, nil,
54
+ nil, nil, 21, nil, 25, 27, 29, 31, 33, 22,
55
+ 23, 26, 28, 30, 32, nil, nil, nil, nil, nil,
56
+ 21, nil, 25, 27, 29, 31, 33 ]
57
+
58
+ racc_action_check = [
59
+ 33, 38, 34, 34, 34, 34, 34, 4, 3, 1,
60
+ nil, 38, 40, 33, nil, 33, 33, 33, 33, 33,
61
+ 33, 33, 33, 33, 2, 40, 40, 40, 40, 40,
62
+ nil, 2, nil, nil, nil, 53, nil, 2, nil, 2,
63
+ 2, 2, 2, 2, 2, 2, 2, 2, 53, 32,
64
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, nil,
65
+ 31, nil, 32, nil, 32, 32, 32, 32, 32, 32,
66
+ 32, 32, 32, 31, 16, 31, 31, 31, 31, 31,
67
+ 31, 31, 31, 31, nil, 18, nil, 16, nil, 16,
68
+ 16, 16, 16, 16, 16, 16, 16, 16, 18, 20,
69
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, nil,
70
+ 21, nil, 20, 20, 20, 20, 20, 20, 20, 20,
71
+ 20, 20, 20, 21, 22, 21, 21, 21, 21, 21,
72
+ 21, 21, 21, 21, nil, 23, nil, 22, nil, 22,
73
+ 22, 22, 22, 22, 22, 22, 22, 22, 23, 25,
74
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, nil,
75
+ 26, nil, 25, nil, 25, 25, 25, 25, 25, 25,
76
+ 25, 25, 25, 26, 27, 26, 26, 26, 26, 26,
77
+ 26, 26, 26, 26, nil, 28, nil, 27, nil, 27,
78
+ 27, 27, 27, 27, 27, 27, 27, 27, 28, 29,
79
+ 28, 28, 28, 28, 28, 28, 28, 28, 28, nil,
80
+ 30, nil, 29, nil, 29, 29, 29, 29, 29, 29,
81
+ 29, 29, 29, 30, nil, 30, 30, 30, 30, 30,
82
+ 30, 30, 30, 30, 35, 35, 35, 35, 35, 35,
83
+ nil, nil, nil, nil, nil, 35, nil, 35, 35, 35,
84
+ 35, 35, nil, 35, 39, 39, 39, 39, 39, 39,
85
+ 47, 47, 47, 47, nil, nil, nil, 39, 39, 39,
86
+ 39, 39, nil, 47, 47, 47, 47, 47, 49, 49,
87
+ 49, 49, nil, nil, nil, 7, 7, 7, 7, 7,
88
+ 7, 49, 49, 49, 49, 49, 7, 7, 7, 7,
89
+ 7, 7, 7, 37, 37, 37, 37, 37, 37, nil,
90
+ nil, nil, nil, nil, 37, nil, 37, 37, 37, 37,
91
+ 37, 48, 48, 48, 48, 48, 48, nil, nil, nil,
92
+ nil, nil, 48, nil, 48, 48, 48, 48, 48, 50,
93
+ 50, 50, 50, 50, 50, 41, nil, nil, nil, nil,
94
+ 50, nil, 50, 50, 50, 50, 50, nil, 41, 41,
95
+ 41, 41, 41, 42, 42, 42, 42, 42, 42, 43,
96
+ 43, nil, nil, nil, 42, nil, 42, 42, 42, 42,
97
+ 42, nil, 43, 43, 43, 43, 43, 44, 44, 44,
98
+ 44, 44, 44, 45, 45, nil, nil, nil, 44, nil,
99
+ 44, 44, 44, 44, 44, nil, 45, 45, 45, 45,
100
+ 45, 46, 46, 46, 46, 46, 46, nil, nil, nil,
101
+ nil, nil, 46, nil, 46, 46, 46, 46, 46, 54,
102
+ 54, 54, 54, 54, 54, nil, nil, nil, nil, nil,
103
+ 54, nil, 54, 54, 54, 54, 54 ]
104
+
105
+ racc_action_pointer = [
106
+ nil, 9, 16, 8, -14, nil, nil, 282, nil, nil,
107
+ nil, nil, nil, nil, nil, nil, 66, nil, 77, nil,
108
+ 91, 102, 116, 127, nil, 141, 152, 166, 177, 191,
109
+ 202, 52, 41, -8, -14, 231, nil, 300, -21, 251,
110
+ 9, 342, 360, 366, 384, 390, 408, 257, 318, 275,
111
+ 336, nil, nil, 27, 426 ]
112
+
113
+ racc_action_default = [
114
+ -2, -34, -1, -34, -20, -21, -22, -34, -23, -17,
115
+ -4, -29, -24, -25, -26, -27, -34, -28, -34, 55,
116
+ -34, -34, -34, -34, -3, -34, -34, -34, -34, -34,
117
+ -34, -34, -34, -34, -19, -34, -31, -32, -34, -16,
118
+ -9, -10, -11, -7, -12, -8, -13, -5, -14, -6,
119
+ -15, -18, -30, -34, -33 ]
120
+
121
+ racc_goto_table = [
122
+ 7, 1, 2, 38, nil, nil, nil, nil, nil, nil,
123
+ nil, nil, nil, nil, 34, nil, 35, nil, 37, 39,
124
+ 40, 41, nil, 42, 43, 44, 45, 46, 47, 48,
125
+ 49, 50, nil, nil, nil, nil, nil, nil, nil, nil,
126
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
127
+ nil, 54 ]
128
+
129
+ racc_goto_check = [
130
+ 3, 1, 2, 6, nil, nil, nil, nil, nil, nil,
131
+ nil, nil, nil, nil, 3, nil, 3, nil, 3, 3,
132
+ 3, 3, nil, 3, 3, 3, 3, 3, 3, 3,
133
+ 3, 3, nil, nil, nil, nil, nil, nil, nil, nil,
134
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
135
+ nil, 3 ]
136
+
137
+ racc_goto_pointer = [
138
+ nil, 1, 2, -2, nil, nil, -17 ]
139
+
140
+ racc_goto_default = [
141
+ nil, nil, nil, nil, 9, 11, nil ]
142
+
143
+ racc_reduce_table = [
144
+ 0, 0, :racc_error,
145
+ 1, 34, :_reduce_none,
146
+ 0, 35, :_reduce_2,
147
+ 3, 35, :_reduce_3,
148
+ 2, 35, :_reduce_none,
149
+ 3, 36, :_reduce_5,
150
+ 3, 36, :_reduce_6,
151
+ 3, 36, :_reduce_7,
152
+ 3, 36, :_reduce_8,
153
+ 3, 36, :_reduce_9,
154
+ 3, 36, :_reduce_10,
155
+ 3, 36, :_reduce_11,
156
+ 3, 36, :_reduce_12,
157
+ 3, 36, :_reduce_13,
158
+ 3, 36, :_reduce_14,
159
+ 3, 36, :_reduce_15,
160
+ 3, 36, :_reduce_16,
161
+ 1, 36, :_reduce_none,
162
+ 3, 37, :_reduce_18,
163
+ 2, 37, :_reduce_19,
164
+ 1, 37, :_reduce_none,
165
+ 1, 37, :_reduce_21,
166
+ 1, 37, :_reduce_22,
167
+ 1, 37, :_reduce_23,
168
+ 1, 37, :_reduce_24,
169
+ 1, 37, :_reduce_25,
170
+ 1, 37, :_reduce_26,
171
+ 1, 37, :_reduce_27,
172
+ 1, 37, :_reduce_28,
173
+ 1, 37, :_reduce_none,
174
+ 4, 38, :_reduce_30,
175
+ 3, 38, :_reduce_31,
176
+ 1, 39, :_reduce_32,
177
+ 3, 39, :_reduce_33 ]
178
+
179
+ racc_reduce_n = 34
180
+
181
+ racc_shift_n = 55
182
+
183
+ racc_token_table = {
184
+ false => 0,
185
+ :error => 1,
186
+ :UMINUS => 2,
187
+ "^" => 3,
188
+ "&" => 4,
189
+ "*" => 5,
190
+ "/" => 6,
191
+ "+" => 7,
192
+ "-" => 8,
193
+ "<" => 9,
194
+ ">" => 10,
195
+ "<=" => 11,
196
+ ">=" => 12,
197
+ "<>" => 13,
198
+ "=" => 14,
199
+ :EOL => 15,
200
+ :LT => 16,
201
+ :GT => 17,
202
+ :LE => 18,
203
+ :GE => 19,
204
+ :NE => 20,
205
+ "(" => 21,
206
+ ")" => 22,
207
+ :FUNC => 23,
208
+ :NUMBER => 24,
209
+ :STRING => 25,
210
+ :REF2D => 26,
211
+ :REF3D => 27,
212
+ :RANGE2D => 28,
213
+ :RANGE3D => 29,
214
+ :TRUE => 30,
215
+ :FALSE => 31,
216
+ "," => 32 }
217
+
218
+ racc_nt_base = 33
219
+
220
+ racc_use_result_var = true
221
+
222
+ Racc_arg = [
223
+ racc_action_table,
224
+ racc_action_check,
225
+ racc_action_default,
226
+ racc_action_pointer,
227
+ racc_goto_table,
228
+ racc_goto_check,
229
+ racc_goto_default,
230
+ racc_goto_pointer,
231
+ racc_nt_base,
232
+ racc_reduce_table,
233
+ racc_token_table,
234
+ racc_shift_n,
235
+ racc_reduce_n,
236
+ racc_use_result_var ]
237
+
238
+ Racc_token_to_s_table = [
239
+ "$end",
240
+ "error",
241
+ "UMINUS",
242
+ "\"^\"",
243
+ "\"&\"",
244
+ "\"*\"",
245
+ "\"/\"",
246
+ "\"+\"",
247
+ "\"-\"",
248
+ "\"<\"",
249
+ "\">\"",
250
+ "\"<=\"",
251
+ "\">=\"",
252
+ "\"<>\"",
253
+ "\"=\"",
254
+ "EOL",
255
+ "LT",
256
+ "GT",
257
+ "LE",
258
+ "GE",
259
+ "NE",
260
+ "\"(\"",
261
+ "\")\"",
262
+ "FUNC",
263
+ "NUMBER",
264
+ "STRING",
265
+ "REF2D",
266
+ "REF3D",
267
+ "RANGE2D",
268
+ "RANGE3D",
269
+ "TRUE",
270
+ "FALSE",
271
+ "\",\"",
272
+ "$start",
273
+ "formula",
274
+ "expr_list",
275
+ "expr",
276
+ "primary",
277
+ "funcall",
278
+ "args" ]
279
+
280
+ Racc_debug_parser = false
281
+
282
+ ##### State transition tables end #####
283
+
284
+ # reduce 0 omitted
285
+
286
+ # reduce 1 omitted
287
+
288
+ module_eval(<<'.,.,', 'excelformula.y', 20)
289
+ def _reduce_2(val, _values, result)
290
+ result = []
291
+ result
292
+ end
293
+ .,.,
294
+
295
+ module_eval(<<'.,.,', 'excelformula.y', 21)
296
+ def _reduce_3(val, _values, result)
297
+ result.push val[1], '_arg', '1'
298
+ result
299
+ end
300
+ .,.,
301
+
302
+ # reduce 4 omitted
303
+
304
+ module_eval(<<'.,.,', 'excelformula.y', 24)
305
+ def _reduce_5(val, _values, result)
306
+ result = [ val[0], val[2], 'ptgAdd' ]
307
+ result
308
+ end
309
+ .,.,
310
+
311
+ module_eval(<<'.,.,', 'excelformula.y', 25)
312
+ def _reduce_6(val, _values, result)
313
+ result = [ val[0], val[2], 'ptgSub' ]
314
+ result
315
+ end
316
+ .,.,
317
+
318
+ module_eval(<<'.,.,', 'excelformula.y', 26)
319
+ def _reduce_7(val, _values, result)
320
+ result = [ val[0], val[2], 'ptgMul' ]
321
+ result
322
+ end
323
+ .,.,
324
+
325
+ module_eval(<<'.,.,', 'excelformula.y', 27)
326
+ def _reduce_8(val, _values, result)
327
+ result = [ val[0], val[2], 'ptgDiv' ]
328
+ result
329
+ end
330
+ .,.,
331
+
332
+ module_eval(<<'.,.,', 'excelformula.y', 28)
333
+ def _reduce_9(val, _values, result)
334
+ result = [ val[0], val[2], 'ptgPower' ]
335
+ result
336
+ end
337
+ .,.,
338
+
339
+ module_eval(<<'.,.,', 'excelformula.y', 29)
340
+ def _reduce_10(val, _values, result)
341
+ result = [ val[0], val[2], 'ptgConcat' ]
342
+ result
343
+ end
344
+ .,.,
345
+
346
+ module_eval(<<'.,.,', 'excelformula.y', 30)
347
+ def _reduce_11(val, _values, result)
348
+ result = [ val[0], val[2], 'ptgLT' ]
349
+ result
350
+ end
351
+ .,.,
352
+
353
+ module_eval(<<'.,.,', 'excelformula.y', 31)
354
+ def _reduce_12(val, _values, result)
355
+ result = [ val[0], val[2], 'ptgGT' ]
356
+ result
357
+ end
358
+ .,.,
359
+
360
+ module_eval(<<'.,.,', 'excelformula.y', 32)
361
+ def _reduce_13(val, _values, result)
362
+ result = [ val[0], val[2], 'ptgLE' ]
363
+ result
364
+ end
365
+ .,.,
366
+
367
+ module_eval(<<'.,.,', 'excelformula.y', 33)
368
+ def _reduce_14(val, _values, result)
369
+ result = [ val[0], val[2], 'ptgGE' ]
370
+ result
371
+ end
372
+ .,.,
373
+
374
+ module_eval(<<'.,.,', 'excelformula.y', 34)
375
+ def _reduce_15(val, _values, result)
376
+ result = [ val[0], val[2], 'ptgNE' ]
377
+ result
378
+ end
379
+ .,.,
380
+
381
+ module_eval(<<'.,.,', 'excelformula.y', 35)
382
+ def _reduce_16(val, _values, result)
383
+ result = [ val[0], val[2], 'ptgEQ' ]
384
+ result
385
+ end
386
+ .,.,
387
+
388
+ # reduce 17 omitted
389
+
390
+ module_eval(<<'.,.,', 'excelformula.y', 38)
391
+ def _reduce_18(val, _values, result)
392
+ result = [ val[1], '_arg', '1', 'ptgParen']
393
+ result
394
+ end
395
+ .,.,
396
+
397
+ module_eval(<<'.,.,', 'excelformula.y', 39)
398
+ def _reduce_19(val, _values, result)
399
+ result = [ '_num', '-1', val[1], 'ptgMul' ]
400
+ result
401
+ end
402
+ .,.,
403
+
404
+ # reduce 20 omitted
405
+
406
+ module_eval(<<'.,.,', 'excelformula.y', 41)
407
+ def _reduce_21(val, _values, result)
408
+ result = [ '_num', val[0] ]
409
+ result
410
+ end
411
+ .,.,
412
+
413
+ module_eval(<<'.,.,', 'excelformula.y', 42)
414
+ def _reduce_22(val, _values, result)
415
+ result = [ '_str', val[0] ]
416
+ result
417
+ end
418
+ .,.,
419
+
420
+ module_eval(<<'.,.,', 'excelformula.y', 43)
421
+ def _reduce_23(val, _values, result)
422
+ result = [ '_ref2d', val[0] ]
423
+ result
424
+ end
425
+ .,.,
426
+
427
+ module_eval(<<'.,.,', 'excelformula.y', 44)
428
+ def _reduce_24(val, _values, result)
429
+ result = [ '_ref3d', val[0] ]
430
+ result
431
+ end
432
+ .,.,
433
+
434
+ module_eval(<<'.,.,', 'excelformula.y', 45)
435
+ def _reduce_25(val, _values, result)
436
+ result = [ '_range2d', val[0] ]
437
+ result
438
+ end
439
+ .,.,
440
+
441
+ module_eval(<<'.,.,', 'excelformula.y', 46)
442
+ def _reduce_26(val, _values, result)
443
+ result = [ '_range3d', val[0] ]
444
+ result
445
+ end
446
+ .,.,
447
+
448
+ module_eval(<<'.,.,', 'excelformula.y', 47)
449
+ def _reduce_27(val, _values, result)
450
+ result = [ 'ptgBool', '1' ]
451
+ result
452
+ end
453
+ .,.,
454
+
455
+ module_eval(<<'.,.,', 'excelformula.y', 48)
456
+ def _reduce_28(val, _values, result)
457
+ result = [ 'ptgBool', '0' ]
458
+ result
459
+ end
460
+ .,.,
461
+
462
+ # reduce 29 omitted
463
+
464
+ module_eval(<<'.,.,', 'excelformula.y', 51)
465
+ def _reduce_30(val, _values, result)
466
+ result = [ '_class', val[0], val[2], '_arg', val[2].size.to_s, '_func', val[0] ]
467
+ result
468
+ end
469
+ .,.,
470
+
471
+ module_eval(<<'.,.,', 'excelformula.y', 52)
472
+ def _reduce_31(val, _values, result)
473
+ result = [ '_func', val[0] ]
474
+ result
475
+ end
476
+ .,.,
477
+
478
+ module_eval(<<'.,.,', 'excelformula.y', 54)
479
+ def _reduce_32(val, _values, result)
480
+ result = val
481
+ result
482
+ end
483
+ .,.,
484
+
485
+ module_eval(<<'.,.,', 'excelformula.y', 55)
486
+ def _reduce_33(val, _values, result)
487
+ result.push val[2]
488
+ result
489
+ end
490
+ .,.,
491
+
492
+ def _reduce_none(val, _values, result)
493
+ val[0]
494
+ end
495
+
496
+ end # class ExcelFormulaParser
497
+
498
+
499
+ class ExcelFormulaParserError < StandardError; end
500
+
501
+ class Node
502
+
503
+ def exec_list(nodes)
504
+ v = nil
505
+ nodes.each { |i| v = i.evaluate }
506
+ v
507
+ end
508
+
509
+ def excelformulaparser_error(msg)
510
+ raise ExcelFormulaParserError,
511
+ "in #{fname}:#{lineno}: #{msg}"
512
+ end
513
+
514
+ end
515
+
516
+ class RootNode < Node
517
+
518
+ def initialize(tree)
519
+ @tree = tree
520
+ end
521
+
522
+ def evaluate
523
+ exec_list @tree
524
+ end
525
+
526
+ end
527
+
528
+
529
+ class FuncallNode < Node
530
+
531
+ def initialize(func, args)
532
+ @func = func
533
+ @args = args
534
+ end
535
+
536
+ def evaluate
537
+ arg = @args.collect {|i| i.evaluate }
538
+ out = []
539
+ arg.each { |i| o.push i }
540
+ o.push @func
541
+ p o
542
+ end
543
+
544
+ end
545
+
546
+ class NumberNode < Node
547
+
548
+ def initialize(val)
549
+ @val = val
550
+ end
551
+
552
+ def evaluate
553
+ p @val
554
+ end
555
+
556
+ end
557
+
558
+ class OperateNode < Node
559
+
560
+ def initialize(op, left, right)
561
+ @op = op
562
+ @left = left
563
+ @right = right
564
+ end
565
+
566
+ def evaluate
567
+ o = []
568
+ o.push @left
569
+ o.push @right
570
+ o.push @op
571
+ p o
572
+ end
573
+ end