write_xlsx 0.75.0 → 0.76.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.
- checksums.yaml +4 -4
- data/Changes +4 -0
- data/Gemfile +8 -2
- data/README.md +4 -2
- data/lib/write_xlsx/chart/axis.rb +69 -96
- data/lib/write_xlsx/chart/bar.rb +18 -21
- data/lib/write_xlsx/chart/caption.rb +1 -1
- data/lib/write_xlsx/chart/column.rb +1 -5
- data/lib/write_xlsx/chart/line.rb +2 -16
- data/lib/write_xlsx/chart/pie.rb +18 -40
- data/lib/write_xlsx/chart/radar.rb +2 -5
- data/lib/write_xlsx/chart/scatter.rb +24 -32
- data/lib/write_xlsx/chart/series.rb +218 -236
- data/lib/write_xlsx/chart/stock.rb +15 -27
- data/lib/write_xlsx/chart.rb +303 -392
- data/lib/write_xlsx/chartsheet.rb +22 -20
- data/lib/write_xlsx/colors.rb +9 -15
- data/lib/write_xlsx/drawing.rb +26 -28
- data/lib/write_xlsx/format.rb +15 -15
- data/lib/write_xlsx/package/comments.rb +1 -1
- data/lib/write_xlsx/package/conditional_format.rb +8 -8
- data/lib/write_xlsx/package/relationships.rb +4 -15
- data/lib/write_xlsx/package/styles.rb +9 -16
- data/lib/write_xlsx/shape.rb +1 -15
- data/lib/write_xlsx/sparkline.rb +1 -1
- data/lib/write_xlsx/utility.rb +69 -13
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +19 -7
- data/lib/write_xlsx/worksheet/cell_data.rb +1 -1
- data/lib/write_xlsx/worksheet/hyperlink.rb +39 -37
- data/lib/write_xlsx/worksheet.rb +44 -72
- data/lib/write_xlsx/zip_file_utils.rb +99 -0
- data/test/chart/test_add_series.rb +5 -5
- data/test/chart/test_write_d_lbls.rb +1 -1
- data/test/chart/test_write_major_gridlines.rb +1 -1
- data/test/chart/test_write_marker.rb +1 -1
- data/test/chart/test_write_number_format.rb +1 -1
- data/test/helper.rb +7 -4
- data/test/regression/klt.csv +4 -0
- data/test/regression/test_chart_column07.rb +44 -0
- data/test/regression/test_chart_column08.rb +46 -0
- data/test/regression/test_chart_date01.rb +57 -0
- data/test/regression/test_chart_date02.rb +59 -0
- data/test/regression/test_chart_date03.rb +59 -0
- data/test/regression/test_chart_date04.rb +61 -0
- data/test/regression/test_chart_stock01.rb +1 -6
- data/test/regression/test_chart_title02.rb +44 -0
- data/test/regression/test_escapes01.rb +1 -1
- data/test/regression/test_escapes02.rb +1 -1
- data/test/regression/test_escapes03.rb +1 -1
- data/test/regression/test_escapes04.rb +1 -1
- data/test/regression/test_escapes05.rb +1 -1
- data/test/regression/test_escapes06.rb +1 -1
- data/test/regression/test_escapes07.rb +1 -1
- data/test/regression/test_escapes08.rb +1 -1
- data/test/regression/test_set_column09.rb +31 -0
- data/test/regression/test_shared_strings_encoding.rb +103 -0
- data/test/regression/xlsx_files/chart_column07.xlsx +0 -0
- data/test/regression/xlsx_files/chart_column08.xlsx +0 -0
- data/test/regression/xlsx_files/chart_date01.xlsx +0 -0
- data/test/regression/xlsx_files/chart_date02.xlsx +0 -0
- data/test/regression/xlsx_files/chart_date03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_date04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_title02.xlsx +0 -0
- data/test/regression/xlsx_files/set_column09.xlsx +0 -0
- data/test/regression/xlsx_files/shared_strings_encoding.xlsx +0 -0
- data/test/worksheet/test_write_hyperlink.rb +10 -15
- data/write_xlsx.gemspec +0 -3
- metadata +48 -39
- data/test/worksheet/test_set_column.rb +0 -25
data/lib/write_xlsx/chart.rb
CHANGED
@@ -35,6 +35,104 @@ module Writexlsx
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
class ChartArea
|
39
|
+
include Writexlsx::Utility
|
40
|
+
|
41
|
+
attr_reader :line, :fill, :layout
|
42
|
+
|
43
|
+
def initialize(params = {})
|
44
|
+
@layout = layout_properties(params[:layout])
|
45
|
+
|
46
|
+
# Allow 'border' as a synonym for 'line'.
|
47
|
+
border = params_to_border(params)
|
48
|
+
|
49
|
+
# Set the line properties for the chartarea.
|
50
|
+
@line = border ? line_properties(border) : line_properties(params[:line])
|
51
|
+
|
52
|
+
# Map deprecated Spreadsheet::WriteExcel fill colour.
|
53
|
+
fill = params[:color] ? { :color => params[:color] } : params[:fill]
|
54
|
+
@fill = fill_properties(fill)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def params_to_border(params)
|
60
|
+
line_weight = params[:line_weight]
|
61
|
+
|
62
|
+
# Map deprecated Spreadsheet::WriteExcel line_weight.
|
63
|
+
border = params[:border]
|
64
|
+
border = { :width => swe_line_weight(line_weight) } if line_weight
|
65
|
+
|
66
|
+
# Map deprecated Spreadsheet::WriteExcel line_pattern.
|
67
|
+
if params[:line_pattern]
|
68
|
+
pattern = swe_line_pattern(params[:line_pattern])
|
69
|
+
if pattern == 'none'
|
70
|
+
border = { :none => 1 }
|
71
|
+
else
|
72
|
+
border[:dash_type] = pattern
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Map deprecated Spreadsheet::WriteExcel line colour.
|
77
|
+
border[:color] = params[:line_color] if params[:line_color]
|
78
|
+
border
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Get the Spreadsheet::WriteExcel line pattern for backward compatibility.
|
83
|
+
#
|
84
|
+
def swe_line_pattern(val)
|
85
|
+
swe_line_pattern_hash[numeric_or_downcase(val)] || 'solid'
|
86
|
+
end
|
87
|
+
|
88
|
+
def swe_line_pattern_hash
|
89
|
+
{
|
90
|
+
0 => 'solid',
|
91
|
+
1 => 'dash',
|
92
|
+
2 => 'dot',
|
93
|
+
3 => 'dash_dot',
|
94
|
+
4 => 'long_dash_dot_dot',
|
95
|
+
5 => 'none',
|
96
|
+
6 => 'solid',
|
97
|
+
7 => 'solid',
|
98
|
+
8 => 'solid',
|
99
|
+
'solid' => 'solid',
|
100
|
+
'dash' => 'dash',
|
101
|
+
'dot' => 'dot',
|
102
|
+
'dash-dot' => 'dash_dot',
|
103
|
+
'dash-dot-dot' => 'long_dash_dot_dot',
|
104
|
+
'none' => 'none',
|
105
|
+
'dark-gray' => 'solid',
|
106
|
+
'medium-gray' => 'solid',
|
107
|
+
'light-gray' => 'solid'
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
#
|
112
|
+
# Get the Spreadsheet::WriteExcel line weight for backward compatibility.
|
113
|
+
#
|
114
|
+
def swe_line_weight(val)
|
115
|
+
swe_line_weight_hash[numeric_or_downcase(val)] || 1
|
116
|
+
end
|
117
|
+
|
118
|
+
def swe_line_weight_hash
|
119
|
+
{
|
120
|
+
1 => 0.25,
|
121
|
+
2 => 1,
|
122
|
+
3 => 2,
|
123
|
+
4 => 3,
|
124
|
+
'hairline' => 0.25,
|
125
|
+
'narrow' => 1,
|
126
|
+
'medium' => 2,
|
127
|
+
'wide' => 3
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
def numeric_or_downcase(val)
|
132
|
+
val.respond_to?(:coerce) ? val : val.downcase
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
38
136
|
class Chart
|
39
137
|
include Writexlsx::Utility
|
40
138
|
|
@@ -81,45 +179,19 @@ module Writexlsx
|
|
81
179
|
|
82
180
|
@subtype = subtype
|
83
181
|
@sheet_type = 0x0200
|
84
|
-
@orientation = 0x0
|
85
182
|
@series = []
|
86
183
|
@embedded = 0
|
87
184
|
@id = ''
|
88
185
|
@series_index = 0
|
89
186
|
@style_id = 2
|
90
|
-
@axis_ids = []
|
91
|
-
@axis2_ids = []
|
92
|
-
@cat_has_num_fmt = false
|
93
|
-
@requires_category = 0
|
94
|
-
@legend_position = 'right'
|
95
|
-
@cat_axis_position = 'b'
|
96
|
-
@val_axis_position = 'l'
|
97
187
|
@formula_ids = {}
|
98
188
|
@formula_data = []
|
99
|
-
@horiz_cat_axis = 0
|
100
|
-
@horiz_val_axis = 1
|
101
189
|
@protection = 0
|
102
|
-
@chartarea =
|
103
|
-
@plotarea =
|
190
|
+
@chartarea = ChartArea.new
|
191
|
+
@plotarea = ChartArea.new
|
104
192
|
@title = Caption.new(self)
|
105
|
-
@x_axis = Axis.new(self)
|
106
|
-
@y_axis = Axis.new(self)
|
107
|
-
@x2_axis = Axis.new(self)
|
108
|
-
@y2_axis = Axis.new(self)
|
109
193
|
@name = ''
|
110
|
-
@show_blanks = 'gap'
|
111
|
-
@show_hidden_data = false
|
112
|
-
@show_crosses = true
|
113
|
-
@width = 480
|
114
|
-
@height = 288
|
115
|
-
@x_scale = 1
|
116
|
-
@y_scale = 1
|
117
|
-
@x_offset = 0
|
118
|
-
@y_offset = 0
|
119
194
|
@table = nil
|
120
|
-
@smooth_allowed = 0
|
121
|
-
@cross_between = 'between'
|
122
|
-
|
123
195
|
set_default_properties
|
124
196
|
end
|
125
197
|
|
@@ -174,6 +246,7 @@ module Writexlsx
|
|
174
246
|
# Set the properties of the x-axis.
|
175
247
|
#
|
176
248
|
def set_x_axis(params = {})
|
249
|
+
@date_category = true if ptrue?(params[:date_axis])
|
177
250
|
@x_axis.merge_with_hash(params)
|
178
251
|
end
|
179
252
|
|
@@ -184,6 +257,7 @@ module Writexlsx
|
|
184
257
|
# The properties that can be set are the same as for set_x_axis,
|
185
258
|
#
|
186
259
|
def set_y_axis(params = {})
|
260
|
+
@date_category = true if ptrue?(params[:date_axis])
|
187
261
|
@y_axis.merge_with_hash(params)
|
188
262
|
end
|
189
263
|
|
@@ -191,6 +265,7 @@ module Writexlsx
|
|
191
265
|
# Set the properties of the secondary X-axis.
|
192
266
|
#
|
193
267
|
def set_x2_axis(params = {})
|
268
|
+
@date_category = true if ptrue?(params[:date_axis])
|
194
269
|
@x2_axis.merge_with_hash(params)
|
195
270
|
end
|
196
271
|
|
@@ -198,6 +273,7 @@ module Writexlsx
|
|
198
273
|
# Set the properties of the secondary Y-axis.
|
199
274
|
#
|
200
275
|
def set_y2_axis(params = {})
|
276
|
+
@date_category = true if ptrue?(params[:date_axis])
|
201
277
|
@y2_axis.merge_with_hash(params)
|
202
278
|
end
|
203
279
|
|
@@ -229,7 +305,7 @@ module Writexlsx
|
|
229
305
|
#
|
230
306
|
def set_plotarea(params)
|
231
307
|
# Convert the user defined properties to internal properties.
|
232
|
-
@plotarea =
|
308
|
+
@plotarea = ChartArea.new(params)
|
233
309
|
end
|
234
310
|
|
235
311
|
#
|
@@ -237,7 +313,7 @@ module Writexlsx
|
|
237
313
|
#
|
238
314
|
def set_chartarea(params)
|
239
315
|
# Convert the user defined properties to internal properties.
|
240
|
-
@chartarea =
|
316
|
+
@chartarea = ChartArea.new(params)
|
241
317
|
end
|
242
318
|
|
243
319
|
#
|
@@ -306,14 +382,8 @@ module Writexlsx
|
|
306
382
|
|
307
383
|
# Set the up and down bar properties.
|
308
384
|
@up_down_bars = {
|
309
|
-
:_up =>
|
310
|
-
|
311
|
-
:_fill => line_properties(params[:up][:fill])
|
312
|
-
},
|
313
|
-
:_down => {
|
314
|
-
:_line => line_properties(params[:down][:line]),
|
315
|
-
:_fill => line_properties(params[:down][:fill])
|
316
|
-
}
|
385
|
+
:_up => Chartline.new(params[:up]),
|
386
|
+
:_down => Chartline.new(params[:down])
|
317
387
|
}
|
318
388
|
end
|
319
389
|
|
@@ -321,20 +391,14 @@ module Writexlsx
|
|
321
391
|
# Set properties for the chart drop lines.
|
322
392
|
#
|
323
393
|
def set_drop_lines(params = {})
|
324
|
-
|
325
|
-
line = line_properties(params[:line])
|
326
|
-
|
327
|
-
@drop_lines = { :_line => line }
|
394
|
+
@drop_lines = Chartline.new(params)
|
328
395
|
end
|
329
396
|
|
330
397
|
#
|
331
398
|
# Set properties for the chart high-low lines.
|
332
399
|
#
|
333
400
|
def set_high_low_lines(params = {})
|
334
|
-
|
335
|
-
line = line_properties(params[:line])
|
336
|
-
|
337
|
-
@hi_low_lines = { :_line => line }
|
401
|
+
@hi_low_lines = Chartline.new(params)
|
338
402
|
end
|
339
403
|
|
340
404
|
#
|
@@ -390,7 +454,21 @@ module Writexlsx
|
|
390
454
|
#
|
391
455
|
def convert_font_args(params)
|
392
456
|
return unless params
|
393
|
-
font =
|
457
|
+
font = params_to_font(params)
|
458
|
+
|
459
|
+
# Convert font size units.
|
460
|
+
font[:_size] *= 100 if font[:_size] && font[:_size] != 0
|
461
|
+
|
462
|
+
# Convert rotation into 60,000ths of a degree.
|
463
|
+
if ptrue?(font[:_rotation])
|
464
|
+
font[:_rotation] = 60_000 * font[:_rotation].to_i
|
465
|
+
end
|
466
|
+
|
467
|
+
font
|
468
|
+
end
|
469
|
+
|
470
|
+
def params_to_font(params)
|
471
|
+
{
|
394
472
|
:_name => params[:name],
|
395
473
|
:_color => params[:color],
|
396
474
|
:_size => params[:size],
|
@@ -402,16 +480,6 @@ module Writexlsx
|
|
402
480
|
:_baseline => params[:baseline] || 0,
|
403
481
|
:_rotation => params[:rotation]
|
404
482
|
}
|
405
|
-
|
406
|
-
# Convert font size units.
|
407
|
-
font[:_size] *= 100 if font[:_size] && font[:_size] != 0
|
408
|
-
|
409
|
-
# Convert rotation into 60,000ths of a degree.
|
410
|
-
if ptrue?(font[:_rotation])
|
411
|
-
font[:_rotation] = 60_000 * font[:_rotation].to_i
|
412
|
-
end
|
413
|
-
|
414
|
-
font
|
415
483
|
end
|
416
484
|
|
417
485
|
#
|
@@ -435,56 +503,61 @@ module Writexlsx
|
|
435
503
|
# If there is no user defined data then it will be populated by the parent
|
436
504
|
# workbook in Workbook::_add_chart_data
|
437
505
|
#
|
438
|
-
def
|
439
|
-
|
440
|
-
return unless formula
|
506
|
+
def data_id(full_formula, data) # :nodoc:
|
507
|
+
return unless full_formula
|
441
508
|
|
442
509
|
# Strip the leading '=' from the formula.
|
443
|
-
formula =
|
510
|
+
formula = full_formula.sub(/^=/, '')
|
444
511
|
|
445
512
|
# Store the data id in a hash keyed by the formula and store the data
|
446
513
|
# in a separate array with the same id.
|
447
|
-
if
|
448
|
-
# Haven't seen this formula before.
|
449
|
-
id = @formula_data.size
|
450
|
-
|
451
|
-
@formula_data << data
|
452
|
-
@formula_ids[formula] = id
|
453
|
-
else
|
514
|
+
if @formula_ids.has_key?(formula)
|
454
515
|
# Formula already seen. Return existing id.
|
455
516
|
id = @formula_ids[formula]
|
456
|
-
|
457
517
|
# Store user defined data if it isn't already there.
|
458
|
-
@formula_data[id]
|
518
|
+
@formula_data[id] ||= data
|
519
|
+
else
|
520
|
+
# Haven't seen this formula before.
|
521
|
+
id = @formula_ids[formula] = @formula_data.size
|
522
|
+
@formula_data << data
|
459
523
|
end
|
460
524
|
|
461
525
|
id
|
462
526
|
end
|
463
527
|
|
464
|
-
|
465
|
-
# Convert user defined layout properties to the format required internally.
|
466
|
-
#
|
467
|
-
def layout_properties(args, is_text = false)
|
468
|
-
return unless ptrue?(args)
|
469
|
-
|
470
|
-
properties = is_text ? [:x, :y] : [:x, :y, :width, :height]
|
471
|
-
|
472
|
-
# Check for valid properties.
|
473
|
-
allowable = Hash.new
|
474
|
-
allowable[properties.size] = nil
|
475
|
-
|
476
|
-
# Set the layout properties
|
477
|
-
layout = Hash.new
|
478
|
-
properties.each do |property|
|
479
|
-
value = args[property]
|
480
|
-
# Convert to the format used by Excel for easier testing.
|
481
|
-
layout[property] = sprintf("%.17g", value)
|
482
|
-
end
|
528
|
+
private
|
483
529
|
|
484
|
-
|
530
|
+
def axis_setup
|
531
|
+
@axis_ids = []
|
532
|
+
@axis2_ids = []
|
533
|
+
@cat_has_num_fmt = false
|
534
|
+
@requires_category = 0
|
535
|
+
@cat_axis_position = 'b'
|
536
|
+
@val_axis_position = 'l'
|
537
|
+
@horiz_cat_axis = 0
|
538
|
+
@horiz_val_axis = 1
|
539
|
+
@x_axis = Axis.new(self)
|
540
|
+
@y_axis = Axis.new(self)
|
541
|
+
@x2_axis = Axis.new(self)
|
542
|
+
@y2_axis = Axis.new(self)
|
485
543
|
end
|
486
544
|
|
487
|
-
|
545
|
+
def display_setup
|
546
|
+
@orientation = 0x0
|
547
|
+
@width = 480
|
548
|
+
@height = 288
|
549
|
+
@x_scale = 1
|
550
|
+
@y_scale = 1
|
551
|
+
@x_offset = 0
|
552
|
+
@y_offset = 0
|
553
|
+
@legend_position = 'right'
|
554
|
+
@smooth_allowed = 0
|
555
|
+
@cross_between = 'between'
|
556
|
+
@date_category = false
|
557
|
+
@show_blanks = 'gap'
|
558
|
+
@show_hidden_data = false
|
559
|
+
@show_crosses = true
|
560
|
+
end
|
488
561
|
|
489
562
|
#
|
490
563
|
# retun primary/secondary series by :primary_axes flag
|
@@ -520,151 +593,15 @@ module Writexlsx
|
|
520
593
|
#
|
521
594
|
# Convert the user specified colour index or string to a rgb colour.
|
522
595
|
#
|
523
|
-
def
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
# Set undefined colors to black.
|
533
|
-
unless index
|
534
|
-
index = 0x08
|
535
|
-
raise "Unknown color '#{color}' used in chart formatting."
|
536
|
-
end
|
537
|
-
|
538
|
-
get_palette_color(index)
|
539
|
-
end
|
540
|
-
|
541
|
-
#
|
542
|
-
# Convert from an Excel internal colour index to a XML style #RRGGBB index
|
543
|
-
# based on the default or user defined values in the Workbook palette.
|
544
|
-
# Note: This version doesn't add an alpha channel.
|
545
|
-
#
|
546
|
-
def get_palette_color(index) # :nodoc:
|
547
|
-
palette = @palette
|
548
|
-
|
549
|
-
# Adjust the colour index.
|
550
|
-
index -= 8
|
551
|
-
|
552
|
-
# Palette is passed in from the Workbook class.
|
553
|
-
rgb = palette[index]
|
554
|
-
|
555
|
-
sprintf("%02X%02X%02X", *rgb)
|
556
|
-
end
|
557
|
-
|
558
|
-
#
|
559
|
-
# Get the Spreadsheet::WriteExcel line pattern for backward compatibility.
|
560
|
-
#
|
561
|
-
def get_swe_line_pattern(val)
|
562
|
-
value = val.downcase
|
563
|
-
default = 'solid'
|
564
|
-
|
565
|
-
patterns = {
|
566
|
-
0 => 'solid',
|
567
|
-
1 => 'dash',
|
568
|
-
2 => 'dot',
|
569
|
-
3 => 'dash_dot',
|
570
|
-
4 => 'long_dash_dot_dot',
|
571
|
-
5 => 'none',
|
572
|
-
6 => 'solid',
|
573
|
-
7 => 'solid',
|
574
|
-
8 => 'solid',
|
575
|
-
'solid' => 'solid',
|
576
|
-
'dash' => 'dash',
|
577
|
-
'dot' => 'dot',
|
578
|
-
'dash-dot' => 'dash_dot',
|
579
|
-
'dash-dot-dot' => 'long_dash_dot_dot',
|
580
|
-
'none' => 'none',
|
581
|
-
'dark-gray' => 'solid',
|
582
|
-
'medium-gray' => 'solid',
|
583
|
-
'light-gray' => 'solid'
|
584
|
-
}
|
585
|
-
|
586
|
-
patterns[value] || default
|
587
|
-
end
|
588
|
-
|
589
|
-
#
|
590
|
-
# Get the Spreadsheet::WriteExcel line weight for backward compatibility.
|
591
|
-
#
|
592
|
-
def get_swe_line_weight(val)
|
593
|
-
value = val.downcase
|
594
|
-
default = 1
|
595
|
-
|
596
|
-
weights = {
|
597
|
-
1 => 0.25,
|
598
|
-
2 => 1,
|
599
|
-
3 => 2,
|
600
|
-
4 => 3,
|
601
|
-
'hairline' => 0.25,
|
602
|
-
'narrow' => 1,
|
603
|
-
'medium' => 2,
|
604
|
-
'wide' => 3
|
605
|
-
}
|
606
|
-
|
607
|
-
weights[value] || default
|
608
|
-
end
|
609
|
-
|
610
|
-
#
|
611
|
-
# Convert user defined fill properties to the structure required internally.
|
612
|
-
#
|
613
|
-
def fill_properties(fill) # :nodoc:
|
614
|
-
return { :_defined => 0 } unless fill
|
615
|
-
|
616
|
-
fill[:_defined] = 1
|
617
|
-
|
618
|
-
fill
|
619
|
-
end
|
620
|
-
|
621
|
-
#
|
622
|
-
# Convert user defined area properties to the structure required internally.
|
623
|
-
#
|
624
|
-
def area_properties(arg) # :nodoc:
|
625
|
-
area = {}
|
626
|
-
|
627
|
-
# Map deprecated Spreadsheet::WriteExcel fill colour.
|
628
|
-
arg[:fill] = { :color => arg[:color] } if arg[:color]
|
629
|
-
|
630
|
-
# Map deprecated Spreadsheet::WriteExcel line_weight.
|
631
|
-
if arg[:line_weight]
|
632
|
-
width = get_swe_line_weight(arg[:line_weight])
|
633
|
-
arg[:border] = { :width => width }
|
634
|
-
end
|
635
|
-
|
636
|
-
# Map deprecated Spreadsheet::WriteExcel line_pattern.
|
637
|
-
if arg[:line_pattern]
|
638
|
-
pattern = get_swe_line_pattern(arg[:line_pattern])
|
639
|
-
if pattern == 'none'
|
640
|
-
arg[:border] = { :none => 1 }
|
641
|
-
else
|
642
|
-
arg[:border][:dash_type] = pattern
|
643
|
-
end
|
596
|
+
def color(color_code) # :nodoc:
|
597
|
+
if color_code and color_code =~ /^#[0-9a-fA-F]{6}$/
|
598
|
+
# Convert a HTML style #RRGGBB color.
|
599
|
+
color_code.sub(/^#/, '').upcase
|
600
|
+
else
|
601
|
+
index = Format.color(color_code)
|
602
|
+
raise "Unknown color '#{color_code}' used in chart formatting." unless index
|
603
|
+
palette_color(index)
|
644
604
|
end
|
645
|
-
|
646
|
-
# Map deprecated Spreadsheet::WriteExcel line colour.
|
647
|
-
arg[:border][:color] = arg[:line_color] if arg[:line_color]
|
648
|
-
|
649
|
-
# Handle Excel::Writer::XLSX style properties.
|
650
|
-
|
651
|
-
# Set the line properties for the chartarea.
|
652
|
-
line = line_properties(arg[:line])
|
653
|
-
|
654
|
-
# Allow 'border' as a synonym for 'line'.
|
655
|
-
line = line_properties(arg[:border]) if (arg[:border])
|
656
|
-
|
657
|
-
# Set the fill properties for the chartarea.
|
658
|
-
fill = fill_properties(arg[:fill])
|
659
|
-
|
660
|
-
# Set the plotarea layout.
|
661
|
-
layout = layout_properties(arg[:layout])
|
662
|
-
|
663
|
-
area[:_line] = line
|
664
|
-
area[:_fill] = fill
|
665
|
-
area[:_layout] = layout
|
666
|
-
|
667
|
-
return area
|
668
605
|
end
|
669
606
|
|
670
607
|
#
|
@@ -740,38 +677,55 @@ module Writexlsx
|
|
740
677
|
# Setup the default properties for a chart.
|
741
678
|
#
|
742
679
|
def set_default_properties # :nodoc:
|
743
|
-
|
744
|
-
|
680
|
+
display_setup
|
681
|
+
axis_setup
|
682
|
+
set_axis_defaults
|
683
|
+
|
684
|
+
set_x_axis
|
685
|
+
set_y_axis
|
686
|
+
|
687
|
+
set_x2_axis
|
688
|
+
set_y2_axis
|
689
|
+
end
|
690
|
+
|
691
|
+
def set_axis_defaults
|
692
|
+
@x_axis.defaults = x_axis_defaults
|
693
|
+
@y_axis.defaults = y_axis_defaults
|
694
|
+
@x2_axis.defaults = x2_axis_defaults
|
695
|
+
@y2_axis.defaults = y2_axis_defaults
|
696
|
+
end
|
697
|
+
|
698
|
+
def x_axis_defaults
|
699
|
+
{
|
745
700
|
:num_format => 'General',
|
746
701
|
:major_gridlines => { :visible => 0 }
|
747
702
|
}
|
703
|
+
end
|
748
704
|
|
749
|
-
|
705
|
+
def y_axis_defaults
|
706
|
+
{
|
750
707
|
:num_format => 'General',
|
751
708
|
:major_gridlines => { :visible => 1 }
|
752
709
|
}
|
710
|
+
end
|
753
711
|
|
754
|
-
|
712
|
+
def x2_axis_defaults
|
713
|
+
{
|
755
714
|
:num_format => 'General',
|
756
715
|
:label_position => 'none',
|
757
716
|
:crossing => 'max',
|
758
717
|
:visible => 0
|
759
718
|
}
|
719
|
+
end
|
760
720
|
|
761
|
-
|
721
|
+
def y2_axis_defaults
|
722
|
+
{
|
762
723
|
:num_format => 'General',
|
763
724
|
:major_gridlines => { :visible => 0 },
|
764
725
|
:position => 'right',
|
765
726
|
:visible => 1
|
766
727
|
}
|
767
|
-
|
768
|
-
set_x_axis
|
769
|
-
set_y_axis
|
770
|
-
|
771
|
-
set_x2_axis
|
772
|
-
set_y2_axis
|
773
728
|
end
|
774
|
-
|
775
729
|
#
|
776
730
|
# Write the <c:chartSpace> element.
|
777
731
|
#
|
@@ -846,36 +800,43 @@ module Writexlsx
|
|
846
800
|
#
|
847
801
|
# Write the <c:plotArea> element.
|
848
802
|
#
|
849
|
-
|
850
803
|
def write_plot_area # :nodoc:
|
851
|
-
write_plot_area_base
|
852
|
-
end
|
853
|
-
|
854
|
-
def write_plot_area_base(type = nil) # :nodoc:
|
855
804
|
@writer.tag_elements('c:plotArea') do
|
856
805
|
# Write the c:layout element.
|
857
|
-
write_layout(@plotarea
|
806
|
+
write_layout(@plotarea.layout, 'plot')
|
858
807
|
# Write the subclass chart type elements for primary and secondary axes.
|
859
808
|
write_chart_type(:primary_axes => 1)
|
860
809
|
write_chart_type(:primary_axes => 0)
|
861
810
|
|
862
|
-
# Write the
|
811
|
+
# Write the category and value elements for the primary axes.
|
863
812
|
params = {
|
864
813
|
:x_axis => @x_axis,
|
865
814
|
:y_axis => @y_axis,
|
866
815
|
:axis_ids => @axis_ids
|
867
816
|
}
|
868
|
-
|
817
|
+
|
818
|
+
if @date_category
|
819
|
+
write_date_axis(params)
|
820
|
+
else
|
821
|
+
write_cat_axis(params)
|
822
|
+
end
|
823
|
+
|
869
824
|
write_val_axis(params)
|
870
825
|
|
871
|
-
# Write
|
826
|
+
# Write the category and value elements for the secondary axes.
|
872
827
|
params = {
|
873
828
|
:x_axis => @x2_axis,
|
874
829
|
:y_axis => @y2_axis,
|
875
830
|
:axis_ids => @axis2_ids
|
876
831
|
}
|
832
|
+
|
877
833
|
write_val_axis(params)
|
878
|
-
|
834
|
+
|
835
|
+
if @date_category
|
836
|
+
write_date_axis(params)
|
837
|
+
else
|
838
|
+
write_cat_axis(params)
|
839
|
+
end
|
879
840
|
|
880
841
|
# Write the c:dTable element.
|
881
842
|
write_d_table
|
@@ -885,14 +846,6 @@ module Writexlsx
|
|
885
846
|
end
|
886
847
|
end
|
887
848
|
|
888
|
-
def write_cat_or_date_axis(params, type)
|
889
|
-
if type == :stock
|
890
|
-
write_date_axis(params)
|
891
|
-
else
|
892
|
-
write_cat_axis(params)
|
893
|
-
end
|
894
|
-
end
|
895
|
-
|
896
849
|
#
|
897
850
|
# Write the <c:layout> element.
|
898
851
|
#
|
@@ -968,7 +921,7 @@ module Writexlsx
|
|
968
921
|
# Write the c:marker element.
|
969
922
|
write_marker(series.marker)
|
970
923
|
# Write the c:invertIfNegative element.
|
971
|
-
write_c_invert_if_negative(series.
|
924
|
+
write_c_invert_if_negative(series.invert_if_negative)
|
972
925
|
# Write the c:dPt element.
|
973
926
|
write_d_pt(series.points)
|
974
927
|
# Write the c:dLbls element.
|
@@ -1203,29 +1156,20 @@ module Writexlsx
|
|
1203
1156
|
#
|
1204
1157
|
# Write the <c:valAx> element. Usually the Y axis.
|
1205
1158
|
#
|
1206
|
-
|
1207
|
-
#
|
1208
|
-
def write_val_axis(params, cat = false) # :nodoc:
|
1159
|
+
def write_val_axis(params)
|
1209
1160
|
axis_ids = params[:axis_ids]
|
1210
|
-
position = params[:position] || @val_axis_position
|
1211
|
-
horiz = @horiz_val_axis
|
1212
|
-
if cat
|
1213
|
-
x_axis = params[:y_axis]
|
1214
|
-
y_axis = params[:x_axis]
|
1215
|
-
axis_ids_0 = axis_ids[1]
|
1216
|
-
axis_ids_1 = axis_ids[0]
|
1217
|
-
else
|
1218
|
-
x_axis = params[:x_axis]
|
1219
|
-
y_axis = params[:y_axis]
|
1220
|
-
axis_ids_0 = axis_ids[0]
|
1221
|
-
axis_ids_1 = axis_ids[1]
|
1222
|
-
end
|
1223
|
-
|
1224
1161
|
return unless axis_ids && !axis_ids.empty?
|
1225
1162
|
|
1226
|
-
|
1227
|
-
|
1163
|
+
x_axis = params[:x_axis]
|
1164
|
+
y_axis = params[:y_axis]
|
1165
|
+
axis_ids_0 = axis_ids[0]
|
1166
|
+
axis_ids_1 = axis_ids[1]
|
1167
|
+
position = y_axis.position || params[:position] || @val_axis_position
|
1228
1168
|
|
1169
|
+
write_val_axis_base(x_axis, y_axis, axis_ids_0, axis_ids_1, position)
|
1170
|
+
end
|
1171
|
+
|
1172
|
+
def write_val_axis_base(x_axis, y_axis, axis_ids_0, axis_ids_1, position) # :nodoc:
|
1229
1173
|
@writer.tag_elements('c:valAx') do
|
1230
1174
|
write_axis_id(axis_ids_1)
|
1231
1175
|
|
@@ -1245,9 +1189,9 @@ module Writexlsx
|
|
1245
1189
|
|
1246
1190
|
# Write the axis title elements.
|
1247
1191
|
if y_axis.formula
|
1248
|
-
write_title_formula(y_axis,
|
1192
|
+
write_title_formula(y_axis, @horiz_val_axis, nil, y_axis.layout)
|
1249
1193
|
elsif y_axis.name
|
1250
|
-
write_title_rich(y_axis,
|
1194
|
+
write_title_rich(y_axis, @horiz_val_axis, y_axis.layout)
|
1251
1195
|
end
|
1252
1196
|
|
1253
1197
|
# Write the c:numberFormat element.
|
@@ -1278,16 +1222,6 @@ module Writexlsx
|
|
1278
1222
|
end
|
1279
1223
|
end
|
1280
1224
|
|
1281
|
-
#
|
1282
|
-
# Write the <c:valAx> element.
|
1283
|
-
# This is for the second valAx in scatter plots.
|
1284
|
-
#
|
1285
|
-
# Usually the X axis.
|
1286
|
-
#
|
1287
|
-
def write_cat_val_axis(params) # :nodoc:
|
1288
|
-
write_val_axis(params, true)
|
1289
|
-
end
|
1290
|
-
|
1291
1225
|
#
|
1292
1226
|
# Write the <c:dateAx> element. Usually the X axis.
|
1293
1227
|
#
|
@@ -1350,15 +1284,11 @@ module Writexlsx
|
|
1350
1284
|
# Write the c:majorUnit element.
|
1351
1285
|
write_c_major_unit(x_axis.major_unit)
|
1352
1286
|
# Write the c:majorTimeUnit element.
|
1353
|
-
if
|
1354
|
-
write_c_major_time_unit(x_axis.major_unit_type)
|
1355
|
-
end
|
1287
|
+
write_c_major_time_unit(x_axis.major_unit_type) if x_axis.major_unit
|
1356
1288
|
# Write the c:minorUnit element.
|
1357
1289
|
write_c_minor_unit(x_axis.minor_unit)
|
1358
1290
|
# Write the c:minorTimeUnit element.
|
1359
|
-
if
|
1360
|
-
write_c_minor_time_unit(x_axis.minor_unit_type)
|
1361
|
-
end
|
1291
|
+
write_c_minor_time_unit(x_axis.minor_unit_type) if x_axis.minor_unit
|
1362
1292
|
end
|
1363
1293
|
end
|
1364
1294
|
|
@@ -1419,18 +1349,14 @@ module Writexlsx
|
|
1419
1349
|
# Write the <c:max> element.
|
1420
1350
|
#
|
1421
1351
|
def write_c_max(max = nil) # :nodoc:
|
1422
|
-
|
1423
|
-
|
1424
|
-
@writer.empty_tag('c:max', [ ['val', max] ])
|
1352
|
+
@writer.empty_tag('c:max', [ ['val', max] ]) if max
|
1425
1353
|
end
|
1426
1354
|
|
1427
1355
|
#
|
1428
1356
|
# Write the <c:min> element.
|
1429
1357
|
#
|
1430
1358
|
def write_c_min(min = nil) # :nodoc:
|
1431
|
-
|
1432
|
-
|
1433
|
-
@writer.empty_tag('c:min', [ ['val', min] ])
|
1359
|
+
@writer.empty_tag('c:min', [ ['val', min] ]) if min
|
1434
1360
|
end
|
1435
1361
|
|
1436
1362
|
#
|
@@ -1550,8 +1476,14 @@ module Writexlsx
|
|
1550
1476
|
end
|
1551
1477
|
|
1552
1478
|
def write_gridlines_base(tag, gridlines) # :nodoc:
|
1479
|
+
return unless gridlines
|
1553
1480
|
return if gridlines.respond_to?(:[]) and !ptrue?(gridlines[:_visible])
|
1554
|
-
|
1481
|
+
|
1482
|
+
if gridlines.line_defined?
|
1483
|
+
@writer.tag_elements(tag) { write_sp_pr(gridlines) }
|
1484
|
+
else
|
1485
|
+
@writer.empty_tag(tag)
|
1486
|
+
end
|
1555
1487
|
end
|
1556
1488
|
|
1557
1489
|
#
|
@@ -1603,49 +1535,34 @@ module Writexlsx
|
|
1603
1535
|
# Write the <c:legend> element.
|
1604
1536
|
#
|
1605
1537
|
def write_legend # :nodoc:
|
1606
|
-
position = @legend_position
|
1607
|
-
|
1608
|
-
|
1609
|
-
if @legend_delete_series && @legend_delete_series.kind_of?(Array)
|
1610
|
-
@delete_series = @legend_delete_series
|
1611
|
-
end
|
1612
|
-
|
1613
|
-
if position =~ /^overlay_/
|
1614
|
-
position.sub!(/^overlay_/, '')
|
1615
|
-
overlay = true if position
|
1616
|
-
end
|
1617
|
-
|
1618
|
-
allowed = {
|
1619
|
-
'right' => 'r',
|
1620
|
-
'left' => 'l',
|
1621
|
-
'top' => 't',
|
1622
|
-
'bottom' => 'b'
|
1623
|
-
}
|
1624
|
-
|
1625
|
-
return if position == 'none'
|
1626
|
-
return unless allowed.has_key?(position)
|
1627
|
-
|
1628
|
-
position = allowed[position]
|
1538
|
+
position = @legend_position.sub(/^overlay_/, '')
|
1539
|
+
return if position == 'none' || (not position_allowed.has_key?(position))
|
1629
1540
|
|
1541
|
+
@delete_series = @legend_delete_series if @legend_delete_series.kind_of?(Array)
|
1630
1542
|
@writer.tag_elements('c:legend') do
|
1631
1543
|
# Write the c:legendPos element.
|
1632
|
-
write_legend_pos(position)
|
1544
|
+
write_legend_pos(position_allowed[position])
|
1633
1545
|
# Remove series labels from the legend.
|
1634
|
-
|
1635
|
-
|
1636
|
-
write_legend_entry(index)
|
1637
|
-
end if @delete_series
|
1546
|
+
# Write the c:legendEntry element.
|
1547
|
+
@delete_series.each { |i| write_legend_entry(i) } if @delete_series
|
1638
1548
|
# Write the c:layout element.
|
1639
1549
|
write_layout(@legend_layout, 'legend')
|
1640
1550
|
# Write the c:txPr element.
|
1641
|
-
if ptrue?(@legend_font)
|
1642
|
-
write_tx_pr(nil, @legend_font)
|
1643
|
-
end
|
1551
|
+
write_tx_pr(nil, @legend_font) if ptrue?(@legend_font)
|
1644
1552
|
# Write the c:overlay element.
|
1645
|
-
write_overlay if
|
1553
|
+
write_overlay if @legend_position =~ /^overlay_/
|
1646
1554
|
end
|
1647
1555
|
end
|
1648
1556
|
|
1557
|
+
def position_allowed
|
1558
|
+
{
|
1559
|
+
'right' => 'r',
|
1560
|
+
'left' => 'l',
|
1561
|
+
'top' => 't',
|
1562
|
+
'bottom' => 'b'
|
1563
|
+
}
|
1564
|
+
end
|
1565
|
+
|
1649
1566
|
#
|
1650
1567
|
# Write the <c:legendPos> element.
|
1651
1568
|
#
|
@@ -1962,13 +1879,13 @@ module Writexlsx
|
|
1962
1879
|
marker ||= @default_marker
|
1963
1880
|
|
1964
1881
|
return unless ptrue?(marker)
|
1965
|
-
return if ptrue?(marker
|
1882
|
+
return if ptrue?(marker.automatic?)
|
1966
1883
|
|
1967
1884
|
@writer.tag_elements('c:marker') do
|
1968
1885
|
# Write the c:symbol element.
|
1969
|
-
write_symbol(marker
|
1886
|
+
write_symbol(marker.type)
|
1970
1887
|
# Write the c:size element.
|
1971
|
-
size = marker
|
1888
|
+
size = marker.size
|
1972
1889
|
write_marker_size(size) if ptrue?(size)
|
1973
1890
|
# Write the c:spPr element.
|
1974
1891
|
write_sp_pr(marker)
|
@@ -2002,8 +1919,8 @@ module Writexlsx
|
|
2002
1919
|
# Write the <c:spPr> element.
|
2003
1920
|
#
|
2004
1921
|
def write_sp_pr(series) # :nodoc:
|
2005
|
-
line = series.
|
2006
|
-
fill = series.
|
1922
|
+
line = series.line
|
1923
|
+
fill = series.fill
|
2007
1924
|
|
2008
1925
|
return if (!line || !ptrue?(line[:_defined])) &&
|
2009
1926
|
(!fill || !ptrue?(fill[:_defined]))
|
@@ -2031,7 +1948,8 @@ module Writexlsx
|
|
2031
1948
|
attributes = []
|
2032
1949
|
|
2033
1950
|
# Add the line width as an attribute.
|
2034
|
-
if
|
1951
|
+
if line[:width]
|
1952
|
+
width = line[:width]
|
2035
1953
|
# Round width to nearest 0.25, like Excel.
|
2036
1954
|
width = ((width + 0.125) * 4).to_i / 4.0
|
2037
1955
|
|
@@ -2051,9 +1969,9 @@ module Writexlsx
|
|
2051
1969
|
write_a_solid_fill(line)
|
2052
1970
|
end
|
2053
1971
|
# Write the line/dash type.
|
2054
|
-
if
|
1972
|
+
if line[:dash_type]
|
2055
1973
|
# Write the a:prstDash element.
|
2056
|
-
write_a_prst_dash(
|
1974
|
+
write_a_prst_dash(line[:dash_type])
|
2057
1975
|
end
|
2058
1976
|
end
|
2059
1977
|
end
|
@@ -2070,12 +1988,8 @@ module Writexlsx
|
|
2070
1988
|
#
|
2071
1989
|
def write_a_solid_fill(line) # :nodoc:
|
2072
1990
|
@writer.tag_elements('a:solidFill') do
|
2073
|
-
|
2074
|
-
|
2075
|
-
|
2076
|
-
# Write the a:srgbClr element.
|
2077
|
-
write_a_srgb_clr(color)
|
2078
|
-
end
|
1991
|
+
# Write the a:srgbClr element.
|
1992
|
+
write_a_srgb_clr(color(line[:color])) if line[:color]
|
2079
1993
|
end
|
2080
1994
|
end
|
2081
1995
|
|
@@ -2101,19 +2015,19 @@ module Writexlsx
|
|
2101
2015
|
|
2102
2016
|
@writer.tag_elements('c:trendline') do
|
2103
2017
|
# Write the c:name element.
|
2104
|
-
write_name(trendline
|
2018
|
+
write_name(trendline.name)
|
2105
2019
|
# Write the c:spPr element.
|
2106
2020
|
write_sp_pr(trendline)
|
2107
2021
|
# Write the c:trendlineType element.
|
2108
|
-
write_trendline_type(trendline
|
2022
|
+
write_trendline_type(trendline.type)
|
2109
2023
|
# Write the c:order element for polynomial trendlines.
|
2110
|
-
write_trendline_order(trendline
|
2024
|
+
write_trendline_order(trendline.order) if trendline.type == 'poly'
|
2111
2025
|
# Write the c:period element for moving average trendlines.
|
2112
|
-
write_period(trendline
|
2026
|
+
write_period(trendline.period) if trendline.type == 'movingAvg'
|
2113
2027
|
# Write the c:forward element.
|
2114
|
-
write_forward(trendline
|
2028
|
+
write_forward(trendline.forward)
|
2115
2029
|
# Write the c:backward element.
|
2116
|
-
write_backward(trendline
|
2030
|
+
write_backward(trendline.backward)
|
2117
2031
|
end
|
2118
2032
|
end
|
2119
2033
|
|
@@ -2169,23 +2083,20 @@ module Writexlsx
|
|
2169
2083
|
# Write the <c:hiLowLines> element.
|
2170
2084
|
#
|
2171
2085
|
def write_hi_low_lines # :nodoc:
|
2172
|
-
write_lines_base('c:hiLowLines'
|
2086
|
+
write_lines_base(@hi_low_lines, 'c:hiLowLines')
|
2173
2087
|
end
|
2174
2088
|
|
2175
2089
|
#
|
2176
2090
|
# Write the <c:dropLines> elent.
|
2177
2091
|
#
|
2178
2092
|
def write_drop_lines
|
2179
|
-
write_lines_base('c:dropLines'
|
2093
|
+
write_lines_base(@drop_lines, 'c:dropLines')
|
2180
2094
|
end
|
2181
2095
|
|
2182
|
-
|
2183
|
-
# used from write_drop_lines and write_hi_low_lines
|
2184
|
-
#
|
2185
|
-
def write_lines_base(tag, lines)
|
2096
|
+
def write_lines_base(lines, tag)
|
2186
2097
|
return unless lines
|
2187
2098
|
|
2188
|
-
if lines
|
2099
|
+
if lines.line_defined?
|
2189
2100
|
@writer.tag_elements(tag) { write_sp_pr(lines) }
|
2190
2101
|
else
|
2191
2102
|
@writer.empty_tag(tag)
|
@@ -2446,17 +2357,17 @@ module Writexlsx
|
|
2446
2357
|
write_err_dir(direction)
|
2447
2358
|
|
2448
2359
|
# Write the c:errBarType element.
|
2449
|
-
write_err_bar_type(error_bars
|
2360
|
+
write_err_bar_type(error_bars.direction)
|
2450
2361
|
|
2451
2362
|
# Write the c:errValType element.
|
2452
|
-
write_err_val_type(error_bars
|
2363
|
+
write_err_val_type(error_bars.type)
|
2453
2364
|
|
2454
|
-
unless ptrue?(error_bars
|
2365
|
+
unless ptrue?(error_bars.endcap)
|
2455
2366
|
# Write the c:noEndCap element.
|
2456
2367
|
write_no_end_cap
|
2457
2368
|
end
|
2458
2369
|
|
2459
|
-
case error_bars
|
2370
|
+
case error_bars.type
|
2460
2371
|
when 'stdErr'
|
2461
2372
|
# Don't need to write a c:errValType tag.
|
2462
2373
|
when 'cust'
|
@@ -2464,7 +2375,7 @@ module Writexlsx
|
|
2464
2375
|
write_custom_error(error_bars)
|
2465
2376
|
else
|
2466
2377
|
# Write the c:val element.
|
2467
|
-
write_error_val(error_bars
|
2378
|
+
write_error_val(error_bars.value)
|
2468
2379
|
end
|
2469
2380
|
|
2470
2381
|
# Write the c:spPr element.
|
@@ -2511,23 +2422,23 @@ module Writexlsx
|
|
2511
2422
|
# Write the custom error bars type.
|
2512
2423
|
#
|
2513
2424
|
def write_custom_error(error_bars)
|
2514
|
-
if ptrue?(error_bars
|
2515
|
-
|
2516
|
-
|
2517
|
-
|
2518
|
-
|
2519
|
-
|
2520
|
-
|
2521
|
-
|
2522
|
-
|
2523
|
-
|
2524
|
-
|
2525
|
-
|
2526
|
-
|
2527
|
-
|
2528
|
-
|
2529
|
-
|
2530
|
-
|
2425
|
+
if ptrue?(error_bars.plus_values)
|
2426
|
+
write_custom_error_base('c:plus', error_bars.plus_values, error_bars.plus_data)
|
2427
|
+
write_custom_error_base('c:minus', error_bars.minus_values, error_bars.minus_data)
|
2428
|
+
end
|
2429
|
+
end
|
2430
|
+
|
2431
|
+
def write_custom_error_base(tag, values, data)
|
2432
|
+
@writer.tag_elements(tag) do
|
2433
|
+
write_num_ref_or_lit(values, data)
|
2434
|
+
end
|
2435
|
+
end
|
2436
|
+
|
2437
|
+
def write_num_ref_or_lit(values, data)
|
2438
|
+
if values =~ /^=/ # '=Sheet1!$A$1:$A$5'
|
2439
|
+
write_num_ref(values, data, 'num')
|
2440
|
+
else # [1, 2, 3]
|
2441
|
+
write_num_lit(values)
|
2531
2442
|
end
|
2532
2443
|
end
|
2533
2444
|
|
@@ -2584,7 +2495,7 @@ module Writexlsx
|
|
2584
2495
|
end
|
2585
2496
|
|
2586
2497
|
def write_bars_base(tag, format)
|
2587
|
-
if
|
2498
|
+
if format.line_defined? || format.fill_defined?
|
2588
2499
|
@writer.tag_elements(tag) { write_sp_pr(format) }
|
2589
2500
|
else
|
2590
2501
|
@writer.empty_tag(tag)
|