writeexcel 0.3.1 → 0.3.2
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/{README → README.rdoc} +14 -3
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/charts/chartex.rb +315 -0
- data/charts/demo1.rb +45 -0
- data/charts/demo101.bin +0 -0
- data/charts/demo2.rb +64 -0
- data/charts/demo201.bin +0 -0
- data/charts/demo3.rb +116 -0
- data/charts/demo301.bin +0 -0
- data/charts/demo4.rb +118 -0
- data/charts/demo401.bin +0 -0
- data/charts/demo5.rb +47 -0
- data/charts/demo501.bin +0 -0
- data/examples/demo.rb +4 -1
- data/examples/images.rb +14 -4
- data/examples/stats.rb +0 -2
- data/lib/writeexcel.rb +0 -1
- data/lib/writeexcel/excelformula.y +139 -0
- data/lib/writeexcel/formula.rb +3 -1
- data/lib/writeexcel/workbook.rb +9 -9
- data/test/helper.rb +9 -0
- data/test/perl_output/defined_name.xls +0 -0
- data/test/test_00_IEEE_double.rb +1 -3
- data/test/test_01_add_worksheet.rb +1 -4
- data/test/test_02_merge_formats.rb +1 -4
- data/test/test_04_dimensions.rb +1 -4
- data/test/test_05_rows.rb +1 -4
- data/test/test_06_extsst.rb +1 -4
- data/test/test_11_date_time.rb +1 -4
- data/test/test_12_date_only.rb +1 -4
- data/test/test_13_date_seconds.rb +1 -4
- data/test/test_21_escher.rb +1 -4
- data/test/test_22_mso_drawing_group.rb +1 -4
- data/test/test_23_note.rb +1 -4
- data/test/test_24_txo.rb +1 -4
- data/test/test_25_position_object.rb +1 -4
- data/test/test_26_autofilter.rb +1 -4
- data/test/test_27_autofilter.rb +1 -4
- data/test/test_28_autofilter.rb +1 -4
- data/test/test_29_process_jpg.rb +1 -4
- data/test/test_30_validation_dval.rb +1 -4
- data/test/test_31_validation_dv_strings.rb +1 -4
- data/test/test_32_validation_dv_formula.rb +1 -4
- data/test/test_40_property_types.rb +1 -5
- data/test/test_41_properties.rb +1 -5
- data/test/test_42_set_properties.rb +1 -5
- data/test/test_50_name_stored.rb +1 -4
- data/test/test_51_name_print_area.rb +1 -4
- data/test/test_52_name_print_titles.rb +1 -4
- data/test/test_53_autofilter.rb +1 -4
- data/test/test_60_chart_generic.rb +1 -4
- data/test/test_61_chart_subclasses.rb +1 -4
- data/test/test_62_chart_formats.rb +1 -4
- data/test/test_63_chart_area_formats.rb +1 -4
- data/test/{tc_biff.rb → test_biff.rb} +1 -4
- data/test/{tc_example_match.rb → test_example_match.rb} +84 -69
- data/test/{tc_format.rb → test_format.rb} +1 -4
- data/test/{tc_formula.rb → test_formula.rb} +1 -4
- data/test/{tc_ole.rb → test_ole.rb} +1 -4
- data/test/{tc_storage_lite.rb → test_storage_lite.rb} +1 -4
- data/test/{tc_workbook.rb → test_workbook.rb} +1 -4
- data/test/{tc_worksheet.rb → test_worksheet.rb} +1 -4
- data/writeexcel.gemspec +287 -16
- metadata +123 -35
- data/test/tc_all.rb +0 -32
- data/test/tc_chart.rb +0 -22
- data/test/test_chartex.rb +0 -35
- data/test/ts_all.rb +0 -46
data/charts/demo101.bin
ADDED
Binary file
|
data/charts/demo2.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
###############################################################################
|
4
|
+
#
|
5
|
+
# Simple example of how to add an externally created chart to a Spreadsheet::
|
6
|
+
# WriteExcel file.
|
7
|
+
#
|
8
|
+
#
|
9
|
+
# This example adds a pie chart extracted from the file Chart2.xls as follows:
|
10
|
+
#
|
11
|
+
# perl chartex.pl -c=demo1 Chart1.xls
|
12
|
+
#
|
13
|
+
#
|
14
|
+
# reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
|
15
|
+
#
|
16
|
+
# original written in Perl by John McNamara
|
17
|
+
# converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'writeexcel'
|
21
|
+
|
22
|
+
workbook = WriteExcel.new("demo2.xls")
|
23
|
+
worksheet = workbook.add_worksheet
|
24
|
+
|
25
|
+
# Add the chart extracted using the chartex utility
|
26
|
+
chart = workbook.add_chart_ext('demo201.bin', 'Chart1')
|
27
|
+
|
28
|
+
# Link the chart to the worksheet data using a dummy formula.
|
29
|
+
worksheet.store_formula('=Sheet1!A1')
|
30
|
+
|
31
|
+
# Add some extra formats to cover formats used in the charts.
|
32
|
+
chart_font_1 = workbook.add_format(:font_only => 1)
|
33
|
+
chart_font_2 = workbook.add_format(:font_only => 1)
|
34
|
+
chart_font_3 = workbook.add_format(:font_only => 1)
|
35
|
+
chart_font_4 = workbook.add_format(:font_only => 1)
|
36
|
+
chart_font_5 = workbook.add_format(:font_only => 1)
|
37
|
+
|
38
|
+
# Add all other formats (if any).
|
39
|
+
bold = workbook.add_format(:bold => 1)
|
40
|
+
|
41
|
+
# Adjust column widths and add some headers
|
42
|
+
worksheet.set_column('A:B', 20)
|
43
|
+
|
44
|
+
worksheet.write('A1', 'Module', bold)
|
45
|
+
worksheet.write('B1', 'No. of lines', bold)
|
46
|
+
|
47
|
+
# Add data to range that the chart refers to.
|
48
|
+
data = [
|
49
|
+
|
50
|
+
['BIFFwriter.pm', 275],
|
51
|
+
['Big.pm', 99],
|
52
|
+
['Chart.pm', 269],
|
53
|
+
['Format.pm', 724],
|
54
|
+
['Formula.pm', 1410],
|
55
|
+
['OLEwriter.pm', 447],
|
56
|
+
['Utility.pm', 884],
|
57
|
+
['Workbook.pm', 1925],
|
58
|
+
['WorkbookBig.pm', 112],
|
59
|
+
['Worksheet.pm', 3945]
|
60
|
+
]
|
61
|
+
|
62
|
+
worksheet.write_col('A2', data )
|
63
|
+
|
64
|
+
workbook.close
|
data/charts/demo201.bin
ADDED
Binary file
|
data/charts/demo3.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
###############################################################################
|
4
|
+
#
|
5
|
+
# Simple example of how to add an externally created chart to a Spreadsheet::
|
6
|
+
# WriteExcel file.
|
7
|
+
#
|
8
|
+
#
|
9
|
+
# This example adds an "Open-high-low-close" stock chart extracted from the
|
10
|
+
# file Chart3.xls as follows:
|
11
|
+
#
|
12
|
+
# perl chartex.pl -c=demo3 Chart3.xls
|
13
|
+
#
|
14
|
+
#
|
15
|
+
# reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
|
16
|
+
#
|
17
|
+
# original written in Perl by John McNamara
|
18
|
+
# converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'writeexcel'
|
22
|
+
|
23
|
+
workbook = WriteExcel.new("demo3.xls")
|
24
|
+
worksheet = workbook.add_worksheet
|
25
|
+
|
26
|
+
# Add the chart extracted using the chartex utility
|
27
|
+
chart = workbook.add_chart_ext('demo301.bin', 'Chart1')
|
28
|
+
|
29
|
+
# Link the chart to the worksheet data using a dummy formula.
|
30
|
+
worksheet.store_formula('=Sheet1!A1')
|
31
|
+
|
32
|
+
# Add some extra formats to cover formats used in the charts.
|
33
|
+
chart_font_1 = workbook.add_format(:font_only => 1)
|
34
|
+
chart_font_2 = workbook.add_format(:font_only => 1)
|
35
|
+
chart_font_3 = workbook.add_format(:font_only => 1)
|
36
|
+
chart_font_4 = workbook.add_format(:font_only => 1)
|
37
|
+
chart_font_5 = workbook.add_format(:font_only => 1)
|
38
|
+
|
39
|
+
# Add all other formats (if any).
|
40
|
+
bold = workbook.add_format(:bold => 1)
|
41
|
+
date_format = workbook.add_format(:num_format => 'dd/mm/yyyy')
|
42
|
+
|
43
|
+
# Adjust column widths and add some headers
|
44
|
+
worksheet.set_column('A:A', 12)
|
45
|
+
|
46
|
+
worksheet.write('A1', 'Date', bold)
|
47
|
+
worksheet.write('B1', 'Open', bold)
|
48
|
+
worksheet.write('C1', 'High', bold)
|
49
|
+
worksheet.write('D1', 'Low', bold)
|
50
|
+
worksheet.write('E1', 'Close', bold)
|
51
|
+
|
52
|
+
# Add data to range that the chart refers to.
|
53
|
+
dates = [
|
54
|
+
|
55
|
+
"2004-08-19T",
|
56
|
+
"2004-08-20T",
|
57
|
+
"2004-08-23T",
|
58
|
+
"2004-08-24T",
|
59
|
+
"2004-08-25T",
|
60
|
+
"2004-08-26T",
|
61
|
+
"2004-08-27T",
|
62
|
+
"2004-08-30T",
|
63
|
+
"2004-08-31T",
|
64
|
+
"2004-09-01T",
|
65
|
+
"2004-09-02T",
|
66
|
+
"2004-09-03T",
|
67
|
+
"2004-09-07T",
|
68
|
+
"2004-09-08T",
|
69
|
+
"2004-09-09T",
|
70
|
+
"2004-09-10T",
|
71
|
+
"2004-09-13T",
|
72
|
+
"2004-09-14T",
|
73
|
+
"2004-09-15T",
|
74
|
+
"2004-09-16T",
|
75
|
+
"2004-09-17T",
|
76
|
+
"2004-09-20T",
|
77
|
+
"2004-09-21T"
|
78
|
+
]
|
79
|
+
|
80
|
+
# Open-High-Low-Close prices
|
81
|
+
prices = [
|
82
|
+
|
83
|
+
[100.00, 104.06, 95.96, 100.34],
|
84
|
+
[101.01, 109.08, 100.50, 108.31],
|
85
|
+
[110.75, 113.48, 109.05, 109.40],
|
86
|
+
[111.24, 111.60, 103.57, 104.87],
|
87
|
+
[104.96, 108.00, 103.88, 106.00],
|
88
|
+
[104.95, 107.95, 104.66, 107.91],
|
89
|
+
[108.10, 108.62, 105.69, 106.15],
|
90
|
+
[105.28, 105.49, 102.01, 102.01],
|
91
|
+
[102.30, 103.71, 102.16, 102.37],
|
92
|
+
[102.70, 102.97, 99.67, 100.25],
|
93
|
+
[ 99.19, 102.37, 98.94, 101.51],
|
94
|
+
[100.95, 101.74, 99.32, 100.01],
|
95
|
+
[101.01, 102.00, 99.61, 101.58],
|
96
|
+
[100.74, 103.03, 100.50, 102.30],
|
97
|
+
[102.53, 102.71, 101.00, 102.31],
|
98
|
+
[101.60, 106.56, 101.30, 105.33],
|
99
|
+
[106.63, 108.41, 106.46, 107.50],
|
100
|
+
[107.45, 112.00, 106.79, 111.49],
|
101
|
+
[110.56, 114.23, 110.20, 112.00],
|
102
|
+
[112.34, 115.80, 111.65, 113.97],
|
103
|
+
[114.42, 117.49, 113.55, 117.49],
|
104
|
+
[116.95, 121.60, 116.77, 119.36],
|
105
|
+
[119.81, 120.42, 117.51, 117.84]
|
106
|
+
]
|
107
|
+
|
108
|
+
row = 1
|
109
|
+
|
110
|
+
dates.each do |d|
|
111
|
+
worksheet.write_date_time(row, 0, d, date_format)
|
112
|
+
row += 1
|
113
|
+
end
|
114
|
+
worksheet.write_col('B2', prices)
|
115
|
+
|
116
|
+
workbook.close
|
data/charts/demo301.bin
ADDED
Binary file
|
data/charts/demo4.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
###############################################################################
|
4
|
+
#
|
5
|
+
# Simple example of how to add an externally created chart to a Spreadsheet::
|
6
|
+
# WriteExcel file.
|
7
|
+
#
|
8
|
+
#
|
9
|
+
# This example adds an "Open-high-low-close" stock chart extracted from the
|
10
|
+
# file Chart3.xls as follows:
|
11
|
+
#
|
12
|
+
# perl chartex.pl -c=demo4 Chart4.xls
|
13
|
+
#
|
14
|
+
#
|
15
|
+
# reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
|
16
|
+
#
|
17
|
+
# original written in Perl by John McNamara
|
18
|
+
# converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
|
19
|
+
#
|
20
|
+
|
21
|
+
require 'writeexcel'
|
22
|
+
|
23
|
+
workbook = WriteExcel.new("demo4.xls")
|
24
|
+
worksheet = workbook.add_worksheet
|
25
|
+
|
26
|
+
# Add the chart extracted using the chartex utility
|
27
|
+
worksheet.embed_chart('G2', 'demo401.bin', 3, 3, 1.08, 1.21)
|
28
|
+
|
29
|
+
# Link the chart to the worksheet data using a dummy formula.
|
30
|
+
worksheet.store_formula('=Sheet1!A1')
|
31
|
+
|
32
|
+
|
33
|
+
# Add some extra formats to cover formats used in the charts.
|
34
|
+
chart_font_1 = workbook.add_format(:font_only => 1)
|
35
|
+
chart_font_2 = workbook.add_format(:font_only => 1, :bold => 1)
|
36
|
+
chart_font_3 = workbook.add_format(:font_only => 1)
|
37
|
+
chart_font_4 = workbook.add_format(:font_only => 1)
|
38
|
+
|
39
|
+
# Add all other formats.
|
40
|
+
bold = workbook.add_format(:bold => 1)
|
41
|
+
date_format = workbook.add_format(:num_format => 'dd/mm/yyyy')
|
42
|
+
|
43
|
+
# Adjust column widths and add some headers
|
44
|
+
worksheet.set_column('A:A', 12)
|
45
|
+
|
46
|
+
worksheet.write('A1', 'Date', bold)
|
47
|
+
worksheet.write('B1', 'Open', bold)
|
48
|
+
worksheet.write('C1', 'High', bold)
|
49
|
+
worksheet.write('D1', 'Low', bold)
|
50
|
+
worksheet.write('E1', 'Close', bold)
|
51
|
+
|
52
|
+
|
53
|
+
# Add data to range that the chart refers to.
|
54
|
+
dates = [
|
55
|
+
|
56
|
+
"2004-08-19T",
|
57
|
+
"2004-08-20T",
|
58
|
+
"2004-08-23T",
|
59
|
+
"2004-08-24T",
|
60
|
+
"2004-08-25T",
|
61
|
+
"2004-08-26T",
|
62
|
+
"2004-08-27T",
|
63
|
+
"2004-08-30T",
|
64
|
+
"2004-08-31T",
|
65
|
+
"2004-09-01T",
|
66
|
+
"2004-09-02T",
|
67
|
+
"2004-09-03T",
|
68
|
+
"2004-09-07T",
|
69
|
+
"2004-09-08T",
|
70
|
+
"2004-09-09T",
|
71
|
+
"2004-09-10T",
|
72
|
+
"2004-09-13T",
|
73
|
+
"2004-09-14T",
|
74
|
+
"2004-09-15T",
|
75
|
+
"2004-09-16T",
|
76
|
+
"2004-09-17T",
|
77
|
+
"2004-09-20T",
|
78
|
+
"2004-09-21T"
|
79
|
+
]
|
80
|
+
|
81
|
+
# Open-High-Low-Close prices
|
82
|
+
prices = [
|
83
|
+
|
84
|
+
[100.00, 104.06, 95.96, 100.34],
|
85
|
+
[101.01, 109.08, 100.50, 108.31],
|
86
|
+
[110.75, 113.48, 109.05, 109.40],
|
87
|
+
[111.24, 111.60, 103.57, 104.87],
|
88
|
+
[104.96, 108.00, 103.88, 106.00],
|
89
|
+
[104.95, 107.95, 104.66, 107.91],
|
90
|
+
[108.10, 108.62, 105.69, 106.15],
|
91
|
+
[105.28, 105.49, 102.01, 102.01],
|
92
|
+
[102.30, 103.71, 102.16, 102.37],
|
93
|
+
[102.70, 102.97, 99.67, 100.25],
|
94
|
+
[ 99.19, 102.37, 98.94, 101.51],
|
95
|
+
[100.95, 101.74, 99.32, 100.01],
|
96
|
+
[101.01, 102.00, 99.61, 101.58],
|
97
|
+
[100.74, 103.03, 100.50, 102.30],
|
98
|
+
[102.53, 102.71, 101.00, 102.31],
|
99
|
+
[101.60, 106.56, 101.30, 105.33],
|
100
|
+
[106.63, 108.41, 106.46, 107.50],
|
101
|
+
[107.45, 112.00, 106.79, 111.49],
|
102
|
+
[110.56, 114.23, 110.20, 112.00],
|
103
|
+
[112.34, 115.80, 111.65, 113.97],
|
104
|
+
[114.42, 117.49, 113.55, 117.49],
|
105
|
+
[116.95, 121.60, 116.77, 119.36],
|
106
|
+
[119.81, 120.42, 117.51, 117.84]
|
107
|
+
]
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
row = 1
|
112
|
+
dates.each do |d|
|
113
|
+
worksheet.write_date_time(row, 0, d, date_format)
|
114
|
+
row += 1
|
115
|
+
end
|
116
|
+
worksheet.write_col('B2', prices)
|
117
|
+
|
118
|
+
workbook.close
|
data/charts/demo401.bin
ADDED
Binary file
|
data/charts/demo5.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
###############################################################################
|
4
|
+
#
|
5
|
+
# Simple example of how to add an externally created chart to a Spreadsheet::
|
6
|
+
# WriteExcel file.
|
7
|
+
#
|
8
|
+
#
|
9
|
+
# This example adds a line chart extracted from the file Chart1.xls as follows:
|
10
|
+
#
|
11
|
+
# perl chartex.pl -c=demo5 Chart5.xls
|
12
|
+
#
|
13
|
+
#
|
14
|
+
# reverse('ゥ'), September 2004, John McNamara, jmcnamara@cpan.org
|
15
|
+
#
|
16
|
+
# original written in Perl by John McNamara
|
17
|
+
# converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'writeexcel'
|
21
|
+
|
22
|
+
workbook = WriteExcel.new("demo5.xls")
|
23
|
+
worksheet = workbook.add_worksheet
|
24
|
+
|
25
|
+
# Add the chart extracted using the chartex utility
|
26
|
+
worksheet.embed_chart('D3', 'demo501.bin')
|
27
|
+
|
28
|
+
# Link the chart to the worksheet data using a dummy formula.
|
29
|
+
worksheet.store_formula('=Sheet1!A1')
|
30
|
+
|
31
|
+
|
32
|
+
# Add some extra formats to cover formats used in the charts.
|
33
|
+
chart_font_1 = workbook.add_format(:font_only => 1)
|
34
|
+
chart_font_2 = workbook.add_format(:font_only => 1)
|
35
|
+
|
36
|
+
# Add all other formats.
|
37
|
+
|
38
|
+
# Add data to range that the chart refers to.
|
39
|
+
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
|
40
|
+
squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
worksheet.write_col('A1', nums)
|
45
|
+
worksheet.write_col('B1', squares)
|
46
|
+
|
47
|
+
workbook.close
|
data/charts/demo501.bin
ADDED
Binary file
|
data/examples/demo.rb
CHANGED
@@ -107,7 +107,10 @@ worksheet.write('B9', 'http://www.perl.com/' )
|
|
107
107
|
# Images
|
108
108
|
#
|
109
109
|
worksheet.write('A10', "Images")
|
110
|
-
worksheet.insert_image('B10',
|
110
|
+
worksheet.insert_image('B10',
|
111
|
+
File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png'),
|
112
|
+
16, 8
|
113
|
+
)
|
111
114
|
|
112
115
|
|
113
116
|
#######################################################################
|
data/examples/images.rb
CHANGED
@@ -24,16 +24,24 @@ bp=1
|
|
24
24
|
|
25
25
|
# Insert a basic image
|
26
26
|
worksheet1.write('A10', "Image inserted into worksheet.")
|
27
|
-
worksheet1.insert_image('A1',
|
27
|
+
worksheet1.insert_image('A1',
|
28
|
+
File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png')
|
29
|
+
)
|
28
30
|
|
29
31
|
|
30
32
|
# Insert an image with an offset
|
31
33
|
worksheet2.write('A10', "Image inserted with an offset.")
|
32
|
-
worksheet2.insert_image('A1',
|
34
|
+
worksheet2.insert_image('A1',
|
35
|
+
File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png'),
|
36
|
+
32, 10
|
37
|
+
)
|
33
38
|
|
34
39
|
# Insert a scaled image
|
35
40
|
worksheet3.write('A10', "Image scaled: width x 2, height x 0.8.")
|
36
|
-
worksheet3.insert_image('A1',
|
41
|
+
worksheet3.insert_image('A1',
|
42
|
+
File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png'),
|
43
|
+
0, 0, 2, 0.8
|
44
|
+
)
|
37
45
|
|
38
46
|
# Insert an image over varied column and row sizes
|
39
47
|
# This does not require any additional work
|
@@ -47,6 +55,8 @@ worksheet4.set_row(0, 30)
|
|
47
55
|
worksheet4.set_row(3, 5)
|
48
56
|
|
49
57
|
worksheet4.write('A10', "Image inserted over scaled rows and columns.")
|
50
|
-
worksheet4.insert_image('A1',
|
58
|
+
worksheet4.insert_image('A1',
|
59
|
+
File.join(File.dirname(File.expand_path(__FILE__)), 'republic.png')
|
60
|
+
)
|
51
61
|
|
52
62
|
workbook.close
|
data/examples/stats.rb
CHANGED
data/lib/writeexcel.rb
CHANGED
@@ -0,0 +1,139 @@
|
|
1
|
+
#
|
2
|
+
# copyright (c) 2009, 2010 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
|
+
| NAME { result = [ '_name', val[0] ] }
|
49
|
+
| TRUE { result = [ 'ptgBool', '1' ] }
|
50
|
+
| FALSE { result = [ 'ptgBool', '0' ] }
|
51
|
+
| funcall
|
52
|
+
|
53
|
+
funcall : FUNC '(' args ')' { result = [ '_class', val[0], val[2], '_arg', val[2].size.to_s, '_func', val[0] ] }
|
54
|
+
| FUNC '(' ')' { result = [ '_func', val[0] ] }
|
55
|
+
|
56
|
+
args : expr { result = val }
|
57
|
+
| args ',' expr { result.push val[2] }
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
---- footer
|
63
|
+
|
64
|
+
class ExcelFormulaParserError < StandardError; end
|
65
|
+
|
66
|
+
class Node
|
67
|
+
|
68
|
+
def exec_list(nodes)
|
69
|
+
v = nil
|
70
|
+
nodes.each { |i| v = i.evaluate }
|
71
|
+
v
|
72
|
+
end
|
73
|
+
|
74
|
+
def excelformulaparser_error(msg)
|
75
|
+
raise ExcelFormulaParserError,
|
76
|
+
"in #{fname}:#{lineno}: #{msg}"
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
class RootNode < Node
|
82
|
+
|
83
|
+
def initialize(tree)
|
84
|
+
@tree = tree
|
85
|
+
end
|
86
|
+
|
87
|
+
def evaluate
|
88
|
+
exec_list @tree
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
class FuncallNode < Node
|
95
|
+
|
96
|
+
def initialize(func, args)
|
97
|
+
@func = func
|
98
|
+
@args = args
|
99
|
+
end
|
100
|
+
|
101
|
+
def evaluate
|
102
|
+
arg = @args.collect {|i| i.evaluate }
|
103
|
+
out = []
|
104
|
+
arg.each { |i| o.push i }
|
105
|
+
o.push @func
|
106
|
+
p o
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class NumberNode < Node
|
112
|
+
|
113
|
+
def initialize(val)
|
114
|
+
@val = val
|
115
|
+
end
|
116
|
+
|
117
|
+
def evaluate
|
118
|
+
p @val
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
class OperateNode < Node
|
124
|
+
|
125
|
+
def initialize(op, left, right)
|
126
|
+
@op = op
|
127
|
+
@left = left
|
128
|
+
@right = right
|
129
|
+
end
|
130
|
+
|
131
|
+
def evaluate
|
132
|
+
o = []
|
133
|
+
o.push @left
|
134
|
+
o.push @right
|
135
|
+
o.push @op
|
136
|
+
p o
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|