write_xlsx 0.62.0 → 0.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +14 -1
- data/examples/chart_data_tools.rb +215 -0
- data/examples/chart_pie.rb +36 -5
- data/examples/sparklines2.rb +1 -1
- data/examples/tab_colors.rb +3 -3
- data/lib/write_xlsx/chart.rb +559 -516
- data/lib/write_xlsx/chart/area.rb +4 -1
- data/lib/write_xlsx/chart/axis.rb +132 -0
- data/lib/write_xlsx/chart/bar.rb +17 -9
- data/lib/write_xlsx/chart/column.rb +9 -1
- data/lib/write_xlsx/chart/line.rb +24 -0
- data/lib/write_xlsx/chart/radar.rb +2 -2
- data/lib/write_xlsx/chart/scatter.rb +19 -0
- data/lib/write_xlsx/chart/stock.rb +10 -3
- data/lib/write_xlsx/drawing.rb +43 -44
- data/lib/write_xlsx/package/vml.rb +21 -14
- data/lib/write_xlsx/shape.rb +173 -22
- data/lib/write_xlsx/sparkline.rb +524 -0
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +183 -115
- data/lib/write_xlsx/worksheet.rb +821 -1073
- data/lib/write_xlsx/worksheet/cell_data.rb +132 -0
- data/lib/write_xlsx/worksheet/print_style.rb +51 -0
- data/test/chart/test_add_series.rb +31 -6
- data/test/chart/test_write_d_lbls.rb +18 -18
- data/test/chart/test_write_number_format.rb +20 -24
- data/test/drawing/test_drawing_shape_01.rb +1 -1
- data/test/drawing/test_drawing_shape_02.rb +2 -2
- data/test/drawing/test_drawing_shape_03.rb +5 -5
- data/test/drawing/test_drawing_shape_04.rb +3 -3
- data/test/drawing/test_drawing_shape_05.rb +4 -4
- data/test/drawing/test_drawing_shape_07.rb +2 -2
- data/test/perl_output/chart_data_tools.xlsx +0 -0
- data/test/perl_output/chart_pie.xlsx +0 -0
- data/test/regression/disabled_test_vml04.rb +2 -2
- data/test/regression/test_chart_drop_lines01.rb +46 -0
- data/test/regression/test_chart_drop_lines02.rb +51 -0
- data/test/regression/test_chart_drop_lines03.rb +46 -0
- data/test/regression/test_chart_drop_lines04.rb +64 -0
- data/test/regression/test_chart_errorbars01.rb +47 -0
- data/test/regression/test_chart_errorbars02.rb +57 -0
- data/test/regression/test_chart_errorbars03.rb +53 -0
- data/test/regression/test_chart_errorbars04.rb +48 -0
- data/test/regression/test_chart_errorbars05.rb +47 -0
- data/test/regression/test_chart_errorbars06.rb +47 -0
- data/test/regression/test_chart_errorbars07.rb +66 -0
- data/test/regression/test_chart_font02.rb +1 -1
- data/test/regression/test_chart_font06.rb +1 -1
- data/test/regression/test_chart_gridlines04.rb +2 -1
- data/test/regression/test_chart_gridlines08.rb +2 -1
- data/test/regression/test_chart_points01.rb +37 -0
- data/test/regression/test_chart_points02.rb +40 -0
- data/test/regression/test_chart_points03.rb +42 -0
- data/test/regression/test_chart_points04.rb +52 -0
- data/test/regression/test_chart_points05.rb +49 -0
- data/test/regression/test_chart_points06.rb +49 -0
- data/test/regression/test_chartsheet05.rb +1 -1
- data/test/regression/test_chartsheet06.rb +1 -1
- data/test/regression/test_comment01.rb +1 -1
- data/test/regression/test_comment02.rb +1 -1
- data/test/regression/test_comment03.rb +1 -1
- data/test/regression/test_comment04.rb +2 -2
- data/test/regression/test_comment06.rb +1 -1
- data/test/regression/test_comment07.rb +1 -1
- data/test/regression/test_comment08.rb +1 -1
- data/test/regression/test_comment09.rb +1 -1
- data/test/regression/test_comment10.rb +1 -1
- data/test/regression/test_default_row04.rb +1 -1
- data/test/regression/test_escapes02.rb +1 -1
- data/test/regression/test_hyperlink15.rb +2 -2
- data/test/regression/test_shape_connect01.rb +6 -6
- data/test/regression/test_shape_connect02.rb +6 -6
- data/test/regression/test_shape_connect03.rb +11 -11
- data/test/regression/test_shape_connect04.rb +10 -10
- data/test/regression/test_shape_scale01.rb +2 -2
- data/test/regression/test_shape_stencil01.rb +3 -3
- data/test/regression/test_tab_color01.rb +1 -1
- data/test/regression/test_table04.rb +1 -1
- data/test/regression/test_table05.rb +1 -1
- data/test/regression/test_table06.rb +1 -1
- data/test/regression/test_vml01.rb +1 -1
- data/test/regression/test_vml02.rb +1 -1
- data/test/regression/test_vml03.rb +2 -2
- data/test/regression/xlsx_files/chart_drop_lines01.xlsx +0 -0
- data/test/regression/xlsx_files/chart_drop_lines02.xlsx +0 -0
- data/test/regression/xlsx_files/chart_drop_lines03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_drop_lines04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars01.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars02.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars06.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars07.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points01.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points02.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points06.xlsx +0 -0
- data/test/regression/xlsx_files/chart_stock02.xlsx +0 -0
- data/test/test_example_match.rb +278 -57
- data/test/worksheet/test_convert_date_time_02.rb +427 -433
- data/test/worksheet/test_convert_date_time_03.rb +1 -1
- data/test/worksheet/test_write_sheet_pr.rb +2 -2
- data/test/worksheet/test_write_sheet_view1.rb +2 -2
- metadata +80 -10
data/README.rdoc
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
= write_xlsx
|
|
2
2
|
|
|
3
|
-
gem to create a new file in the Excel 2007+ XLSX format, and you can use the same interface as writeexcel gem. write_xlsx is converted from Perl's module Excel::Writer::XLSX-0.
|
|
3
|
+
gem to create a new file in the Excel 2007+ XLSX format, and you can use the same interface as writeexcel gem. write_xlsx is converted from Perl's module Excel::Writer::XLSX-0.63, https://github.com/jmcnamara/excel-writer-xlsx .
|
|
4
4
|
|
|
5
5
|
== Description
|
|
6
6
|
|
|
@@ -75,6 +75,19 @@ the first worksheet in an Excel XML spreadsheet called ruby.xlsx:
|
|
|
75
75
|
workbook.close
|
|
76
76
|
|
|
77
77
|
== Recent change
|
|
78
|
+
2013-03-05 v0.64.0
|
|
79
|
+
Added the option to format individual points in a chart series.
|
|
80
|
+
This allows Pie chart segments to be formatted.
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
2013-03-05 v0.63.0
|
|
84
|
+
Added Chart data tools such as:
|
|
85
|
+
Error Bars
|
|
86
|
+
Up-Down Bars
|
|
87
|
+
High-Low Lines
|
|
88
|
+
Drop Lines.
|
|
89
|
+
See the chart_data_tools.rb example.
|
|
90
|
+
|
|
78
91
|
2013-02-24 v0.62.0
|
|
79
92
|
Added option for adding a data table to a Chart X-axis.
|
|
80
93
|
See output from chart_data_table.rb example.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
#######################################################################
|
|
5
|
+
#
|
|
6
|
+
# A demo of an various Excel chart data tools that are available via
|
|
7
|
+
# an WriteXLSX chart.
|
|
8
|
+
#
|
|
9
|
+
# These include, Trendlines, Data Labels, Error Bars, Drop Lines,
|
|
10
|
+
# High-Low Lines and Up-Down Bars.
|
|
11
|
+
#
|
|
12
|
+
# reverse ('(c)'), December 2012, John McNamara, jmcnamara@cpan.org
|
|
13
|
+
# convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
require 'rubygems'
|
|
17
|
+
require 'write_xlsx'
|
|
18
|
+
|
|
19
|
+
# Create a new workbook called simple.xls and add a worksheet
|
|
20
|
+
workbook = WriteXLSX.new('chart_data_tools.xlsx')
|
|
21
|
+
worksheet = workbook.add_worksheet
|
|
22
|
+
bold = workbook.add_format(:bold => 1)
|
|
23
|
+
|
|
24
|
+
# Add the worksheet data that the charts will refer to.
|
|
25
|
+
headings = [ 'Number', 'Data 1', 'Data 2' ]
|
|
26
|
+
data = [
|
|
27
|
+
[ 2, 3, 4, 5, 6, 7 ],
|
|
28
|
+
[ 10, 40, 50, 20, 10, 50 ],
|
|
29
|
+
[ 30, 60, 70, 50, 40, 30 ]
|
|
30
|
+
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
worksheet.write('A1', headings, bold)
|
|
34
|
+
worksheet.write('A2', data)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
#######################################################################
|
|
38
|
+
#
|
|
39
|
+
# Trendline example.
|
|
40
|
+
#
|
|
41
|
+
|
|
42
|
+
# Create a Line chart.
|
|
43
|
+
chart1 = workbook.add_chart(:type => 'line', :embedded => 1)
|
|
44
|
+
|
|
45
|
+
# Configure the first series with a polynomial trendline.
|
|
46
|
+
chart1.add_series(
|
|
47
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
48
|
+
:values => '=Sheet1!$B$2:$B$7',
|
|
49
|
+
:trendline => {
|
|
50
|
+
:type => 'polynomial',
|
|
51
|
+
:order => 3,
|
|
52
|
+
},
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# Configure the second series with a moving average trendline.
|
|
56
|
+
chart1.add_series(
|
|
57
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
58
|
+
:values => '=Sheet1!$C$2:$C$7',
|
|
59
|
+
:trendline => { :type => 'linear' },
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Add a chart title. and some axis labels.
|
|
63
|
+
chart1.set_title(:name => 'Chart with Trendlines')
|
|
64
|
+
|
|
65
|
+
# Insert the chart into the worksheet (with an offset).
|
|
66
|
+
worksheet.insert_chart('D2', chart1, 25, 10)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
#######################################################################
|
|
70
|
+
#
|
|
71
|
+
# Data Labels and Markers example.
|
|
72
|
+
#
|
|
73
|
+
|
|
74
|
+
# Create a Line chart.
|
|
75
|
+
chart2 = workbook.add_chart(:type => 'line', :embedded => 1)
|
|
76
|
+
|
|
77
|
+
# Configure the first series.
|
|
78
|
+
chart2.add_series(
|
|
79
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
80
|
+
:values => '=Sheet1!$B$2:$B$7',
|
|
81
|
+
:data_labels => { :value => 1 },
|
|
82
|
+
:marker => { :type => 'automatic' },
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Configure the second series.
|
|
86
|
+
chart2.add_series(
|
|
87
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
88
|
+
:values => '=Sheet1!$C$2:$C$7',
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Add a chart title. and some axis labels.
|
|
92
|
+
chart2.set_title(:name => 'Chart with Data Labels and Markers')
|
|
93
|
+
|
|
94
|
+
# Insert the chart into the worksheet (with an offset).
|
|
95
|
+
worksheet.insert_chart('D18', chart2, 25, 10)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
#######################################################################
|
|
99
|
+
#
|
|
100
|
+
# Error Bars example.
|
|
101
|
+
#
|
|
102
|
+
|
|
103
|
+
# Create a Line chart.
|
|
104
|
+
chart3 = workbook.add_chart(:type => 'line', :embedded => 1)
|
|
105
|
+
|
|
106
|
+
# Configure the first series.
|
|
107
|
+
chart3.add_series(
|
|
108
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
109
|
+
:values => '=Sheet1!$B$2:$B$7',
|
|
110
|
+
:y_error_bars => { :type => 'standard_error' },
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Configure the second series.
|
|
114
|
+
chart3.add_series(
|
|
115
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
116
|
+
:values => '=Sheet1!$C$2:$C$7',
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Add a chart title. and some axis labels.
|
|
120
|
+
chart3.set_title(:name => 'Chart with Error Bars')
|
|
121
|
+
|
|
122
|
+
# Insert the chart into the worksheet (with an offset).
|
|
123
|
+
worksheet.insert_chart('D34', chart3, 25, 10)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
#######################################################################
|
|
127
|
+
#
|
|
128
|
+
# Up-Down Bars example.
|
|
129
|
+
#
|
|
130
|
+
|
|
131
|
+
# Create a Line chart.
|
|
132
|
+
chart4 = workbook.add_chart(:type => 'line', :embedded => 1)
|
|
133
|
+
|
|
134
|
+
# Add the Up-Down Bars.
|
|
135
|
+
chart4.set_up_down_bars
|
|
136
|
+
|
|
137
|
+
# Configure the first series.
|
|
138
|
+
chart4.add_series(
|
|
139
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
140
|
+
:values => '=Sheet1!$B$2:$B$7',
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# Configure the second series.
|
|
144
|
+
chart4.add_series(
|
|
145
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
146
|
+
:values => '=Sheet1!$C$2:$C$7',
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# Add a chart title. and some axis labels.
|
|
150
|
+
chart4.set_title(:name => 'Chart with Up-Down Bars')
|
|
151
|
+
|
|
152
|
+
# Insert the chart into the worksheet (with an offset).
|
|
153
|
+
worksheet.insert_chart('D50', chart4, 25, 10)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
#######################################################################
|
|
157
|
+
#
|
|
158
|
+
# High-Low Lines example.
|
|
159
|
+
#
|
|
160
|
+
|
|
161
|
+
# Create a Line chart.
|
|
162
|
+
chart5 = workbook.add_chart(:type => 'line', :embedded => 1)
|
|
163
|
+
|
|
164
|
+
# Add the High-Low lines.
|
|
165
|
+
chart5.set_high_low_lines
|
|
166
|
+
|
|
167
|
+
# Configure the first series.
|
|
168
|
+
chart5.add_series(
|
|
169
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
170
|
+
:values => '=Sheet1!$B$2:$B$7',
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
# Configure the second series.
|
|
174
|
+
chart5.add_series(
|
|
175
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
176
|
+
:values => '=Sheet1!$C$2:$C$7',
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# Add a chart title. and some axis labels.
|
|
180
|
+
chart5.set_title(:name => 'Chart with High-Low Lines')
|
|
181
|
+
|
|
182
|
+
# Insert the chart into the worksheet (with an offset).
|
|
183
|
+
worksheet.insert_chart('D66', chart5, 25, 10)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
#######################################################################
|
|
187
|
+
#
|
|
188
|
+
# Drop Lines example.
|
|
189
|
+
#
|
|
190
|
+
|
|
191
|
+
# Create a Line chart.
|
|
192
|
+
chart6 = workbook.add_chart(:type => 'line', :embedded => 1)
|
|
193
|
+
|
|
194
|
+
# Add Drop Lines.
|
|
195
|
+
chart6.set_drop_lines
|
|
196
|
+
|
|
197
|
+
# Configure the first series.
|
|
198
|
+
chart6.add_series(
|
|
199
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
200
|
+
:values => '=Sheet1!$B$2:$B$7',
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
# Configure the second series.
|
|
204
|
+
chart6.add_series(
|
|
205
|
+
:categories => '=Sheet1!$A$2:$A$7',
|
|
206
|
+
:values => '=Sheet1!$C$2:$C$7',
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# Add a chart title. and some axis labels.
|
|
210
|
+
chart6.set_title(:name => 'Chart with Drop Lines')
|
|
211
|
+
|
|
212
|
+
# Insert the chart into the worksheet (with an offset).
|
|
213
|
+
worksheet.insert_chart('D82', chart6, 25, 10)
|
|
214
|
+
|
|
215
|
+
workbook.close
|
data/examples/chart_pie.rb
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
#
|
|
6
6
|
# A demo of a Pie chart in Excel::Writer::XLSX.
|
|
7
7
|
#
|
|
8
|
+
# The demo also shows how to set segment colours. It is possible to
|
|
9
|
+
# define chart colors for most types of WrtieXLSX charts
|
|
10
|
+
# via the add_series() method. However, Pie charts are a special case
|
|
11
|
+
# since each segment is represented as a point so it is necessary to
|
|
12
|
+
# assign formatting to each point in the series.
|
|
13
|
+
#
|
|
8
14
|
# reverse(c), March 2011, John McNamara, jmcnamara@cpan.org
|
|
9
15
|
# convert to ruby by Hideo NAKAMURA, cxn03651@msj.biglobe.ne.jp
|
|
10
16
|
#
|
|
@@ -27,23 +33,48 @@
|
|
|
27
33
|
worksheet.write('A2', data)
|
|
28
34
|
|
|
29
35
|
# Create a new chart object. In this case an embedded chart.
|
|
30
|
-
|
|
36
|
+
chart1 = workbook.add_chart(:type => 'pie', :embedded => 1)
|
|
31
37
|
|
|
32
38
|
# Configure the series. Note the use of the array ref to define ranges:
|
|
33
39
|
# [ $sheetname, $row_start, $row_end, $col_start, $col_end ].
|
|
34
|
-
|
|
40
|
+
# See below for an alternative syntax.
|
|
41
|
+
chart1.add_series(
|
|
35
42
|
:name => 'Pie sales data',
|
|
36
43
|
:categories => [ 'Sheet1', 1, 3, 0, 0 ],
|
|
37
44
|
:values => [ 'Sheet1', 1, 3, 1, 1 ]
|
|
38
45
|
)
|
|
39
46
|
|
|
40
47
|
# Add a title.
|
|
41
|
-
|
|
48
|
+
chart1.set_title(:name => 'Popular Pie Types')
|
|
42
49
|
|
|
43
50
|
# Set an Excel chart style. Blue colors with white outline and shadow.
|
|
44
|
-
|
|
51
|
+
chart1.set_style(10)
|
|
45
52
|
|
|
46
53
|
# Insert the chart into the worksheet (with an offset).
|
|
47
|
-
worksheet.insert_chart('C2',
|
|
54
|
+
worksheet.insert_chart('C2', chart1, 25, 10)
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Create a Pie chart with user defined segment colors.
|
|
58
|
+
#
|
|
59
|
+
|
|
60
|
+
# Create an example Pie chart like above.
|
|
61
|
+
chart2 = workbook.add_chart(:type => 'pie', :embedded => 1)
|
|
62
|
+
|
|
63
|
+
# Configure the series and add user defined segment colours.
|
|
64
|
+
chart2.add_series(
|
|
65
|
+
:name => 'Pie sales data',
|
|
66
|
+
:categories => '=Sheet1!$A$2:$A$4',
|
|
67
|
+
:values => '=Sheet1!$B$2:$B$4',
|
|
68
|
+
:points => [
|
|
69
|
+
{ :fill => { :color => '#5ABA10' } },
|
|
70
|
+
{ :fill => { :color => '#FE110E' } },
|
|
71
|
+
{ :fill => { :color => '#CA5C05' } }
|
|
72
|
+
]
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# Add a title.
|
|
76
|
+
chart2.set_title(:name => 'Pie Chart with user defined colors')
|
|
77
|
+
|
|
78
|
+
worksheet.insert_chart('C18', chart2, 25, 10)
|
|
48
79
|
|
|
49
80
|
workbook.close
|
data/examples/sparklines2.rb
CHANGED
data/examples/tab_colors.rb
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
worksheet4 = workbook.add_worksheet
|
|
20
20
|
|
|
21
21
|
# Worksheet1 will have the default tab colour.
|
|
22
|
-
worksheet2.
|
|
23
|
-
worksheet3.
|
|
24
|
-
worksheet4.
|
|
22
|
+
worksheet2.tab_color = 'red'
|
|
23
|
+
worksheet3.tab_color = 'green'
|
|
24
|
+
worksheet4.tab_color = 0x35 # Orange
|
|
25
25
|
|
|
26
26
|
workbook.close
|
data/lib/write_xlsx/chart.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
require 'write_xlsx/package/xml_writer_simple'
|
|
3
3
|
require 'write_xlsx/utility'
|
|
4
|
+
require 'write_xlsx/chart/axis'
|
|
4
5
|
|
|
5
6
|
module Writexlsx
|
|
6
7
|
class Table
|
|
@@ -468,7 +469,7 @@ class Chart
|
|
|
468
469
|
attr_writer :index, :palette, :protection # :nodoc:
|
|
469
470
|
attr_reader :embedded, :formula_ids, :formula_data # :nodoc:
|
|
470
471
|
attr_reader :x_scale, :y_scale, :x_offset, :y_offset # :nodoc:
|
|
471
|
-
attr_reader :width, :height
|
|
472
|
+
attr_reader :width, :height # :nodoc:
|
|
472
473
|
|
|
473
474
|
#
|
|
474
475
|
# Factory method for returning chart objects based on their class type.
|
|
@@ -527,10 +528,10 @@ def initialize(subtype) # :nodoc:
|
|
|
527
528
|
@protection = 0
|
|
528
529
|
@chartarea = {}
|
|
529
530
|
@plotarea = {}
|
|
530
|
-
@x_axis =
|
|
531
|
-
@y_axis =
|
|
532
|
-
@x2_axis =
|
|
533
|
-
@y2_axis =
|
|
531
|
+
@x_axis = Axis.new
|
|
532
|
+
@y_axis = Axis.new
|
|
533
|
+
@x2_axis = Axis.new
|
|
534
|
+
@y2_axis = Axis.new
|
|
534
535
|
@name = ''
|
|
535
536
|
@show_blanks = 'gap'
|
|
536
537
|
@show_hidden_data = false
|
|
@@ -699,22 +700,29 @@ def add_series(params)
|
|
|
699
700
|
name_id = get_data_id(name_formula, params[:name_data])
|
|
700
701
|
|
|
701
702
|
# Set the line properties for the series.
|
|
702
|
-
line =
|
|
703
|
+
line = line_properties(params[:line])
|
|
703
704
|
|
|
704
705
|
# Allow 'border' as a synonym for 'line' in bar/column style charts.
|
|
705
|
-
line =
|
|
706
|
+
line = line_properties(params[:border]) if params[:border]
|
|
706
707
|
|
|
707
708
|
# Set the fill properties for the series.
|
|
708
|
-
fill =
|
|
709
|
+
fill = fill_properties(params[:fill])
|
|
709
710
|
|
|
710
711
|
# Set the marker properties for the series.
|
|
711
|
-
marker =
|
|
712
|
+
marker = marker_properties(params[:marker])
|
|
712
713
|
|
|
713
714
|
# Set the trendline properties for the series.
|
|
714
|
-
trendline =
|
|
715
|
+
trendline = trendline_properties(params[:trendline])
|
|
716
|
+
|
|
717
|
+
# Set the error bars properties for the series.
|
|
718
|
+
y_error_bars = error_bars_properties(params[:y_error_bars])
|
|
719
|
+
x_error_bars = error_bars_properties(params[:x_error_bars])
|
|
720
|
+
|
|
721
|
+
# Set the point properties for the series.
|
|
722
|
+
points = points_properties(params[:points])
|
|
715
723
|
|
|
716
724
|
# Set the labels properties for the series.
|
|
717
|
-
labels =
|
|
725
|
+
labels = labels_properties(params[:data_labels])
|
|
718
726
|
|
|
719
727
|
# Set the "invert if negative" fill property.
|
|
720
728
|
invert_if_neg = params[:invert_if_negative]
|
|
@@ -739,7 +747,12 @@ def add_series(params)
|
|
|
739
747
|
:_labels => labels,
|
|
740
748
|
:_invert_if_neg => invert_if_neg,
|
|
741
749
|
:_x2_axis => x2_axis,
|
|
742
|
-
:_y2_axis => y2_axis
|
|
750
|
+
:_y2_axis => y2_axis,
|
|
751
|
+
:_points => points,
|
|
752
|
+
:_error_bars => {
|
|
753
|
+
:_x_error_bars => x_error_bars,
|
|
754
|
+
:_y_error_bars => y_error_bars
|
|
755
|
+
}
|
|
743
756
|
}
|
|
744
757
|
end
|
|
745
758
|
|
|
@@ -842,7 +855,7 @@ def add_series(params)
|
|
|
842
855
|
# )
|
|
843
856
|
#
|
|
844
857
|
def set_x_axis(params = {})
|
|
845
|
-
@x_axis
|
|
858
|
+
@x_axis.merge_with_hash(self, params)
|
|
846
859
|
end
|
|
847
860
|
|
|
848
861
|
#
|
|
@@ -852,21 +865,21 @@ def set_x_axis(params = {})
|
|
|
852
865
|
# The properties that can be set are the same as for set_x_axis,
|
|
853
866
|
#
|
|
854
867
|
def set_y_axis(params = {})
|
|
855
|
-
@y_axis
|
|
868
|
+
@y_axis.merge_with_hash(self, params)
|
|
856
869
|
end
|
|
857
870
|
|
|
858
871
|
#
|
|
859
872
|
# Set the properties of the secondary X-axis.
|
|
860
873
|
#
|
|
861
874
|
def set_x2_axis(params = {})
|
|
862
|
-
@x2_axis
|
|
875
|
+
@x2_axis.merge_with_hash(self, params)
|
|
863
876
|
end
|
|
864
877
|
|
|
865
878
|
#
|
|
866
879
|
# Set the properties of the secondary Y-axis.
|
|
867
880
|
#
|
|
868
881
|
def set_y2_axis(params = {})
|
|
869
|
-
@y2_axis
|
|
882
|
+
@y2_axis.merge_with_hash(self, params)
|
|
870
883
|
end
|
|
871
884
|
|
|
872
885
|
#
|
|
@@ -884,7 +897,6 @@ def set_y2_axis(params = {})
|
|
|
884
897
|
#
|
|
885
898
|
def set_title(params)
|
|
886
899
|
name, name_formula = process_names(params[:name], params[:name_formula])
|
|
887
|
-
|
|
888
900
|
data_id = get_data_id(name_formula, params[:data])
|
|
889
901
|
|
|
890
902
|
@title_name = name
|
|
@@ -941,7 +953,7 @@ def set_legend(params)
|
|
|
941
953
|
#
|
|
942
954
|
def set_plotarea(params)
|
|
943
955
|
# Convert the user defined properties to internal properties.
|
|
944
|
-
@plotarea =
|
|
956
|
+
@plotarea = area_properties(params)
|
|
945
957
|
end
|
|
946
958
|
|
|
947
959
|
#
|
|
@@ -956,7 +968,7 @@ def set_plotarea(params)
|
|
|
956
968
|
#
|
|
957
969
|
def set_chartarea(params)
|
|
958
970
|
# Convert the user defined properties to internal properties.
|
|
959
|
-
@chartarea =
|
|
971
|
+
@chartarea = area_properties(params)
|
|
960
972
|
end
|
|
961
973
|
|
|
962
974
|
#
|
|
@@ -1036,6 +1048,52 @@ def set_table(params = {})
|
|
|
1036
1048
|
@table = Table.new(params)
|
|
1037
1049
|
end
|
|
1038
1050
|
|
|
1051
|
+
#
|
|
1052
|
+
# Set properties for the chart up-down bars.
|
|
1053
|
+
#
|
|
1054
|
+
def set_up_down_bars(params = {})
|
|
1055
|
+
# Map border to line.
|
|
1056
|
+
[:up, :down].each do |up_down|
|
|
1057
|
+
if params[up_down]
|
|
1058
|
+
params[up_down][:line] = params[up_down][:border] if params[up_down][:border]
|
|
1059
|
+
else
|
|
1060
|
+
params[up_down] = {}
|
|
1061
|
+
end
|
|
1062
|
+
end
|
|
1063
|
+
|
|
1064
|
+
# Set the up and down bar properties.
|
|
1065
|
+
@up_down_bars = {
|
|
1066
|
+
:_up => {
|
|
1067
|
+
:_line => line_properties(params[:up][:line]),
|
|
1068
|
+
:_fill => line_properties(params[:up][:fill])
|
|
1069
|
+
},
|
|
1070
|
+
:_down => {
|
|
1071
|
+
:_line => line_properties(params[:down][:line]),
|
|
1072
|
+
:_fill => line_properties(params[:down][:fill])
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
end
|
|
1076
|
+
|
|
1077
|
+
#
|
|
1078
|
+
# Set properties for the chart drop lines.
|
|
1079
|
+
#
|
|
1080
|
+
def set_drop_lines(params = {})
|
|
1081
|
+
# Set the drop line properties.
|
|
1082
|
+
line = line_properties(params[:line])
|
|
1083
|
+
|
|
1084
|
+
@drop_lines = { :_line => line }
|
|
1085
|
+
end
|
|
1086
|
+
|
|
1087
|
+
#
|
|
1088
|
+
# Set properties for the chart high-low lines.
|
|
1089
|
+
#
|
|
1090
|
+
def set_high_low_lines(params = {})
|
|
1091
|
+
# Set the drop line properties.
|
|
1092
|
+
line = line_properties(params[:line])
|
|
1093
|
+
|
|
1094
|
+
@hi_low_lines = { :_line => line }
|
|
1095
|
+
end
|
|
1096
|
+
|
|
1039
1097
|
#
|
|
1040
1098
|
# Setup the default configuration data for an embedded chart.
|
|
1041
1099
|
#
|
|
@@ -1076,67 +1134,51 @@ def write_bar_chart(params) # :nodoc:
|
|
|
1076
1134
|
end
|
|
1077
1135
|
end
|
|
1078
1136
|
|
|
1079
|
-
private
|
|
1080
|
-
|
|
1081
1137
|
#
|
|
1082
|
-
#
|
|
1138
|
+
# Switch name and name_formula parameters if required.
|
|
1083
1139
|
#
|
|
1084
|
-
def
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1140
|
+
def process_names(name = nil, name_formula = nil) # :nodoc:
|
|
1141
|
+
# Name looks like a formula, use it to set name_formula.
|
|
1142
|
+
if name && name =~ /^=[^!]+!\$/
|
|
1143
|
+
name_formula = name
|
|
1144
|
+
name = ''
|
|
1089
1145
|
end
|
|
1146
|
+
|
|
1147
|
+
[name, name_formula]
|
|
1090
1148
|
end
|
|
1091
1149
|
|
|
1092
1150
|
#
|
|
1093
|
-
#
|
|
1151
|
+
# Assign an id to a each unique series formula or title/axis formula. Repeated
|
|
1152
|
+
# formulas such as for categories get the same id. If the series or title
|
|
1153
|
+
# has user specified data associated with it then that is also stored. This
|
|
1154
|
+
# data is used to populate cached Excel data when creating a chart.
|
|
1155
|
+
# If there is no user defined data then it will be populated by the parent
|
|
1156
|
+
# workbook in Workbook::_add_chart_data
|
|
1094
1157
|
#
|
|
1095
|
-
def
|
|
1096
|
-
|
|
1097
|
-
|
|
1158
|
+
def get_data_id(formula, data) # :nodoc:
|
|
1159
|
+
# Ignore series without a range formula.
|
|
1160
|
+
return unless formula
|
|
1098
1161
|
|
|
1099
|
-
|
|
1162
|
+
# Strip the leading '=' from the formula.
|
|
1163
|
+
formula = formula.sub(/^=/, '')
|
|
1100
1164
|
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
:_reverse => arg[:reverse],
|
|
1107
|
-
:_min => arg[:min],
|
|
1108
|
-
:_max => arg[:max],
|
|
1109
|
-
:_minor_unit => arg[:minor_unit],
|
|
1110
|
-
:_major_unit => arg[:major_unit],
|
|
1111
|
-
:_minor_unit_type => arg[:minor_unit_type],
|
|
1112
|
-
:_major_unit_type => arg[:major_unit_type],
|
|
1113
|
-
:_log_base => arg[:log_base],
|
|
1114
|
-
:_crossing => arg[:crossing],
|
|
1115
|
-
:_position => arg[:position],
|
|
1116
|
-
:_label_position => arg[:label_position],
|
|
1117
|
-
:_num_format => arg[:num_format],
|
|
1118
|
-
:_num_format_linked => arg[:num_format_linked],
|
|
1119
|
-
:_visible => arg[:visible] || 1
|
|
1120
|
-
}
|
|
1165
|
+
# Store the data id in a hash keyed by the formula and store the data
|
|
1166
|
+
# in a separate array with the same id.
|
|
1167
|
+
if !@formula_ids.has_key?(formula)
|
|
1168
|
+
# Haven't seen this formula before.
|
|
1169
|
+
id = @formula_data.size
|
|
1121
1170
|
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1171
|
+
@formula_data << data
|
|
1172
|
+
@formula_ids[formula] = id
|
|
1173
|
+
else
|
|
1174
|
+
# Formula already seen. Return existing id.
|
|
1175
|
+
id = @formula_ids[formula]
|
|
1126
1176
|
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
axis[:_minor_gridlines] = get_gridline_properties(arg[:minor_gridlines])
|
|
1177
|
+
# Store user defined data if it isn't already there.
|
|
1178
|
+
@formula_data[id] = data unless @formula_data[id]
|
|
1130
1179
|
end
|
|
1131
1180
|
|
|
1132
|
-
|
|
1133
|
-
axis[:_position] = axis[:_position].downcase[0, 1] if axis[:_position]
|
|
1134
|
-
|
|
1135
|
-
# Set the font properties if present.
|
|
1136
|
-
axis[:_num_font] = convert_font_args(arg[:num_font])
|
|
1137
|
-
axis[:_name_font] = convert_font_args(arg[:name_font])
|
|
1138
|
-
|
|
1139
|
-
axis
|
|
1181
|
+
id
|
|
1140
1182
|
end
|
|
1141
1183
|
|
|
1142
1184
|
#
|
|
@@ -1163,25 +1205,57 @@ def convert_font_args(params)
|
|
|
1163
1205
|
end
|
|
1164
1206
|
|
|
1165
1207
|
#
|
|
1166
|
-
# Convert
|
|
1208
|
+
# Convert user defined line properties to the structure required internally.
|
|
1167
1209
|
#
|
|
1168
|
-
def
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1210
|
+
def line_properties(line) # :nodoc:
|
|
1211
|
+
return { :_defined => 0 } unless line
|
|
1212
|
+
|
|
1213
|
+
dash_types = {
|
|
1214
|
+
:solid => 'solid',
|
|
1215
|
+
:round_dot => 'sysDot',
|
|
1216
|
+
:square_dot => 'sysDash',
|
|
1217
|
+
:dash => 'dash',
|
|
1218
|
+
:dash_dot => 'dashDot',
|
|
1219
|
+
:long_dash => 'lgDash',
|
|
1220
|
+
:long_dash_dot => 'lgDashDot',
|
|
1221
|
+
:long_dash_dot_dot => 'lgDashDotDot',
|
|
1222
|
+
:dot => 'dot',
|
|
1223
|
+
:system_dash_dot => 'sysDashDot',
|
|
1224
|
+
:system_dash_dot_dot => 'sysDashDotDot'
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
# Check the dash type.
|
|
1228
|
+
dash_type = line[:dash_type]
|
|
1229
|
+
|
|
1230
|
+
if dash_type
|
|
1231
|
+
line[:dash_type] = value_or_raise(dash_types, dash_type, 'dash type')
|
|
1232
|
+
end
|
|
1233
|
+
|
|
1234
|
+
line[:_defined] = 1
|
|
1235
|
+
|
|
1236
|
+
line
|
|
1172
1237
|
end
|
|
1173
1238
|
|
|
1239
|
+
private
|
|
1240
|
+
|
|
1174
1241
|
#
|
|
1175
|
-
#
|
|
1242
|
+
# retun primary/secondary series by :primary_axes flag
|
|
1176
1243
|
#
|
|
1177
|
-
def
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1244
|
+
def axes_series(params)
|
|
1245
|
+
if params[:primary_axes] != 0
|
|
1246
|
+
primary_axes_series
|
|
1247
|
+
else
|
|
1248
|
+
secondary_axes_series
|
|
1182
1249
|
end
|
|
1250
|
+
end
|
|
1183
1251
|
|
|
1184
|
-
|
|
1252
|
+
#
|
|
1253
|
+
# Convert and aref of row col values to a range formula.
|
|
1254
|
+
#
|
|
1255
|
+
def aref_to_formula(data) # :nodoc:
|
|
1256
|
+
# If it isn't an array ref it is probably a formula already.
|
|
1257
|
+
return data unless data.kind_of?(Array)
|
|
1258
|
+
xl_range_formula(*data)
|
|
1185
1259
|
end
|
|
1186
1260
|
|
|
1187
1261
|
#
|
|
@@ -1204,41 +1278,6 @@ def get_data_type(data) # :nodoc:
|
|
|
1204
1278
|
'num'
|
|
1205
1279
|
end
|
|
1206
1280
|
|
|
1207
|
-
#
|
|
1208
|
-
# Assign an id to a each unique series formula or title/axis formula. Repeated
|
|
1209
|
-
# formulas such as for categories get the same id. If the series or title
|
|
1210
|
-
# has user specified data associated with it then that is also stored. This
|
|
1211
|
-
# data is used to populate cached Excel data when creating a chart.
|
|
1212
|
-
# If there is no user defined data then it will be populated by the parent
|
|
1213
|
-
# workbook in Workbook::_add_chart_data
|
|
1214
|
-
#
|
|
1215
|
-
def get_data_id(formula, data) # :nodoc:
|
|
1216
|
-
# Ignore series without a range formula.
|
|
1217
|
-
return unless formula
|
|
1218
|
-
|
|
1219
|
-
# Strip the leading '=' from the formula.
|
|
1220
|
-
formula = formula.sub(/^=/, '')
|
|
1221
|
-
|
|
1222
|
-
# Store the data id in a hash keyed by the formula and store the data
|
|
1223
|
-
# in a separate array with the same id.
|
|
1224
|
-
if !@formula_ids.has_key?(formula)
|
|
1225
|
-
# Haven't seen this formula before.
|
|
1226
|
-
id = @formula_data.size
|
|
1227
|
-
|
|
1228
|
-
@formula_data << data
|
|
1229
|
-
@formula_ids[formula] = id
|
|
1230
|
-
else
|
|
1231
|
-
# Formula already seen. Return existing id.
|
|
1232
|
-
id = @formula_ids[formula]
|
|
1233
|
-
|
|
1234
|
-
# Store user defined data if it isn't already there.
|
|
1235
|
-
@formula_data[id] = data unless @formula_data[id]
|
|
1236
|
-
end
|
|
1237
|
-
|
|
1238
|
-
id
|
|
1239
|
-
end
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
1281
|
#
|
|
1243
1282
|
# Convert the user specified colour index or string to a rgb colour.
|
|
1244
1283
|
#
|
|
@@ -1329,42 +1368,10 @@ def get_swe_line_weight(val)
|
|
|
1329
1368
|
weights[value] || default
|
|
1330
1369
|
end
|
|
1331
1370
|
|
|
1332
|
-
#
|
|
1333
|
-
# Convert user defined line properties to the structure required internally.
|
|
1334
|
-
#
|
|
1335
|
-
def get_line_properties(line) # :nodoc:
|
|
1336
|
-
return { :_defined => 0 } unless line
|
|
1337
|
-
|
|
1338
|
-
dash_types = {
|
|
1339
|
-
:solid => 'solid',
|
|
1340
|
-
:round_dot => 'sysDot',
|
|
1341
|
-
:square_dot => 'sysDash',
|
|
1342
|
-
:dash => 'dash',
|
|
1343
|
-
:dash_dot => 'dashDot',
|
|
1344
|
-
:long_dash => 'lgDash',
|
|
1345
|
-
:long_dash_dot => 'lgDashDot',
|
|
1346
|
-
:long_dash_dot_dot => 'lgDashDotDot',
|
|
1347
|
-
:dot => 'dot',
|
|
1348
|
-
:system_dash_dot => 'sysDashDot',
|
|
1349
|
-
:system_dash_dot_dot => 'sysDashDotDot'
|
|
1350
|
-
}
|
|
1351
|
-
|
|
1352
|
-
# Check the dash type.
|
|
1353
|
-
dash_type = line[:dash_type]
|
|
1354
|
-
|
|
1355
|
-
if dash_type
|
|
1356
|
-
line[:dash_type] = value_or_raise(dash_types, dash_type, 'dash type')
|
|
1357
|
-
end
|
|
1358
|
-
|
|
1359
|
-
line[:_defined] = 1
|
|
1360
|
-
|
|
1361
|
-
line
|
|
1362
|
-
end
|
|
1363
|
-
|
|
1364
1371
|
#
|
|
1365
1372
|
# Convert user defined fill properties to the structure required internally.
|
|
1366
1373
|
#
|
|
1367
|
-
def
|
|
1374
|
+
def fill_properties(fill) # :nodoc:
|
|
1368
1375
|
return { :_defined => 0 } unless fill
|
|
1369
1376
|
|
|
1370
1377
|
fill[:_defined] = 1
|
|
@@ -1375,7 +1382,7 @@ def get_fill_properties(fill) # :nodoc:
|
|
|
1375
1382
|
#
|
|
1376
1383
|
# Convert user defined marker properties to the structure required internally.
|
|
1377
1384
|
#
|
|
1378
|
-
def
|
|
1385
|
+
def marker_properties(marker) # :nodoc:
|
|
1379
1386
|
return unless marker
|
|
1380
1387
|
|
|
1381
1388
|
types = {
|
|
@@ -1404,13 +1411,13 @@ def get_marker_properties(marker) # :nodoc:
|
|
|
1404
1411
|
end
|
|
1405
1412
|
|
|
1406
1413
|
# Set the line properties for the marker..
|
|
1407
|
-
line =
|
|
1414
|
+
line = line_properties(marker[:line])
|
|
1408
1415
|
|
|
1409
1416
|
# Allow 'border' as a synonym for 'line'.
|
|
1410
|
-
line =
|
|
1417
|
+
line = line_properties(marker[:border]) if marker[:border]
|
|
1411
1418
|
|
|
1412
1419
|
# Set the fill properties for the marker.
|
|
1413
|
-
fill =
|
|
1420
|
+
fill = fill_properties(marker[:fill])
|
|
1414
1421
|
|
|
1415
1422
|
marker[:_line] = line
|
|
1416
1423
|
marker[:_fill] = fill
|
|
@@ -1421,7 +1428,7 @@ def get_marker_properties(marker) # :nodoc:
|
|
|
1421
1428
|
#
|
|
1422
1429
|
# Convert user defined trendline properties to the structure required internally.
|
|
1423
1430
|
#
|
|
1424
|
-
def
|
|
1431
|
+
def trendline_properties(trendline) # :nodoc:
|
|
1425
1432
|
return unless trendline
|
|
1426
1433
|
|
|
1427
1434
|
types = {
|
|
@@ -1439,13 +1446,13 @@ def get_trendline_properties(trendline) # :nodoc:
|
|
|
1439
1446
|
trendline[:type] = value_or_raise(types, trend_type, 'trendline type')
|
|
1440
1447
|
|
|
1441
1448
|
# Set the line properties for the trendline..
|
|
1442
|
-
line =
|
|
1449
|
+
line = line_properties(trendline[:line])
|
|
1443
1450
|
|
|
1444
1451
|
# Allow 'border' as a synonym for 'line'.
|
|
1445
|
-
line =
|
|
1452
|
+
line = line_properties(trendline[:border]) if trendline[:border]
|
|
1446
1453
|
|
|
1447
1454
|
# Set the fill properties for the trendline.
|
|
1448
|
-
fill =
|
|
1455
|
+
fill = fill_properties(trendline[:fill])
|
|
1449
1456
|
|
|
1450
1457
|
trendline[:_line] = line
|
|
1451
1458
|
trendline[:_fill] = fill
|
|
@@ -1454,22 +1461,67 @@ def get_trendline_properties(trendline) # :nodoc:
|
|
|
1454
1461
|
end
|
|
1455
1462
|
|
|
1456
1463
|
#
|
|
1457
|
-
# Convert user defined
|
|
1464
|
+
# Convert user defined error bars properties to structure required
|
|
1465
|
+
# internally.
|
|
1458
1466
|
#
|
|
1459
|
-
def
|
|
1460
|
-
|
|
1461
|
-
|
|
1467
|
+
def error_bars_properties(params = {})
|
|
1468
|
+
return if !ptrue?(params) || params.empty?
|
|
1469
|
+
|
|
1470
|
+
# Default values.
|
|
1471
|
+
error_bars = {
|
|
1472
|
+
:_type => 'fixedVal',
|
|
1473
|
+
:_value => 1,
|
|
1474
|
+
:_endcap => 1,
|
|
1475
|
+
:_direction => 'both'
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
types = {
|
|
1479
|
+
:fixed => 'fixedVal',
|
|
1480
|
+
:percentage => 'percentage',
|
|
1481
|
+
:standard_deviation => 'stdDev',
|
|
1482
|
+
:standard_error => 'stdErr'
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
# Check the error bars type.
|
|
1486
|
+
error_type = params[:type].to_sym
|
|
1487
|
+
|
|
1488
|
+
if types.key?(error_type)
|
|
1489
|
+
error_bars[:_type] = types[error_type]
|
|
1490
|
+
else
|
|
1491
|
+
raise "Unknown error bars type '#{error_type}'\n"
|
|
1492
|
+
end
|
|
1493
|
+
|
|
1494
|
+
# Set the value for error types that require it.
|
|
1495
|
+
if params.key?(:value)
|
|
1496
|
+
error_bars[:_value] = params[:value]
|
|
1497
|
+
end
|
|
1462
1498
|
|
|
1463
|
-
# Set the
|
|
1464
|
-
|
|
1499
|
+
# Set the end-cap style.
|
|
1500
|
+
if params.key?(:end_style)
|
|
1501
|
+
error_bars[:_endcap] = params[:end_style]
|
|
1502
|
+
end
|
|
1465
1503
|
|
|
1466
|
-
|
|
1504
|
+
# Set the error bar direction.
|
|
1505
|
+
if params.key?(:direction)
|
|
1506
|
+
if params[:direction] == 'minus'
|
|
1507
|
+
error_bars[:_direction] = 'minus'
|
|
1508
|
+
elsif params[:direction] == 'plus'
|
|
1509
|
+
error_bars[:_direction] = 'plus'
|
|
1510
|
+
else
|
|
1511
|
+
# Default to 'both'
|
|
1512
|
+
end
|
|
1513
|
+
end
|
|
1514
|
+
|
|
1515
|
+
# Set the line properties for the error bars.
|
|
1516
|
+
error_bars[:_line] = line_properties(params[:line])
|
|
1517
|
+
|
|
1518
|
+
error_bars
|
|
1467
1519
|
end
|
|
1468
1520
|
|
|
1469
1521
|
#
|
|
1470
1522
|
# Convert user defined labels properties to the structure required internally.
|
|
1471
1523
|
#
|
|
1472
|
-
def
|
|
1524
|
+
def labels_properties(labels) # :nodoc:
|
|
1473
1525
|
return nil unless labels
|
|
1474
1526
|
|
|
1475
1527
|
position = labels[:position]
|
|
@@ -1499,7 +1551,7 @@ def get_labels_properties(labels) # :nodoc:
|
|
|
1499
1551
|
#
|
|
1500
1552
|
# Convert user defined area properties to the structure required internally.
|
|
1501
1553
|
#
|
|
1502
|
-
def
|
|
1554
|
+
def area_properties(arg) # :nodoc:
|
|
1503
1555
|
area = {}
|
|
1504
1556
|
|
|
1505
1557
|
# Map deprecated Spreadsheet::WriteExcel fill colour.
|
|
@@ -1527,13 +1579,13 @@ def get_area_properties(arg) # :nodoc:
|
|
|
1527
1579
|
# Handle Excel::Writer::XLSX style properties.
|
|
1528
1580
|
|
|
1529
1581
|
# Set the line properties for the chartarea.
|
|
1530
|
-
line =
|
|
1582
|
+
line = line_properties(arg[:line])
|
|
1531
1583
|
|
|
1532
1584
|
# Allow 'border' as a synonym for 'line'.
|
|
1533
|
-
line =
|
|
1585
|
+
line = line_properties(arg[:border]) if (arg[:border])
|
|
1534
1586
|
|
|
1535
1587
|
# Set the fill properties for the chartarea.
|
|
1536
|
-
fill =
|
|
1588
|
+
fill = fill_properties(arg[:fill])
|
|
1537
1589
|
|
|
1538
1590
|
area[:_line] = line
|
|
1539
1591
|
area[:_fill] = fill
|
|
@@ -1541,6 +1593,35 @@ def get_area_properties(arg) # :nodoc:
|
|
|
1541
1593
|
return area
|
|
1542
1594
|
end
|
|
1543
1595
|
|
|
1596
|
+
#
|
|
1597
|
+
# Convert user defined points properties to structure required internally.
|
|
1598
|
+
#
|
|
1599
|
+
def points_properties(user_points = nil)
|
|
1600
|
+
return unless user_points
|
|
1601
|
+
|
|
1602
|
+
points = []
|
|
1603
|
+
user_points.each do |user_point|
|
|
1604
|
+
if user_point
|
|
1605
|
+
# Set the lline properties for the point.
|
|
1606
|
+
line = line_properties(user_point[:line])
|
|
1607
|
+
|
|
1608
|
+
# Allow 'border' as a synonym for 'line'.
|
|
1609
|
+
if user_point[:border]
|
|
1610
|
+
line = line_properties(user_point[:border])
|
|
1611
|
+
end
|
|
1612
|
+
|
|
1613
|
+
# Set the fill properties for the chartarea.
|
|
1614
|
+
fill = fill_properties(user_point[:fill])
|
|
1615
|
+
|
|
1616
|
+
point = {}
|
|
1617
|
+
point[:_line] = line
|
|
1618
|
+
point[:_fill] = fill
|
|
1619
|
+
end
|
|
1620
|
+
points << point
|
|
1621
|
+
end
|
|
1622
|
+
points
|
|
1623
|
+
end
|
|
1624
|
+
|
|
1544
1625
|
def value_or_raise(hash, key, msg)
|
|
1545
1626
|
raise "Unknown #{msg} '#{key}'" unless hash[key.to_sym]
|
|
1546
1627
|
hash[key.to_sym]
|
|
@@ -1613,24 +1694,24 @@ def get_font_latin_attributes(font)
|
|
|
1613
1694
|
#
|
|
1614
1695
|
def set_default_properties # :nodoc:
|
|
1615
1696
|
# Set the default axis properties.
|
|
1616
|
-
@x_axis
|
|
1697
|
+
@x_axis.defaults = {
|
|
1617
1698
|
:num_format => 'General',
|
|
1618
1699
|
:major_gridlines => { :visible => 0 }
|
|
1619
1700
|
}
|
|
1620
1701
|
|
|
1621
|
-
@y_axis
|
|
1702
|
+
@y_axis.defaults = {
|
|
1622
1703
|
:num_format => 'General',
|
|
1623
1704
|
:major_gridlines => { :visible => 1 }
|
|
1624
1705
|
}
|
|
1625
1706
|
|
|
1626
|
-
@x2_axis
|
|
1707
|
+
@x2_axis.defaults = {
|
|
1627
1708
|
:num_format => 'General',
|
|
1628
1709
|
:label_position => 'none',
|
|
1629
1710
|
:crossing => 'max',
|
|
1630
1711
|
:visible => 0
|
|
1631
1712
|
}
|
|
1632
1713
|
|
|
1633
|
-
@y2_axis
|
|
1714
|
+
@y2_axis.defaults = {
|
|
1634
1715
|
:num_format => 'General',
|
|
1635
1716
|
:major_gridlines => { :visible => 0 },
|
|
1636
1717
|
:position => 'right',
|
|
@@ -1713,25 +1794,16 @@ def chart_space_attributes # :nodoc:
|
|
|
1713
1794
|
# Write the <c:lang> element.
|
|
1714
1795
|
#
|
|
1715
1796
|
def write_lang # :nodoc:
|
|
1716
|
-
val
|
|
1717
|
-
|
|
1718
|
-
attributes = ['val', val]
|
|
1719
|
-
|
|
1720
|
-
@writer.empty_tag('c:lang', attributes)
|
|
1797
|
+
@writer.empty_tag('c:lang', ['val', 'en-US'])
|
|
1721
1798
|
end
|
|
1722
1799
|
|
|
1723
1800
|
#
|
|
1724
1801
|
# Write the <c:style> element.
|
|
1725
1802
|
#
|
|
1726
1803
|
def write_style # :nodoc:
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
# Don't write an element for the default style, 2.
|
|
1730
|
-
return if style_id == 2
|
|
1731
|
-
|
|
1732
|
-
attributes = ['val', style_id]
|
|
1804
|
+
return if @style_id == 2
|
|
1733
1805
|
|
|
1734
|
-
@writer.empty_tag('c:style',
|
|
1806
|
+
@writer.empty_tag('c:style', ['val', @style_id])
|
|
1735
1807
|
end
|
|
1736
1808
|
|
|
1737
1809
|
#
|
|
@@ -1762,14 +1834,9 @@ def write_chart # :nodoc:
|
|
|
1762
1834
|
# Write the <c:dispBlanksAs> element.
|
|
1763
1835
|
#
|
|
1764
1836
|
def write_disp_blanks_as
|
|
1765
|
-
|
|
1837
|
+
return if @show_blanks == 'gap'
|
|
1766
1838
|
|
|
1767
|
-
|
|
1768
|
-
return if val == 'gap'
|
|
1769
|
-
|
|
1770
|
-
attributes = ['val', val]
|
|
1771
|
-
|
|
1772
|
-
@writer.empty_tag('c:dispBlanksAs', attributes)
|
|
1839
|
+
@writer.empty_tag('c:dispBlanksAs', ['val', @show_blanks])
|
|
1773
1840
|
end
|
|
1774
1841
|
|
|
1775
1842
|
#
|
|
@@ -1839,8 +1906,7 @@ def write_chart_type # :nodoc:
|
|
|
1839
1906
|
# Write the <c:grouping> element.
|
|
1840
1907
|
#
|
|
1841
1908
|
def write_grouping(val) # :nodoc:
|
|
1842
|
-
|
|
1843
|
-
@writer.empty_tag('c:grouping', attributes)
|
|
1909
|
+
@writer.empty_tag('c:grouping', ['val', val])
|
|
1844
1910
|
end
|
|
1845
1911
|
|
|
1846
1912
|
#
|
|
@@ -1894,10 +1960,14 @@ def write_ser(series) # :nodoc:
|
|
|
1894
1960
|
write_marker(series[:_marker])
|
|
1895
1961
|
# Write the c:invertIfNegative element.
|
|
1896
1962
|
write_c_invert_if_negative(series[:_invert_if_neg])
|
|
1963
|
+
# Write the c:dPt element.
|
|
1964
|
+
write_d_pt(series[:_points])
|
|
1897
1965
|
# Write the c:dLbls element.
|
|
1898
1966
|
write_d_lbls(series[:_labels])
|
|
1899
1967
|
# Write the c:trendline element.
|
|
1900
1968
|
write_trendline(series[:_trendline])
|
|
1969
|
+
# Write the c:errBars element.
|
|
1970
|
+
write_error_bars(series[:_error_bars])
|
|
1901
1971
|
# Write the c:cat element.
|
|
1902
1972
|
write_cat(series)
|
|
1903
1973
|
# Write the c:val element.
|
|
@@ -1909,18 +1979,14 @@ def write_ser(series) # :nodoc:
|
|
|
1909
1979
|
# Write the <c:idx> element.
|
|
1910
1980
|
#
|
|
1911
1981
|
def write_idx(val) # :nodoc:
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
@writer.empty_tag('c:idx', attributes)
|
|
1982
|
+
@writer.empty_tag('c:idx', ['val', val])
|
|
1915
1983
|
end
|
|
1916
1984
|
|
|
1917
1985
|
#
|
|
1918
1986
|
# Write the <c:order> element.
|
|
1919
1987
|
#
|
|
1920
1988
|
def write_order(val) # :nodoc:
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
@writer.empty_tag('c:order', attributes)
|
|
1989
|
+
@writer.empty_tag('c:order', ['val', val])
|
|
1924
1990
|
end
|
|
1925
1991
|
|
|
1926
1992
|
#
|
|
@@ -2043,9 +2109,7 @@ def write_axis_ids(params)
|
|
|
2043
2109
|
# Write the <c:axId> element.
|
|
2044
2110
|
#
|
|
2045
2111
|
def write_axis_id(val) # :nodoc:
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
@writer.empty_tag('c:axId', attributes)
|
|
2112
|
+
@writer.empty_tag('c:axId', ['val', val])
|
|
2049
2113
|
end
|
|
2050
2114
|
|
|
2051
2115
|
#
|
|
@@ -2064,48 +2128,48 @@ def write_cat_axis(params) # :nodoc:
|
|
|
2064
2128
|
horiz = @horiz_cat_axis
|
|
2065
2129
|
|
|
2066
2130
|
# Overwrite the default axis position with a user supplied value.
|
|
2067
|
-
position = x_axis
|
|
2131
|
+
position = x_axis.position || position
|
|
2068
2132
|
|
|
2069
2133
|
@writer.tag_elements('c:catAx') do
|
|
2070
2134
|
write_axis_id(axis_ids[0])
|
|
2071
2135
|
# Write the c:scaling element.
|
|
2072
|
-
write_scaling(x_axis
|
|
2136
|
+
write_scaling(x_axis.reverse)
|
|
2073
2137
|
|
|
2074
|
-
write_delete(1) unless ptrue?(x_axis
|
|
2138
|
+
write_delete(1) unless ptrue?(x_axis.visible)
|
|
2075
2139
|
|
|
2076
2140
|
# Write the c:axPos element.
|
|
2077
|
-
write_axis_pos(position, y_axis
|
|
2141
|
+
write_axis_pos(position, y_axis.reverse)
|
|
2078
2142
|
|
|
2079
2143
|
# Write the c:majorGridlines element.
|
|
2080
|
-
write_major_gridlines(x_axis
|
|
2144
|
+
write_major_gridlines(x_axis.major_gridlines)
|
|
2081
2145
|
|
|
2082
2146
|
# Write the c:minorGridlines element.
|
|
2083
|
-
write_minor_gridlines(x_axis
|
|
2147
|
+
write_minor_gridlines(x_axis.minor_gridlines)
|
|
2084
2148
|
|
|
2085
2149
|
# Write the axis title elements.
|
|
2086
|
-
if title = x_axis
|
|
2087
|
-
write_title_formula(title, @x_axis
|
|
2088
|
-
elsif title = x_axis
|
|
2089
|
-
write_title_rich(title, horiz, x_axis
|
|
2150
|
+
if title = x_axis.formula
|
|
2151
|
+
write_title_formula(title, @x_axis.data_id, horiz, @x_axis.name_font)
|
|
2152
|
+
elsif title = x_axis.name
|
|
2153
|
+
write_title_rich(title, horiz, x_axis.name_font)
|
|
2090
2154
|
end
|
|
2091
2155
|
|
|
2092
2156
|
# Write the c:numFmt element.
|
|
2093
2157
|
write_cat_number_format(x_axis)
|
|
2094
2158
|
|
|
2095
2159
|
# Write the c:majorTickMark element.
|
|
2096
|
-
write_major_tick_mark(x_axis
|
|
2160
|
+
write_major_tick_mark(x_axis.major_tick_mark)
|
|
2097
2161
|
|
|
2098
2162
|
# Write the c:tickLblPos element.
|
|
2099
|
-
write_tick_label_pos(x_axis
|
|
2163
|
+
write_tick_label_pos(x_axis.label_position)
|
|
2100
2164
|
|
|
2101
2165
|
# Write the axis font elements.
|
|
2102
|
-
write_axis_font(x_axis
|
|
2166
|
+
write_axis_font(x_axis.num_font)
|
|
2103
2167
|
|
|
2104
2168
|
# Write the c:crossAx element.
|
|
2105
2169
|
write_cross_axis(axis_ids[1])
|
|
2106
2170
|
|
|
2107
|
-
if @show_crosses || ptrue?(x_axis
|
|
2108
|
-
write_crossing(y_axis
|
|
2171
|
+
if @show_crosses || ptrue?(x_axis.visible)
|
|
2172
|
+
write_crossing(y_axis.crossing)
|
|
2109
2173
|
end
|
|
2110
2174
|
# Write the c:auto element.
|
|
2111
2175
|
write_auto(1)
|
|
@@ -2131,7 +2195,7 @@ def write_val_axis(params) # :nodoc:
|
|
|
2131
2195
|
return unless axis_ids && !axis_ids.empty?
|
|
2132
2196
|
|
|
2133
2197
|
# OVerwrite the default axis position with a user supplied value.
|
|
2134
|
-
position = y_axis
|
|
2198
|
+
position = y_axis.position || position
|
|
2135
2199
|
|
|
2136
2200
|
@writer.tag_elements('c:valAx') do
|
|
2137
2201
|
write_axis_id(axis_ids[1])
|
|
@@ -2139,49 +2203,49 @@ def write_val_axis(params) # :nodoc:
|
|
|
2139
2203
|
# Write the c:scaling element.
|
|
2140
2204
|
write_scaling_with_param(y_axis)
|
|
2141
2205
|
|
|
2142
|
-
write_delete(1) unless ptrue?(y_axis
|
|
2206
|
+
write_delete(1) unless ptrue?(y_axis.visible)
|
|
2143
2207
|
|
|
2144
2208
|
# Write the c:axPos element.
|
|
2145
|
-
write_axis_pos(position, x_axis
|
|
2209
|
+
write_axis_pos(position, x_axis.reverse)
|
|
2146
2210
|
|
|
2147
2211
|
# Write the c:majorGridlines element.
|
|
2148
|
-
write_major_gridlines(y_axis
|
|
2212
|
+
write_major_gridlines(y_axis.major_gridlines)
|
|
2149
2213
|
|
|
2150
2214
|
# Write the c:minorGridlines element.
|
|
2151
|
-
write_minor_gridlines(y_axis
|
|
2215
|
+
write_minor_gridlines(y_axis.minor_gridlines)
|
|
2152
2216
|
|
|
2153
2217
|
# Write the axis title elements.
|
|
2154
|
-
if title = y_axis
|
|
2155
|
-
write_title_formula(title, y_axis
|
|
2156
|
-
elsif title = y_axis
|
|
2157
|
-
write_title_rich(title, horiz, y_axis
|
|
2218
|
+
if title = y_axis.formula
|
|
2219
|
+
write_title_formula(title, y_axis.data_id, horiz, y_axis.name_font)
|
|
2220
|
+
elsif title = y_axis.name
|
|
2221
|
+
write_title_rich(title, horiz, y_axis.name_font)
|
|
2158
2222
|
end
|
|
2159
2223
|
|
|
2160
2224
|
# Write the c:numberFormat element.
|
|
2161
2225
|
write_number_format(y_axis)
|
|
2162
2226
|
|
|
2163
2227
|
# Write the c:majorTickMark element.
|
|
2164
|
-
write_major_tick_mark(y_axis
|
|
2228
|
+
write_major_tick_mark(y_axis.major_tick_mark)
|
|
2165
2229
|
|
|
2166
2230
|
# Write the tickLblPos element.
|
|
2167
|
-
write_tick_label_pos(y_axis
|
|
2231
|
+
write_tick_label_pos(y_axis.label_position)
|
|
2168
2232
|
|
|
2169
2233
|
# Write the axis font elements.
|
|
2170
|
-
write_axis_font(y_axis
|
|
2234
|
+
write_axis_font(y_axis.num_font)
|
|
2171
2235
|
|
|
2172
2236
|
# Write the c:crossAx element.
|
|
2173
2237
|
write_cross_axis(axis_ids[0])
|
|
2174
2238
|
|
|
2175
|
-
write_crossing(x_axis
|
|
2239
|
+
write_crossing(x_axis.crossing)
|
|
2176
2240
|
|
|
2177
2241
|
# Write the c:crossBetween element.
|
|
2178
2242
|
write_cross_between
|
|
2179
2243
|
|
|
2180
2244
|
# Write the c:majorUnit element.
|
|
2181
|
-
write_c_major_unit(y_axis
|
|
2245
|
+
write_c_major_unit(y_axis.major_unit)
|
|
2182
2246
|
|
|
2183
2247
|
# Write the c:minorUnit element.
|
|
2184
|
-
write_c_minor_unit(y_axis
|
|
2248
|
+
write_c_minor_unit(y_axis.minor_unit)
|
|
2185
2249
|
end
|
|
2186
2250
|
end
|
|
2187
2251
|
|
|
@@ -2201,7 +2265,7 @@ def write_cat_val_axis(params) # :nodoc:
|
|
|
2201
2265
|
return unless axis_ids && !axis_ids.empty?
|
|
2202
2266
|
|
|
2203
2267
|
# Overwrite the default axis position with a user supplied value.
|
|
2204
|
-
position = x_axis
|
|
2268
|
+
position = x_axis.position || position
|
|
2205
2269
|
|
|
2206
2270
|
@writer.tag_elements('c:valAx') do
|
|
2207
2271
|
write_axis_id(axis_ids[0])
|
|
@@ -2209,89 +2273,49 @@ def write_cat_val_axis(params) # :nodoc:
|
|
|
2209
2273
|
# Write the c:scaling element.
|
|
2210
2274
|
write_scaling_with_param(x_axis)
|
|
2211
2275
|
|
|
2212
|
-
write_delete(1) unless ptrue?(x_axis
|
|
2276
|
+
write_delete(1) unless ptrue?(x_axis.visible)
|
|
2213
2277
|
|
|
2214
2278
|
# Write the c:axPos element.
|
|
2215
|
-
write_axis_pos(position, y_axis
|
|
2279
|
+
write_axis_pos(position, y_axis.reverse)
|
|
2216
2280
|
|
|
2217
2281
|
# Write the c:majorGridlines element.
|
|
2218
|
-
write_major_gridlines(x_axis
|
|
2282
|
+
write_major_gridlines(x_axis.major_gridlines)
|
|
2219
2283
|
|
|
2220
2284
|
# Write the c:minorGridlines element.
|
|
2221
|
-
write_minor_gridlines(x_axis
|
|
2285
|
+
write_minor_gridlines(x_axis.minor_gridlines)
|
|
2222
2286
|
|
|
2223
2287
|
# Write the axis title elements.
|
|
2224
|
-
if title = x_axis
|
|
2225
|
-
write_title_formula(title, y_axis
|
|
2226
|
-
elsif title = x_axis
|
|
2227
|
-
write_title_rich(title, horiz, x_axis
|
|
2288
|
+
if title = x_axis.formula
|
|
2289
|
+
write_title_formula(title, y_axis.data_id, horiz, x_axis.name_font)
|
|
2290
|
+
elsif title = x_axis.name
|
|
2291
|
+
write_title_rich(title, horiz, x_axis.name_font)
|
|
2228
2292
|
end
|
|
2229
2293
|
|
|
2230
2294
|
# Write the c:numberFormat element.
|
|
2231
2295
|
write_number_format(x_axis)
|
|
2232
2296
|
|
|
2233
2297
|
# Write the c:majorTickMark element.
|
|
2234
|
-
write_major_tick_mark(x_axis
|
|
2298
|
+
write_major_tick_mark(x_axis.major_tick_mark)
|
|
2235
2299
|
|
|
2236
2300
|
# Write the c:tickLblPos element.
|
|
2237
|
-
write_tick_label_pos(x_axis
|
|
2301
|
+
write_tick_label_pos(x_axis.label_position)
|
|
2238
2302
|
|
|
2239
2303
|
# Write the axis font elements.
|
|
2240
|
-
write_axis_font(x_axis
|
|
2304
|
+
write_axis_font(x_axis.num_font)
|
|
2241
2305
|
|
|
2242
2306
|
# Write the c:crossAx element.
|
|
2243
2307
|
write_cross_axis(axis_ids[1])
|
|
2244
2308
|
|
|
2245
|
-
write_crossing(y_axis
|
|
2309
|
+
write_crossing(y_axis.crossing)
|
|
2246
2310
|
|
|
2247
2311
|
# Write the c:crossBetween element.
|
|
2248
2312
|
write_cross_between
|
|
2249
2313
|
|
|
2250
2314
|
# Write the c:majorUnit element.
|
|
2251
|
-
write_c_major_unit(x_axis
|
|
2315
|
+
write_c_major_unit(x_axis.major_unit)
|
|
2252
2316
|
|
|
2253
2317
|
# Write the c:minorunit element.
|
|
2254
|
-
write_c_minor_unit(x_axis
|
|
2255
|
-
end
|
|
2256
|
-
end
|
|
2257
|
-
|
|
2258
|
-
def write_val_axis_common(position, hide_major_gridlines, params) # :nodoc:
|
|
2259
|
-
position ||= @val_axis_position
|
|
2260
|
-
horiz = @horiz_val_axis
|
|
2261
|
-
|
|
2262
|
-
# Overwrite the default axis position with a user supplied value.
|
|
2263
|
-
position = params[:axis_position] || position
|
|
2264
|
-
|
|
2265
|
-
@writer.tag_elements('c:valAx') do
|
|
2266
|
-
write_axis_id(params[:axis_id])
|
|
2267
|
-
# Write the c:scaling element.
|
|
2268
|
-
write_scaling_with_param(params[:scaling_axis])
|
|
2269
|
-
|
|
2270
|
-
# Write the c:axPos element.
|
|
2271
|
-
write_axis_pos(position, params[:axis_position_element])
|
|
2272
|
-
# Write the c:majorGridlines element.
|
|
2273
|
-
write_major_gridlines unless hide_major_gridlines
|
|
2274
|
-
# Write the axis title elements.
|
|
2275
|
-
if title = params[:title_axis][:_formula]
|
|
2276
|
-
write_title_formula(title, @y_axis[:_data_id], horiz)
|
|
2277
|
-
elsif title = params[:title_axis][:_name]
|
|
2278
|
-
write_title_rich(title, horiz)
|
|
2279
|
-
end
|
|
2280
|
-
# Write the c:numberFormat element.
|
|
2281
|
-
write_number_format
|
|
2282
|
-
# Write the c:tickLblPos element.
|
|
2283
|
-
write_tick_label_pos(params[:tick_label_pos])
|
|
2284
|
-
# Write the c:crossAx element.
|
|
2285
|
-
write_cross_axis(params[:cross_axis])
|
|
2286
|
-
|
|
2287
|
-
write_crossing(params[:category_crossing])
|
|
2288
|
-
|
|
2289
|
-
# Write the c:crossBetween element.
|
|
2290
|
-
write_cross_between
|
|
2291
|
-
# Write the c:majorUnit element.
|
|
2292
|
-
write_c_major_unit(params[:major_unit])
|
|
2293
|
-
# Write the c:minorUnit element.
|
|
2294
|
-
write_c_minor_unit(params[:minor_unit])
|
|
2318
|
+
write_c_minor_unit(x_axis.minor_unit)
|
|
2295
2319
|
end
|
|
2296
2320
|
end
|
|
2297
2321
|
|
|
@@ -2308,44 +2332,44 @@ def write_date_axis(params) # :nodoc:
|
|
|
2308
2332
|
position = @cat_axis_position
|
|
2309
2333
|
|
|
2310
2334
|
# Overwrite the default axis position with a user supplied value.
|
|
2311
|
-
position = x_axis
|
|
2335
|
+
position = x_axis.position || position
|
|
2312
2336
|
|
|
2313
2337
|
@writer.tag_elements('c:dateAx') do
|
|
2314
2338
|
write_axis_id(axis_ids[0])
|
|
2315
2339
|
# Write the c:scaling element.
|
|
2316
2340
|
write_scaling_with_param(x_axis)
|
|
2317
2341
|
|
|
2318
|
-
write_delete(1) unless ptrue?(x_axis
|
|
2342
|
+
write_delete(1) unless ptrue?(x_axis.visible)
|
|
2319
2343
|
|
|
2320
2344
|
# Write the c:axPos element.
|
|
2321
|
-
write_axis_pos(position, y_axis
|
|
2345
|
+
write_axis_pos(position, y_axis.reverse)
|
|
2322
2346
|
|
|
2323
2347
|
# Write the c:majorGridlines element.
|
|
2324
|
-
write_major_gridlines(x_axis
|
|
2348
|
+
write_major_gridlines(x_axis.major_gridlines)
|
|
2325
2349
|
|
|
2326
2350
|
# Write the c:minorGridlines element.
|
|
2327
|
-
write_minor_gridlines(x_axis
|
|
2351
|
+
write_minor_gridlines(x_axis.minor_gridlines)
|
|
2328
2352
|
|
|
2329
2353
|
# Write the axis title elements.
|
|
2330
|
-
if title = x_axis
|
|
2331
|
-
write_title_formula(title, x_axis
|
|
2332
|
-
elsif title = x_axis
|
|
2333
|
-
write_title_rich(title, nil, x_axis
|
|
2354
|
+
if title = x_axis.formula
|
|
2355
|
+
write_title_formula(title, x_axis.data_id, nil, x_axis.name_font)
|
|
2356
|
+
elsif title = x_axis.name
|
|
2357
|
+
write_title_rich(title, nil, x_axis.name_font)
|
|
2334
2358
|
end
|
|
2335
2359
|
# Write the c:numFmt element.
|
|
2336
2360
|
write_number_format(x_axis)
|
|
2337
2361
|
# Write the c:majorTickMark element.
|
|
2338
|
-
write_major_tick_mark(x_axis
|
|
2362
|
+
write_major_tick_mark(x_axis.major_tick_mark)
|
|
2339
2363
|
|
|
2340
2364
|
# Write the c:tickLblPos element.
|
|
2341
|
-
write_tick_label_pos(x_axis
|
|
2365
|
+
write_tick_label_pos(x_axis.label_position)
|
|
2342
2366
|
# Write the font elements.
|
|
2343
|
-
write_axis_font(x_axis
|
|
2367
|
+
write_axis_font(x_axis.num_font)
|
|
2344
2368
|
# Write the c:crossAx element.
|
|
2345
2369
|
write_cross_axis(axis_ids[1])
|
|
2346
2370
|
|
|
2347
|
-
if @show_crosses || ptrue?(x_axis
|
|
2348
|
-
write_crossing(y_axis
|
|
2371
|
+
if @show_crosses || ptrue?(x_axis.visible)
|
|
2372
|
+
write_crossing(y_axis.crossing)
|
|
2349
2373
|
end
|
|
2350
2374
|
|
|
2351
2375
|
# Write the c:auto element.
|
|
@@ -2353,16 +2377,16 @@ def write_date_axis(params) # :nodoc:
|
|
|
2353
2377
|
# Write the c:labelOffset element.
|
|
2354
2378
|
write_label_offset(100)
|
|
2355
2379
|
# Write the c:majorUnit element.
|
|
2356
|
-
write_c_major_unit(x_axis
|
|
2380
|
+
write_c_major_unit(x_axis.major_unit)
|
|
2357
2381
|
# Write the c:majorTimeUnit element.
|
|
2358
|
-
if !x_axis
|
|
2359
|
-
write_c_major_time_unit(x_axis
|
|
2382
|
+
if !x_axis.major_unit.nil?
|
|
2383
|
+
write_c_major_time_unit(x_axis.major_unit_type)
|
|
2360
2384
|
end
|
|
2361
2385
|
# Write the c:minorUnit element.
|
|
2362
|
-
write_c_minor_unit(x_axis
|
|
2386
|
+
write_c_minor_unit(x_axis.minor_unit)
|
|
2363
2387
|
# Write the c:minorTimeUnit element.
|
|
2364
|
-
if !x_axis
|
|
2365
|
-
write_c_minor_time_unit(x_axis
|
|
2388
|
+
if !x_axis.minor_unit.nil?
|
|
2389
|
+
write_c_minor_time_unit(x_axis.minor_unit_type)
|
|
2366
2390
|
end
|
|
2367
2391
|
end
|
|
2368
2392
|
end
|
|
@@ -2380,10 +2404,10 @@ def write_crossing(crossing)
|
|
|
2380
2404
|
|
|
2381
2405
|
def write_scaling_with_param(param)
|
|
2382
2406
|
write_scaling(
|
|
2383
|
-
param
|
|
2384
|
-
param
|
|
2385
|
-
param
|
|
2386
|
-
param
|
|
2407
|
+
param.reverse,
|
|
2408
|
+
param.min,
|
|
2409
|
+
param.max,
|
|
2410
|
+
param.log_base
|
|
2387
2411
|
)
|
|
2388
2412
|
end
|
|
2389
2413
|
#
|
|
@@ -2408,9 +2432,7 @@ def write_scaling(reverse, min = nil, max = nil, log_base = nil) # :nodoc:
|
|
|
2408
2432
|
def write_c_log_base(val) # :nodoc:
|
|
2409
2433
|
return unless ptrue?(val)
|
|
2410
2434
|
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
@writer.empty_tag('c:logBase', attributes)
|
|
2435
|
+
@writer.empty_tag('c:logBase', ['val', val])
|
|
2414
2436
|
end
|
|
2415
2437
|
|
|
2416
2438
|
#
|
|
@@ -2419,9 +2441,7 @@ def write_c_log_base(val) # :nodoc:
|
|
|
2419
2441
|
def write_orientation(reverse = nil) # :nodoc:
|
|
2420
2442
|
val = ptrue?(reverse) ? 'maxMin' : 'minMax'
|
|
2421
2443
|
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
@writer.empty_tag('c:orientation', attributes)
|
|
2444
|
+
@writer.empty_tag('c:orientation', ['val', val])
|
|
2425
2445
|
end
|
|
2426
2446
|
|
|
2427
2447
|
#
|
|
@@ -2430,9 +2450,7 @@ def write_orientation(reverse = nil) # :nodoc:
|
|
|
2430
2450
|
def write_c_max(max = nil) # :nodoc:
|
|
2431
2451
|
return if max.nil?
|
|
2432
2452
|
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
@writer.empty_tag('c:max', attributes)
|
|
2453
|
+
@writer.empty_tag('c:max', ['val', max])
|
|
2436
2454
|
end
|
|
2437
2455
|
|
|
2438
2456
|
#
|
|
@@ -2441,9 +2459,7 @@ def write_c_max(max = nil) # :nodoc:
|
|
|
2441
2459
|
def write_c_min(min = nil) # :nodoc:
|
|
2442
2460
|
return if min.nil?
|
|
2443
2461
|
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
@writer.empty_tag('c:min', attributes)
|
|
2462
|
+
@writer.empty_tag('c:min', ['val', min])
|
|
2447
2463
|
end
|
|
2448
2464
|
|
|
2449
2465
|
#
|
|
@@ -2455,9 +2471,7 @@ def write_axis_pos(val, reverse = false) # :nodoc:
|
|
|
2455
2471
|
val = 't' if val == 'b'
|
|
2456
2472
|
end
|
|
2457
2473
|
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
@writer.empty_tag('c:axPos', attributes)
|
|
2474
|
+
@writer.empty_tag('c:axPos', ['val', val])
|
|
2461
2475
|
end
|
|
2462
2476
|
|
|
2463
2477
|
#
|
|
@@ -2467,25 +2481,7 @@ def write_axis_pos(val, reverse = false) # :nodoc:
|
|
|
2467
2481
|
#
|
|
2468
2482
|
|
|
2469
2483
|
def write_number_format(axis) # :nodoc:
|
|
2470
|
-
|
|
2471
|
-
source_linked = 1
|
|
2472
|
-
|
|
2473
|
-
# Check if a user defined number format has been set.
|
|
2474
|
-
if axis[:_defaults] && format_code != axis[:_defaults][:num_format]
|
|
2475
|
-
source_linked = 0
|
|
2476
|
-
end
|
|
2477
|
-
|
|
2478
|
-
# User override of sourceLinked.
|
|
2479
|
-
if ptrue?(axis[:_num_format_linked])
|
|
2480
|
-
source_linked = 1
|
|
2481
|
-
end
|
|
2482
|
-
|
|
2483
|
-
attributes = [
|
|
2484
|
-
'formatCode', format_code,
|
|
2485
|
-
'sourceLinked', source_linked
|
|
2486
|
-
]
|
|
2487
|
-
|
|
2488
|
-
@writer.empty_tag('c:numFmt', attributes)
|
|
2484
|
+
axis.write_number_format(@writer)
|
|
2489
2485
|
end
|
|
2490
2486
|
|
|
2491
2487
|
#
|
|
@@ -2493,32 +2489,7 @@ def write_number_format(axis) # :nodoc:
|
|
|
2493
2489
|
# don't always have a number format.
|
|
2494
2490
|
#
|
|
2495
2491
|
def write_cat_number_format(axis)
|
|
2496
|
-
|
|
2497
|
-
source_linked = 1
|
|
2498
|
-
default_format = true
|
|
2499
|
-
|
|
2500
|
-
# Check if a user defined number format has been set.
|
|
2501
|
-
if axis[:_defaults] && format_code != axis[:_defaults][:num_format]
|
|
2502
|
-
source_linked = 0
|
|
2503
|
-
default_format = false
|
|
2504
|
-
end
|
|
2505
|
-
|
|
2506
|
-
# User override of linkedSource.
|
|
2507
|
-
if axis[:_num_format_linked]
|
|
2508
|
-
source_linked = 1
|
|
2509
|
-
end
|
|
2510
|
-
|
|
2511
|
-
# Skip if cat doesn't have a num format (unless it is non-default).
|
|
2512
|
-
if !@cat_has_num_fmt && default_format
|
|
2513
|
-
return ''
|
|
2514
|
-
end
|
|
2515
|
-
|
|
2516
|
-
attributes = [
|
|
2517
|
-
'formatCode', format_code,
|
|
2518
|
-
'sourceLinked', source_linked,
|
|
2519
|
-
]
|
|
2520
|
-
|
|
2521
|
-
@writer.empty_tag('c:numFmt', attributes)
|
|
2492
|
+
axis.write_cat_number_format(@writer, @cat_has_num_fmt)
|
|
2522
2493
|
end
|
|
2523
2494
|
|
|
2524
2495
|
#
|
|
@@ -2527,9 +2498,7 @@ def write_cat_number_format(axis)
|
|
|
2527
2498
|
def write_major_tick_mark(val)
|
|
2528
2499
|
return unless ptrue?(val)
|
|
2529
2500
|
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
@writer.empty_tag('c:majorTickMark', attributes)
|
|
2501
|
+
@writer.empty_tag('c:majorTickMark', ['val', val])
|
|
2533
2502
|
end
|
|
2534
2503
|
|
|
2535
2504
|
#
|
|
@@ -2539,18 +2508,14 @@ def write_tick_label_pos(val) # :nodoc:
|
|
|
2539
2508
|
val ||= 'nextTo'
|
|
2540
2509
|
val = 'nextTo' if val == 'next_to'
|
|
2541
2510
|
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
@writer.empty_tag('c:tickLblPos', attributes)
|
|
2511
|
+
@writer.empty_tag('c:tickLblPos', ['val', val])
|
|
2545
2512
|
end
|
|
2546
2513
|
|
|
2547
2514
|
#
|
|
2548
2515
|
# Write the <c:crossAx> element.
|
|
2549
2516
|
#
|
|
2550
2517
|
def write_cross_axis(val = 'autoZero') # :nodoc:
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
@writer.empty_tag('c:crossAx', attributes)
|
|
2518
|
+
@writer.empty_tag('c:crossAx', ['val', val])
|
|
2554
2519
|
end
|
|
2555
2520
|
|
|
2556
2521
|
#
|
|
@@ -2559,73 +2524,54 @@ def write_cross_axis(val = 'autoZero') # :nodoc:
|
|
|
2559
2524
|
def write_crosses(val) # :nodoc:
|
|
2560
2525
|
val ||= 'autoZero'
|
|
2561
2526
|
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
@writer.empty_tag('c:crosses', attributes)
|
|
2527
|
+
@writer.empty_tag('c:crosses', ['val', val])
|
|
2565
2528
|
end
|
|
2566
2529
|
|
|
2567
2530
|
#
|
|
2568
2531
|
# Write the <c:crossesAt> element.
|
|
2569
2532
|
#
|
|
2570
2533
|
def write_c_crosses_at(val) # :nodoc:
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
@writer.empty_tag('c:crossesAt', attributes)
|
|
2534
|
+
@writer.empty_tag('c:crossesAt', ['val', val])
|
|
2574
2535
|
end
|
|
2575
2536
|
|
|
2576
2537
|
#
|
|
2577
2538
|
# Write the <c:auto> element.
|
|
2578
2539
|
#
|
|
2579
2540
|
def write_auto(val) # :nodoc:
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
@writer.empty_tag('c:auto', attributes)
|
|
2541
|
+
@writer.empty_tag('c:auto', ['val', val])
|
|
2583
2542
|
end
|
|
2584
2543
|
|
|
2585
2544
|
#
|
|
2586
2545
|
# Write the <c:labelAlign> element.
|
|
2587
2546
|
#
|
|
2588
2547
|
def write_label_align(val) # :nodoc:
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
@writer.empty_tag('c:lblAlgn', attributes)
|
|
2548
|
+
@writer.empty_tag('c:lblAlgn', ['val', val])
|
|
2592
2549
|
end
|
|
2593
2550
|
|
|
2594
2551
|
#
|
|
2595
2552
|
# Write the <c:labelOffset> element.
|
|
2596
2553
|
#
|
|
2597
2554
|
def write_label_offset(val) # :nodoc:
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
@writer.empty_tag('c:lblOffset', attributes)
|
|
2555
|
+
@writer.empty_tag('c:lblOffset', ['val', val])
|
|
2601
2556
|
end
|
|
2602
2557
|
|
|
2603
2558
|
#
|
|
2604
2559
|
# Write the <c:majorGridlines> element.
|
|
2605
2560
|
#
|
|
2606
2561
|
def write_major_gridlines(gridlines) # :nodoc:
|
|
2607
|
-
|
|
2562
|
+
write_gridlines_base('c:majorGridlines', gridlines)
|
|
2608
2563
|
end
|
|
2609
2564
|
|
|
2610
2565
|
#
|
|
2611
2566
|
# Write the <c:minorGridlines> element.
|
|
2612
2567
|
#
|
|
2613
2568
|
def write_minor_gridlines(gridlines) # :nodoc:
|
|
2614
|
-
|
|
2569
|
+
write_gridlines_base('c:minorGridlines', gridlines)
|
|
2615
2570
|
end
|
|
2616
2571
|
|
|
2617
|
-
def
|
|
2618
|
-
return
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
if gridlines[:_line] && ptrue?(gridlines[:_line][:_defined])
|
|
2622
|
-
@writer.tag_elements(tag) do
|
|
2623
|
-
# Write the c:spPr element.
|
|
2624
|
-
write_sp_pr(gridlines)
|
|
2625
|
-
end
|
|
2626
|
-
else
|
|
2627
|
-
@writer.empty_tag(tag)
|
|
2628
|
-
end
|
|
2572
|
+
def write_gridlines_base(tag, gridlines) # :nodoc:
|
|
2573
|
+
return if gridlines.respond_to?(:[]) and !ptrue?(gridlines[:_visible])
|
|
2574
|
+
write_lines_base(tag, gridlines)
|
|
2629
2575
|
end
|
|
2630
2576
|
|
|
2631
2577
|
#
|
|
@@ -2634,9 +2580,7 @@ def write_gridlines_common(gridlines, tag) # :nodoc:
|
|
|
2634
2580
|
def write_cross_between # :nodoc:
|
|
2635
2581
|
val = @cross_between || 'between'
|
|
2636
2582
|
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
@writer.empty_tag('c:crossBetween', attributes)
|
|
2583
|
+
@writer.empty_tag('c:crossBetween', ['val', val])
|
|
2640
2584
|
end
|
|
2641
2585
|
|
|
2642
2586
|
#
|
|
@@ -2645,9 +2589,7 @@ def write_cross_between # :nodoc:
|
|
|
2645
2589
|
def write_c_major_unit(val = nil) # :nodoc:
|
|
2646
2590
|
return unless val
|
|
2647
2591
|
|
|
2648
|
-
|
|
2649
|
-
|
|
2650
|
-
@writer.empty_tag('c:majorUnit', attributes)
|
|
2592
|
+
@writer.empty_tag('c:majorUnit', ['val', val])
|
|
2651
2593
|
end
|
|
2652
2594
|
|
|
2653
2595
|
#
|
|
@@ -2656,9 +2598,7 @@ def write_c_major_unit(val = nil) # :nodoc:
|
|
|
2656
2598
|
def write_c_minor_unit(val = nil) # :nodoc:
|
|
2657
2599
|
return unless val
|
|
2658
2600
|
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
@writer.empty_tag('c:minorUnit', attributes)
|
|
2601
|
+
@writer.empty_tag('c:minorUnit', ['val', val])
|
|
2662
2602
|
end
|
|
2663
2603
|
|
|
2664
2604
|
#
|
|
@@ -2666,9 +2606,8 @@ def write_c_minor_unit(val = nil) # :nodoc:
|
|
|
2666
2606
|
#
|
|
2667
2607
|
def write_c_major_time_unit(val) # :nodoc:
|
|
2668
2608
|
val ||= 'days'
|
|
2669
|
-
attributes = ['val', val]
|
|
2670
2609
|
|
|
2671
|
-
@writer.empty_tag('c:majorTimeUnit',
|
|
2610
|
+
@writer.empty_tag('c:majorTimeUnit', ['val', val])
|
|
2672
2611
|
end
|
|
2673
2612
|
|
|
2674
2613
|
#
|
|
@@ -2676,9 +2615,8 @@ def write_c_major_time_unit(val) # :nodoc:
|
|
|
2676
2615
|
#
|
|
2677
2616
|
def write_c_minor_time_unit(val) # :nodoc:
|
|
2678
2617
|
val ||= 'days'
|
|
2679
|
-
attributes = ['val', val]
|
|
2680
2618
|
|
|
2681
|
-
@writer.empty_tag('c:minorTimeUnit',
|
|
2619
|
+
@writer.empty_tag('c:minorTimeUnit', ['val', val])
|
|
2682
2620
|
end
|
|
2683
2621
|
|
|
2684
2622
|
#
|
|
@@ -2728,9 +2666,7 @@ def write_legend # :nodoc:
|
|
|
2728
2666
|
# Write the <c:legendPos> element.
|
|
2729
2667
|
#
|
|
2730
2668
|
def write_legend_pos(val) # :nodoc:
|
|
2731
|
-
|
|
2732
|
-
|
|
2733
|
-
@writer.empty_tag('c:legendPos', attributes)
|
|
2669
|
+
@writer.empty_tag('c:legendPos', ['val', val])
|
|
2734
2670
|
end
|
|
2735
2671
|
|
|
2736
2672
|
#
|
|
@@ -2749,11 +2685,7 @@ def write_legend_entry(index) # :nodoc:
|
|
|
2749
2685
|
# Write the <c:overlay> element.
|
|
2750
2686
|
#
|
|
2751
2687
|
def write_overlay # :nodoc:
|
|
2752
|
-
val
|
|
2753
|
-
|
|
2754
|
-
attributes = ['val', val]
|
|
2755
|
-
|
|
2756
|
-
@writer.empty_tag('c:overlay', attributes)
|
|
2688
|
+
@writer.empty_tag('c:overlay', ['val', 1])
|
|
2757
2689
|
end
|
|
2758
2690
|
|
|
2759
2691
|
#
|
|
@@ -2765,9 +2697,7 @@ def write_plot_vis_only # :nodoc:
|
|
|
2765
2697
|
# Ignore this element if we are plotting hidden data.
|
|
2766
2698
|
return if @show_hidden_data
|
|
2767
2699
|
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
@writer.empty_tag('c:plotVisOnly', attributes)
|
|
2700
|
+
@writer.empty_tag('c:plotVisOnly', ['val', val])
|
|
2771
2701
|
end
|
|
2772
2702
|
|
|
2773
2703
|
#
|
|
@@ -2960,11 +2890,7 @@ def write_a_def_rpr(font = nil) # :nodoc:
|
|
|
2960
2890
|
# Write the <a:endParaRPr> element.
|
|
2961
2891
|
#
|
|
2962
2892
|
def write_a_end_para_rpr # :nodoc:
|
|
2963
|
-
lang
|
|
2964
|
-
|
|
2965
|
-
attributes = ['lang', lang]
|
|
2966
|
-
|
|
2967
|
-
@writer.empty_tag('a:endParaRPr', attributes)
|
|
2893
|
+
@writer.empty_tag('a:endParaRPr', ['lang', 'en-US'])
|
|
2968
2894
|
end
|
|
2969
2895
|
|
|
2970
2896
|
#
|
|
@@ -3053,31 +2979,23 @@ def write_marker(marker = nil) # :nodoc:
|
|
|
3053
2979
|
# Write the <c:marker> element without a sub-element.
|
|
3054
2980
|
#
|
|
3055
2981
|
def write_marker_value # :nodoc:
|
|
3056
|
-
|
|
2982
|
+
return unless @default_marker
|
|
3057
2983
|
|
|
3058
|
-
|
|
3059
|
-
|
|
3060
|
-
attributes = ['val', 1]
|
|
3061
|
-
|
|
3062
|
-
@writer.empty_tag('c:marker', attributes)
|
|
2984
|
+
@writer.empty_tag('c:marker', ['val', 1])
|
|
3063
2985
|
end
|
|
3064
2986
|
|
|
3065
2987
|
#
|
|
3066
2988
|
# Write the <c:size> element.
|
|
3067
2989
|
#
|
|
3068
2990
|
def write_marker_size(val) # :nodoc:
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
@writer.empty_tag('c:size', attributes)
|
|
2991
|
+
@writer.empty_tag('c:size', ['val', val])
|
|
3072
2992
|
end
|
|
3073
2993
|
|
|
3074
2994
|
#
|
|
3075
2995
|
# Write the <c:symbol> element.
|
|
3076
2996
|
#
|
|
3077
2997
|
def write_symbol(val) # :nodoc:
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
@writer.empty_tag('c:symbol', attributes)
|
|
2998
|
+
@writer.empty_tag('c:symbol', ['val', val])
|
|
3081
2999
|
end
|
|
3082
3000
|
|
|
3083
3001
|
#
|
|
@@ -3162,18 +3080,14 @@ def write_a_solid_fill(line) # :nodoc:
|
|
|
3162
3080
|
# Write the <a:srgbClr> element.
|
|
3163
3081
|
#
|
|
3164
3082
|
def write_a_srgb_clr(val) # :nodoc:
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
@writer.empty_tag('a:srgbClr', attributes)
|
|
3083
|
+
@writer.empty_tag('a:srgbClr', ['val', val])
|
|
3168
3084
|
end
|
|
3169
3085
|
|
|
3170
3086
|
#
|
|
3171
3087
|
# Write the <a:prstDash> element.
|
|
3172
3088
|
#
|
|
3173
3089
|
def write_a_prst_dash(val) # :nodoc:
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
@writer.empty_tag('a:prstDash', attributes)
|
|
3090
|
+
@writer.empty_tag('a:prstDash', ['val', val])
|
|
3177
3091
|
end
|
|
3178
3092
|
|
|
3179
3093
|
#
|
|
@@ -3204,9 +3118,7 @@ def write_trendline(trendline) # :nodoc:
|
|
|
3204
3118
|
# Write the <c:trendlineType> element.
|
|
3205
3119
|
#
|
|
3206
3120
|
def write_trendline_type(val) # :nodoc:
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
@writer.empty_tag('c:trendlineType', attributes)
|
|
3121
|
+
@writer.empty_tag('c:trendlineType', ['val', val])
|
|
3210
3122
|
end
|
|
3211
3123
|
|
|
3212
3124
|
#
|
|
@@ -3222,18 +3134,14 @@ def write_name(data) # :nodoc:
|
|
|
3222
3134
|
# Write the <c:order> element.
|
|
3223
3135
|
#
|
|
3224
3136
|
def write_trendline_order(val = 2) # :nodoc:
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
@writer.empty_tag('c:order', attributes)
|
|
3137
|
+
@writer.empty_tag('c:order', ['val', val])
|
|
3228
3138
|
end
|
|
3229
3139
|
|
|
3230
3140
|
#
|
|
3231
3141
|
# Write the <c:period> element.
|
|
3232
3142
|
#
|
|
3233
3143
|
def write_period(val = 2) # :nodoc:
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
@writer.empty_tag('c:period', attributes)
|
|
3144
|
+
@writer.empty_tag('c:period', ['val', val])
|
|
3237
3145
|
end
|
|
3238
3146
|
|
|
3239
3147
|
#
|
|
@@ -3242,9 +3150,7 @@ def write_period(val = 2) # :nodoc:
|
|
|
3242
3150
|
def write_forward(val) # :nodoc:
|
|
3243
3151
|
return unless val
|
|
3244
3152
|
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
@writer.empty_tag('c:forward', attributes)
|
|
3153
|
+
@writer.empty_tag('c:forward', ['val', val])
|
|
3248
3154
|
end
|
|
3249
3155
|
|
|
3250
3156
|
#
|
|
@@ -3253,27 +3159,41 @@ def write_forward(val) # :nodoc:
|
|
|
3253
3159
|
def write_backward(val) # :nodoc:
|
|
3254
3160
|
return unless val
|
|
3255
3161
|
|
|
3256
|
-
|
|
3257
|
-
|
|
3258
|
-
@writer.empty_tag('c:backward', attributes)
|
|
3162
|
+
@writer.empty_tag('c:backward', ['val', val])
|
|
3259
3163
|
end
|
|
3260
3164
|
|
|
3261
3165
|
#
|
|
3262
3166
|
# Write the <c:hiLowLines> element.
|
|
3263
3167
|
#
|
|
3264
3168
|
def write_hi_low_lines # :nodoc:
|
|
3265
|
-
|
|
3169
|
+
write_lines_base('c:hiLowLines', @hi_low_lines)
|
|
3266
3170
|
end
|
|
3267
3171
|
|
|
3268
3172
|
#
|
|
3269
|
-
# Write the <c:
|
|
3173
|
+
# Write the <c:dropLines> elent.
|
|
3270
3174
|
#
|
|
3271
|
-
def
|
|
3272
|
-
|
|
3175
|
+
def write_drop_lines
|
|
3176
|
+
write_lines_base('c:dropLines', @drop_lines)
|
|
3177
|
+
end
|
|
3273
3178
|
|
|
3274
|
-
|
|
3179
|
+
#
|
|
3180
|
+
# used from write_drop_lines and write_hi_low_lines
|
|
3181
|
+
#
|
|
3182
|
+
def write_lines_base(tag, lines)
|
|
3183
|
+
return unless lines
|
|
3275
3184
|
|
|
3276
|
-
|
|
3185
|
+
if lines[:_line] && ptrue?(lines[:_line][:_defined])
|
|
3186
|
+
@writer.tag_elements(tag) { write_sp_pr(lines) }
|
|
3187
|
+
else
|
|
3188
|
+
@writer.empty_tag(tag)
|
|
3189
|
+
end
|
|
3190
|
+
end
|
|
3191
|
+
|
|
3192
|
+
#
|
|
3193
|
+
# Write the <c:overlap> element.
|
|
3194
|
+
#
|
|
3195
|
+
def write_overlap # :nodoc:
|
|
3196
|
+
@writer.empty_tag('c:overlap', ['val', 100])
|
|
3277
3197
|
end
|
|
3278
3198
|
|
|
3279
3199
|
#
|
|
@@ -3328,9 +3248,7 @@ def write_format_code(data) # :nodoc:
|
|
|
3328
3248
|
# Write the <c:ptCount> element.
|
|
3329
3249
|
#
|
|
3330
3250
|
def write_pt_count(val) # :nodoc:
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
@writer.empty_tag('c:ptCount', attributes)
|
|
3251
|
+
@writer.empty_tag('c:ptCount', ['val', val])
|
|
3334
3252
|
end
|
|
3335
3253
|
|
|
3336
3254
|
#
|
|
@@ -3360,6 +3278,32 @@ def write_protection # :nodoc:
|
|
|
3360
3278
|
@writer.empty_tag('c:protection')
|
|
3361
3279
|
end
|
|
3362
3280
|
|
|
3281
|
+
#
|
|
3282
|
+
# Write the <c:dPt> elements.
|
|
3283
|
+
#
|
|
3284
|
+
def write_d_pt(points = nil)
|
|
3285
|
+
return unless ptrue?(points)
|
|
3286
|
+
|
|
3287
|
+
index = -1
|
|
3288
|
+
points.each do |point|
|
|
3289
|
+
index += 1
|
|
3290
|
+
next unless ptrue?(point)
|
|
3291
|
+
|
|
3292
|
+
write_d_pt_point(index, point)
|
|
3293
|
+
end
|
|
3294
|
+
end
|
|
3295
|
+
|
|
3296
|
+
#
|
|
3297
|
+
# Write an individual <c:dPt> element.
|
|
3298
|
+
#
|
|
3299
|
+
def write_d_pt_point(index, point)
|
|
3300
|
+
@writer.tag_elements('c:dPt') do
|
|
3301
|
+
# Write the c:idx element.
|
|
3302
|
+
write_idx(index)
|
|
3303
|
+
# Write the c:spPr element.
|
|
3304
|
+
write_sp_pr(point)
|
|
3305
|
+
end
|
|
3306
|
+
end
|
|
3363
3307
|
#
|
|
3364
3308
|
# Write the <c:dLbls> element.
|
|
3365
3309
|
#
|
|
@@ -3386,86 +3330,58 @@ def write_d_lbls(labels) # :nodoc:
|
|
|
3386
3330
|
# Write the <c:showVal> element.
|
|
3387
3331
|
#
|
|
3388
3332
|
def write_show_val # :nodoc:
|
|
3389
|
-
val
|
|
3390
|
-
|
|
3391
|
-
attributes = ['val', val]
|
|
3392
|
-
|
|
3393
|
-
@writer.empty_tag('c:showVal', attributes)
|
|
3333
|
+
@writer.empty_tag('c:showVal', ['val', 1])
|
|
3394
3334
|
end
|
|
3395
3335
|
|
|
3396
3336
|
#
|
|
3397
3337
|
# Write the <c:showCatName> element.
|
|
3398
3338
|
#
|
|
3399
3339
|
def write_show_cat_name # :nodoc:
|
|
3400
|
-
val
|
|
3401
|
-
|
|
3402
|
-
attributes = ['val', val]
|
|
3403
|
-
|
|
3404
|
-
@writer.empty_tag('c:showCatName', attributes)
|
|
3340
|
+
@writer.empty_tag('c:showCatName', ['val', 1])
|
|
3405
3341
|
end
|
|
3406
3342
|
|
|
3407
3343
|
#
|
|
3408
3344
|
# Write the <c:showSerName> element.
|
|
3409
3345
|
#
|
|
3410
3346
|
def write_show_ser_name # :nodoc:
|
|
3411
|
-
val
|
|
3412
|
-
|
|
3413
|
-
attributes = ['val', val]
|
|
3414
|
-
|
|
3415
|
-
@writer.empty_tag('c:showSerName', attributes)
|
|
3347
|
+
@writer.empty_tag('c:showSerName', ['val', 1])
|
|
3416
3348
|
end
|
|
3417
3349
|
|
|
3418
3350
|
#
|
|
3419
3351
|
# Write the <c:showPercent> element.
|
|
3420
3352
|
#
|
|
3421
3353
|
def write_show_percent
|
|
3422
|
-
val
|
|
3423
|
-
|
|
3424
|
-
attributes = ['val', val]
|
|
3425
|
-
|
|
3426
|
-
@writer.empty_tag('c:showPercent', attributes)
|
|
3354
|
+
@writer.empty_tag('c:showPercent', ['val', 1])
|
|
3427
3355
|
end
|
|
3428
3356
|
|
|
3429
3357
|
#
|
|
3430
3358
|
# Write the <c:showLeaderLines> element.
|
|
3431
3359
|
#
|
|
3432
3360
|
def write_show_leader_lines
|
|
3433
|
-
val
|
|
3434
|
-
|
|
3435
|
-
attributes = ['val', val]
|
|
3436
|
-
|
|
3437
|
-
@writer.empty_tag('c:showLeaderLines', attributes)
|
|
3361
|
+
@writer.empty_tag('c:showLeaderLines', ['val', 1])
|
|
3438
3362
|
end
|
|
3439
3363
|
|
|
3440
3364
|
#
|
|
3441
3365
|
# Write the <c:dLblPos> element.
|
|
3442
3366
|
#
|
|
3443
3367
|
def write_d_lbl_pos(val)
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
@writer.empty_tag('c:dLblPos', attributes)
|
|
3368
|
+
@writer.empty_tag('c:dLblPos', ['val', val])
|
|
3447
3369
|
end
|
|
3448
3370
|
|
|
3449
3371
|
#
|
|
3450
3372
|
# Write the <c:delete> element.
|
|
3451
3373
|
#
|
|
3452
3374
|
def write_delete(val) # :nodoc:
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
@writer.empty_tag('c:delete', attributes)
|
|
3375
|
+
@writer.empty_tag('c:delete', ['val', val])
|
|
3456
3376
|
end
|
|
3457
3377
|
|
|
3458
3378
|
#
|
|
3459
3379
|
# Write the <c:invertIfNegative> element.
|
|
3460
3380
|
#
|
|
3461
3381
|
def write_c_invert_if_negative(invert = nil) # :nodoc:
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
return unless invert && invert != 0
|
|
3382
|
+
return unless ptrue?(invert)
|
|
3465
3383
|
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
@writer.empty_tag('c:invertIfNegative', attributes)
|
|
3384
|
+
@writer.empty_tag('c:invertIfNegative', ['val', 1])
|
|
3469
3385
|
end
|
|
3470
3386
|
|
|
3471
3387
|
#
|
|
@@ -3498,6 +3414,133 @@ def write_d_table
|
|
|
3498
3414
|
@table.write_d_table(@writer) if @table
|
|
3499
3415
|
end
|
|
3500
3416
|
|
|
3417
|
+
#
|
|
3418
|
+
# Write the X and Y error bars.
|
|
3419
|
+
#
|
|
3420
|
+
def write_error_bars(error_bars)
|
|
3421
|
+
return unless ptrue?(error_bars)
|
|
3422
|
+
|
|
3423
|
+
if error_bars[:_x_error_bars]
|
|
3424
|
+
write_err_bars('x', error_bars[:_x_error_bars])
|
|
3425
|
+
end
|
|
3426
|
+
if error_bars[:_y_error_bars]
|
|
3427
|
+
write_err_bars('y', error_bars[:_y_error_bars])
|
|
3428
|
+
end
|
|
3429
|
+
end
|
|
3430
|
+
|
|
3431
|
+
#
|
|
3432
|
+
# Write the <c:errBars> element.
|
|
3433
|
+
#
|
|
3434
|
+
def write_err_bars(direction, error_bars)
|
|
3435
|
+
return unless ptrue?(error_bars)
|
|
3436
|
+
|
|
3437
|
+
@writer.tag_elements('c:errBars') do
|
|
3438
|
+
# Write the c:errDir element.
|
|
3439
|
+
write_err_dir(direction)
|
|
3440
|
+
|
|
3441
|
+
# Write the c:errBarType element.
|
|
3442
|
+
write_err_bar_type(error_bars[:_direction])
|
|
3443
|
+
|
|
3444
|
+
# Write the c:errValType element.
|
|
3445
|
+
write_err_val_type(error_bars[:_type])
|
|
3446
|
+
|
|
3447
|
+
unless ptrue?(error_bars[:_endcap])
|
|
3448
|
+
# Write the c:noEndCap element.
|
|
3449
|
+
write_no_end_cap
|
|
3450
|
+
end
|
|
3451
|
+
|
|
3452
|
+
if error_bars[:_type] != 'stdErr'
|
|
3453
|
+
# Write the c:val element.
|
|
3454
|
+
write_error_val(error_bars[:_value])
|
|
3455
|
+
end
|
|
3456
|
+
|
|
3457
|
+
# Write the c:spPr element.
|
|
3458
|
+
write_sp_pr(error_bars)
|
|
3459
|
+
end
|
|
3460
|
+
end
|
|
3461
|
+
|
|
3462
|
+
#
|
|
3463
|
+
# Write the <c:errDir> element.
|
|
3464
|
+
#
|
|
3465
|
+
def write_err_dir(val)
|
|
3466
|
+
@writer.empty_tag('c:errDir', ['val', val])
|
|
3467
|
+
end
|
|
3468
|
+
|
|
3469
|
+
#
|
|
3470
|
+
# Write the <c:errBarType> element.
|
|
3471
|
+
#
|
|
3472
|
+
def write_err_bar_type(val)
|
|
3473
|
+
@writer.empty_tag('c:errBarType', ['val', val])
|
|
3474
|
+
end
|
|
3475
|
+
|
|
3476
|
+
#
|
|
3477
|
+
# Write the <c:errValType> element.
|
|
3478
|
+
#
|
|
3479
|
+
def write_err_val_type(val)
|
|
3480
|
+
@writer.empty_tag('c:errValType', ['val', val])
|
|
3481
|
+
end
|
|
3482
|
+
|
|
3483
|
+
#
|
|
3484
|
+
# Write the <c:noEndCap> element.
|
|
3485
|
+
#
|
|
3486
|
+
def write_no_end_cap
|
|
3487
|
+
@writer.empty_tag('c:noEndCap', ['val', 1])
|
|
3488
|
+
end
|
|
3489
|
+
|
|
3490
|
+
#
|
|
3491
|
+
# Write the <c:val> element.
|
|
3492
|
+
#
|
|
3493
|
+
def write_error_val(val)
|
|
3494
|
+
@writer.empty_tag('c:val', ['val', val])
|
|
3495
|
+
end
|
|
3496
|
+
|
|
3497
|
+
#
|
|
3498
|
+
# Write the <c:upDownBars> element.
|
|
3499
|
+
#
|
|
3500
|
+
def write_up_down_bars
|
|
3501
|
+
return unless ptrue?(@up_down_bars)
|
|
3502
|
+
|
|
3503
|
+
@writer.tag_elements('c:upDownBars') do
|
|
3504
|
+
# Write the c:gapWidth element.
|
|
3505
|
+
write_gap_width
|
|
3506
|
+
|
|
3507
|
+
# Write the c:upBars element.
|
|
3508
|
+
write_up_bars(@up_down_bars[:_up])
|
|
3509
|
+
|
|
3510
|
+
# Write the c:downBars element.
|
|
3511
|
+
write_down_bars(@up_down_bars[:_down])
|
|
3512
|
+
end
|
|
3513
|
+
end
|
|
3514
|
+
|
|
3515
|
+
#
|
|
3516
|
+
# Write the <c:gapWidth> element.
|
|
3517
|
+
#
|
|
3518
|
+
def write_gap_width
|
|
3519
|
+
@writer.empty_tag('c:gapWidth', ['val', 150])
|
|
3520
|
+
end
|
|
3521
|
+
|
|
3522
|
+
#
|
|
3523
|
+
# Write the <c:upBars> element.
|
|
3524
|
+
#
|
|
3525
|
+
def write_up_bars(format)
|
|
3526
|
+
write_bars_base('c:upBars', format)
|
|
3527
|
+
end
|
|
3528
|
+
|
|
3529
|
+
#
|
|
3530
|
+
# Write the <c:upBars> element.
|
|
3531
|
+
#
|
|
3532
|
+
def write_down_bars(format)
|
|
3533
|
+
write_bars_base('c:downBars', format)
|
|
3534
|
+
end
|
|
3535
|
+
|
|
3536
|
+
def write_bars_base(tag, format)
|
|
3537
|
+
if ptrue?(format[:_line][:_defined]) || ptrue?(format[:_fill][:_defined])
|
|
3538
|
+
@writer.tag_elements(tag) { write_sp_pr(format) }
|
|
3539
|
+
else
|
|
3540
|
+
@writer.empty_tag(tag)
|
|
3541
|
+
end
|
|
3542
|
+
end
|
|
3543
|
+
|
|
3501
3544
|
def nil_or_max?(val) # :nodoc:
|
|
3502
3545
|
val.nil? || val == 'max'
|
|
3503
3546
|
end
|