write_xlsx 1.04.0 → 1.07.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/Changes +19 -0
- data/README.md +1 -1
- data/examples/chart_data_labels.rb +320 -0
- data/lib/write_xlsx/chart.rb +152 -28
- data/lib/write_xlsx/chart/series.rb +100 -0
- data/lib/write_xlsx/utility.rb +4 -2
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/worksheet.rb +12 -6
- data/test/perl_output/chart_data_labels.xlsx +0 -0
- data/test/regression/test_array_formula04.rb +31 -0
- data/test/regression/test_chart_data_labels26.rb +44 -0
- data/test/regression/test_chart_data_labels27.rb +44 -0
- data/test/regression/test_chart_data_labels28.rb +52 -0
- data/test/regression/test_chart_data_labels29.rb +43 -0
- data/test/regression/test_chart_data_labels30.rb +46 -0
- data/test/regression/test_chart_data_labels31.rb +49 -0
- data/test/regression/test_chart_data_labels32.rb +54 -0
- data/test/regression/test_chart_data_labels33.rb +52 -0
- data/test/regression/test_chart_data_labels34.rb +54 -0
- data/test/regression/test_chart_data_labels35.rb +46 -0
- data/test/regression/test_chart_data_labels36.rb +54 -0
- data/test/regression/test_chart_data_labels37.rb +51 -0
- data/test/regression/test_chart_data_labels38.rb +54 -0
- data/test/regression/test_chart_data_labels39.rb +53 -0
- data/test/regression/test_chart_data_labels40.rb +53 -0
- data/test/regression/test_chart_data_labels41.rb +54 -0
- data/test/regression/test_chart_data_labels42.rb +58 -0
- data/test/regression/test_chart_data_labels43.rb +58 -0
- data/test/regression/test_chart_data_labels44.rb +56 -0
- data/test/regression/test_chart_data_labels45.rb +57 -0
- data/test/regression/test_chart_data_labels46.rb +61 -0
- data/test/regression/test_chart_data_labels47.rb +61 -0
- data/test/regression/xlsx_files/array_formula04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels26.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels27.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels28.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels29.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels30.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels31.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels32.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels33.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels34.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels35.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels36.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels37.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels38.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels39.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels40.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels41.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels42.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels43.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels44.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels45.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels46.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels47.xlsx +0 -0
- data/test/test_example_match.rb +314 -1
- metadata +97 -2
@@ -296,10 +296,110 @@ def labels_properties(labels) # :nodoc:
|
|
296
296
|
labels[:separator] = separators[separator]
|
297
297
|
end
|
298
298
|
|
299
|
+
|
300
|
+
# Set the line properties for the data labels.
|
301
|
+
line = line_properties( labels[:line] )
|
302
|
+
|
303
|
+
# Allow 'border' as a synonym for 'line'.
|
304
|
+
if labels[:border]
|
305
|
+
line = line_properties(labels[:border])
|
306
|
+
end
|
307
|
+
|
308
|
+
# Set the fill properties for the labels.
|
309
|
+
fill = fill_properties(labels[:fill])
|
310
|
+
|
311
|
+
# Set the pattern properties for the labels.
|
312
|
+
pattern = pattern_properties(labels[:pattern])
|
313
|
+
|
314
|
+
# Set the gradient fill properties for the labels.
|
315
|
+
gradient = gradient_properties(labels[:gradient])
|
316
|
+
|
317
|
+
# Pattern fill overrides solid fill.
|
318
|
+
if pattern
|
319
|
+
fill = nil
|
320
|
+
end
|
321
|
+
|
322
|
+
# Gradient fill overrides solid and pattern fills.
|
323
|
+
if gradient
|
324
|
+
pattern = nil
|
325
|
+
fill = nil
|
326
|
+
end
|
327
|
+
|
328
|
+
labels[:line] = line
|
329
|
+
labels[:fill] = fill
|
330
|
+
labels[:pattern] = pattern
|
331
|
+
labels[:gradient] = gradient
|
332
|
+
|
299
333
|
if labels[:font]
|
300
334
|
labels[:font] = convert_font_args(labels[:font])
|
301
335
|
end
|
302
336
|
|
337
|
+
if labels[:custom]
|
338
|
+
# Duplicate, and modify, the custom label properties.
|
339
|
+
custom = []
|
340
|
+
|
341
|
+
labels[:custom].each do |label|
|
342
|
+
if !label
|
343
|
+
custom << nil
|
344
|
+
next
|
345
|
+
end
|
346
|
+
|
347
|
+
property = label.dup
|
348
|
+
|
349
|
+
# Convert formula.
|
350
|
+
if property[:value] && property[:value] =~ /^=[^!]+!\$/
|
351
|
+
property[:formula] = property[:value]
|
352
|
+
end
|
353
|
+
|
354
|
+
if property[:formula]
|
355
|
+
property[:formula] = property[:formula].sub(/^=/, '')
|
356
|
+
|
357
|
+
data_id = @chart.data_id(property[:formula], property[:data])
|
358
|
+
property[:data_id] = data_id
|
359
|
+
end
|
360
|
+
|
361
|
+
if property[:font]
|
362
|
+
property[:font] = convert_font_args(property[:font])
|
363
|
+
end
|
364
|
+
|
365
|
+
# Allow 'border' as a synonym for 'line'.
|
366
|
+
if property[:border]
|
367
|
+
line = line_properties(property[:border])
|
368
|
+
else
|
369
|
+
# Set the line properties for the data labels.
|
370
|
+
line = line_properties(property[:line])
|
371
|
+
end
|
372
|
+
|
373
|
+
# Set the fill properties for the labels.
|
374
|
+
fill = fill_properties(property[:fill])
|
375
|
+
|
376
|
+
# Set the pattern properties for the labels.
|
377
|
+
pattern = pattern_properties(property[:pattern])
|
378
|
+
|
379
|
+
# Set the gradient fill properties for the labels.
|
380
|
+
gradient = gradient_properties(property[:gradient])
|
381
|
+
|
382
|
+
# Pattern fill overrides solid fill.
|
383
|
+
if pattern
|
384
|
+
fill = nil
|
385
|
+
end
|
386
|
+
|
387
|
+
# Gradient fill overrides solid and pattern fills.
|
388
|
+
if gradient
|
389
|
+
pattern = nil
|
390
|
+
fill = nil
|
391
|
+
end
|
392
|
+
|
393
|
+
property[:line] = line
|
394
|
+
property[:fill] = fill
|
395
|
+
property[:pattern] = pattern
|
396
|
+
property[:gradient] = gradient
|
397
|
+
|
398
|
+
custom << property
|
399
|
+
end
|
400
|
+
labels[:custom] = custom
|
401
|
+
end
|
402
|
+
|
303
403
|
labels
|
304
404
|
end
|
305
405
|
end
|
data/lib/write_xlsx/utility.rb
CHANGED
@@ -804,9 +804,9 @@ def params_to_font(params)
|
|
804
804
|
#
|
805
805
|
# Write the <c:txPr> element.
|
806
806
|
#
|
807
|
-
def write_tx_pr(
|
807
|
+
def write_tx_pr(font, is_y_axis = nil) # :nodoc:
|
808
808
|
rotation = nil
|
809
|
-
if font && font[:_rotation]
|
809
|
+
if font && font.respond_to?(:[]) && font[:_rotation]
|
810
810
|
rotation = font[:_rotation]
|
811
811
|
end
|
812
812
|
@writer.tag_elements('c:txPr') do
|
@@ -903,6 +903,7 @@ def write_def_rpr_r_pr_common(font, style_attributes, tag) # :nodoc:
|
|
903
903
|
#
|
904
904
|
def get_font_latin_attributes(font)
|
905
905
|
return [] unless font
|
906
|
+
return [] unless font.respond_to?(:[])
|
906
907
|
|
907
908
|
attributes = []
|
908
909
|
attributes << ['typeface', font[:_name]] if ptrue?(font[:_name])
|
@@ -959,6 +960,7 @@ def color(color_code) # :nodoc:
|
|
959
960
|
#
|
960
961
|
def get_font_style_attributes(font)
|
961
962
|
return [] unless font
|
963
|
+
return [] unless font.respond_to?(:[])
|
962
964
|
|
963
965
|
attributes = []
|
964
966
|
attributes << ['sz', font[:_size]] if ptrue?(font[:_size])
|
data/lib/write_xlsx/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
WriteXLSX_VERSION = "1.
|
1
|
+
WriteXLSX_VERSION = "1.07.0"
|
data/lib/write_xlsx/worksheet.rb
CHANGED
@@ -2514,7 +2514,9 @@ def write_array_formula(*args)
|
|
2514
2514
|
col1, col2 = col2, col1 if col1 > col2
|
2515
2515
|
|
2516
2516
|
# Check that row and col are valid and store max and min values
|
2517
|
+
check_dimensions(row1, col1)
|
2517
2518
|
check_dimensions(row2, col2)
|
2519
|
+
store_row_col_max_min_values(row1, col1)
|
2518
2520
|
store_row_col_max_min_values(row2, col2)
|
2519
2521
|
|
2520
2522
|
# Define array range
|
@@ -3363,9 +3365,11 @@ def merge_range(*args)
|
|
3363
3365
|
row_first, row_last = row_last, row_first if row_first > row_last
|
3364
3366
|
col_first, col_last = col_last, col_first if col_first > col_last
|
3365
3367
|
|
3366
|
-
# Check that
|
3367
|
-
check_dimensions(
|
3368
|
-
|
3368
|
+
# Check that the data range is valid and store the max and min values.
|
3369
|
+
check_dimensions(row_first, col_first)
|
3370
|
+
check_dimensions(row_last, col_last)
|
3371
|
+
store_row_col_max_min_values(row_first, col_first)
|
3372
|
+
store_row_col_max_min_values(row_last, col_last)
|
3369
3373
|
|
3370
3374
|
# Store the merge range.
|
3371
3375
|
@merge << [row_first, col_first, row_last, col_last]
|
@@ -3428,9 +3432,11 @@ def merge_range_type(type, *args)
|
|
3428
3432
|
row_first, row_last = row_last, row_first if row_first > row_last
|
3429
3433
|
col_first, col_last = col_last, col_first if col_first > col_last
|
3430
3434
|
|
3431
|
-
# Check that
|
3432
|
-
check_dimensions(
|
3433
|
-
|
3435
|
+
# Check that the data range is valid and store the max and min values.
|
3436
|
+
check_dimensions(row_first, col_first)
|
3437
|
+
check_dimensions(row_last, col_last)
|
3438
|
+
store_row_col_max_min_values(row_first, col_first)
|
3439
|
+
store_row_col_max_min_values(row_last, col_last)
|
3434
3440
|
|
3435
3441
|
# Store the merge range.
|
3436
3442
|
@merge << [row_first, col_first, row_last, col_last]
|
Binary file
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
class TestRegressionArrayFormula04 < Minitest::Test
|
5
|
+
def setup
|
6
|
+
setup_dir_var
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@tempfile.close(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_array_formula04
|
14
|
+
@xlsx = 'array_formula04.xlsx'
|
15
|
+
workbook = WriteXLSX.new(@io)
|
16
|
+
worksheet = workbook.add_worksheet
|
17
|
+
|
18
|
+
worksheet.write_array_formula(
|
19
|
+
'A1:A3',
|
20
|
+
'{=SUM(B1:C1*B2:C2)}',
|
21
|
+
nil,
|
22
|
+
0
|
23
|
+
)
|
24
|
+
|
25
|
+
workbook.close
|
26
|
+
compare_for_regression(
|
27
|
+
[ 'xl/calcChain.xml', '[Content_Types].xml', 'xl/_rels/workbook.xml.rels' ],
|
28
|
+
{'xl/workbook.xml' => ['<workbookView']}
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
class TestRegressionChartDataLabels26 < Minitest::Test
|
5
|
+
def setup
|
6
|
+
setup_dir_var
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@tempfile.close(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_chart_data_labels26
|
14
|
+
@xlsx = 'chart_data_labels26.xlsx'
|
15
|
+
workbook = WriteXLSX.new(@io)
|
16
|
+
worksheet = workbook.add_worksheet
|
17
|
+
chart = workbook.add_chart(:type => 'column', :embedded => 1)
|
18
|
+
|
19
|
+
# For testing, copy the randomly generated axis ids in the target xlsx file.
|
20
|
+
chart.instance_variable_set(:@axis_ids, [48514944, 48516480])
|
21
|
+
|
22
|
+
data = [
|
23
|
+
[ 1, 2, 3, 4, 5],
|
24
|
+
[ 2, 4, 6, 8, 10],
|
25
|
+
[ 3, 6, 9, 12, 15],
|
26
|
+
[10, 20, 30, 40, 50]
|
27
|
+
]
|
28
|
+
|
29
|
+
worksheet.write('A1', data)
|
30
|
+
|
31
|
+
chart.add_series(
|
32
|
+
:values => '=Sheet1!$A$1:$A$5',
|
33
|
+
:data_labels => {:value => 1, :custom => [{:value => 33}]}
|
34
|
+
)
|
35
|
+
|
36
|
+
chart.add_series(:values => '=Sheet1!$B$1:$B$5')
|
37
|
+
chart.add_series(:values => '=Sheet1!$C$1:$C$5')
|
38
|
+
|
39
|
+
worksheet.insert_chart('E9', chart)
|
40
|
+
|
41
|
+
workbook.close
|
42
|
+
compare_for_regression
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
class TestRegressionChartDataLabels27 < Minitest::Test
|
5
|
+
def setup
|
6
|
+
setup_dir_var
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@tempfile.close(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_chart_data_labels27
|
14
|
+
@xlsx = 'chart_data_labels27.xlsx'
|
15
|
+
workbook = WriteXLSX.new(@io)
|
16
|
+
worksheet = workbook.add_worksheet
|
17
|
+
chart = workbook.add_chart(:type => 'column', :embedded => 1)
|
18
|
+
|
19
|
+
# For testing, copy the randomly generated axis ids in the target xlsx file.
|
20
|
+
chart.instance_variable_set(:@axis_ids, [48514944, 48516480])
|
21
|
+
|
22
|
+
data = [
|
23
|
+
[ 1, 2, 3, 4, 5],
|
24
|
+
[ 2, 4, 6, 8, 10],
|
25
|
+
[ 3, 6, 9, 12, 15],
|
26
|
+
[10, 20, 30, 40, 50]
|
27
|
+
]
|
28
|
+
|
29
|
+
worksheet.write('A1', data)
|
30
|
+
|
31
|
+
chart.add_series(
|
32
|
+
:values => '=Sheet1!$A$1:$A$5',
|
33
|
+
:data_labels => {:value => 1, :custom => [{:value => '=Sheet1!$D$1'}]}
|
34
|
+
)
|
35
|
+
|
36
|
+
chart.add_series(:values => '=Sheet1!$B$1:$B$5')
|
37
|
+
chart.add_series(:values => '=Sheet1!$C$1:$C$5')
|
38
|
+
|
39
|
+
worksheet.insert_chart('E9', chart)
|
40
|
+
|
41
|
+
workbook.close
|
42
|
+
compare_for_regression
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
class TestRegressionChartDataLabels28 < Minitest::Test
|
5
|
+
def setup
|
6
|
+
setup_dir_var
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@tempfile.close(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_chart_data_labels28
|
14
|
+
@xlsx = 'chart_data_labels28.xlsx'
|
15
|
+
workbook = WriteXLSX.new(@io)
|
16
|
+
worksheet = workbook.add_worksheet
|
17
|
+
chart = workbook.add_chart(:type => 'column', :embedded => 1)
|
18
|
+
|
19
|
+
# For testing, copy the randomly generated axis ids in the target xlsx file.
|
20
|
+
chart.instance_variable_set(:@axis_ids, [48514944, 48516480])
|
21
|
+
|
22
|
+
data = [
|
23
|
+
[ 1, 2, 3, 4, 5],
|
24
|
+
[ 2, 4, 6, 8, 10],
|
25
|
+
[ 3, 6, 9, 12, 15],
|
26
|
+
['foo', 'bar']
|
27
|
+
]
|
28
|
+
|
29
|
+
worksheet.write('A1', data)
|
30
|
+
|
31
|
+
custom = [
|
32
|
+
{:value => 123},
|
33
|
+
{:value => 'abc'},
|
34
|
+
nil,
|
35
|
+
{:formula => 'Sheet1!$D$1'},
|
36
|
+
{:formula => 'Sheet1!$D$2'}
|
37
|
+
]
|
38
|
+
|
39
|
+
chart.add_series(
|
40
|
+
:values => '=Sheet1!$A$1:$A$5',
|
41
|
+
:data_labels => {:value => 1, :custom => custom }
|
42
|
+
)
|
43
|
+
|
44
|
+
chart.add_series(:values => '=Sheet1!$B$1:$B$5')
|
45
|
+
chart.add_series(:values => '=Sheet1!$C$1:$C$5')
|
46
|
+
|
47
|
+
worksheet.insert_chart('E9', chart)
|
48
|
+
|
49
|
+
workbook.close
|
50
|
+
compare_for_regression
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
class TestRegressionChartDataLabels29 < Minitest::Test
|
5
|
+
def setup
|
6
|
+
setup_dir_var
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@tempfile.close(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_chart_data_labels29
|
14
|
+
@xlsx = 'chart_data_labels29.xlsx'
|
15
|
+
workbook = WriteXLSX.new(@io)
|
16
|
+
worksheet = workbook.add_worksheet
|
17
|
+
chart = workbook.add_chart(:type => 'column', :embedded => 1)
|
18
|
+
|
19
|
+
# For testing, copy the randomly generated axis ids in the target xlsx file.
|
20
|
+
chart.instance_variable_set(:@axis_ids, [67858816, 67863296])
|
21
|
+
|
22
|
+
data = [
|
23
|
+
[ 1, 2, 3, 4, 5],
|
24
|
+
[ 2, 4, 6, 8, 10],
|
25
|
+
[ 3, 6, 9, 12, 15]
|
26
|
+
]
|
27
|
+
|
28
|
+
worksheet.write('A1', data)
|
29
|
+
|
30
|
+
chart.add_series(
|
31
|
+
:values => '=Sheet1!$A$1:$A$5',
|
32
|
+
:data_labels => {:value => 1, :custom => [{:delete => 1}] }
|
33
|
+
)
|
34
|
+
|
35
|
+
chart.add_series(:values => '=Sheet1!$B$1:$B$5')
|
36
|
+
chart.add_series(:values => '=Sheet1!$C$1:$C$5')
|
37
|
+
|
38
|
+
worksheet.insert_chart('E9', chart)
|
39
|
+
|
40
|
+
workbook.close
|
41
|
+
compare_for_regression
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
class TestRegressionChartDataLabels30 < Minitest::Test
|
5
|
+
def setup
|
6
|
+
setup_dir_var
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
@tempfile.close(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_chart_data_labels30
|
14
|
+
@xlsx = 'chart_data_labels30.xlsx'
|
15
|
+
workbook = WriteXLSX.new(@io)
|
16
|
+
worksheet = workbook.add_worksheet
|
17
|
+
chart = workbook.add_chart(:type => 'column', :embedded => 1)
|
18
|
+
|
19
|
+
# For testing, copy the randomly generated axis ids in the target xlsx file.
|
20
|
+
chart.instance_variable_set(:@axis_ids, [67858816, 67863296])
|
21
|
+
|
22
|
+
data = [
|
23
|
+
[ 1, 2, 3, 4, 5],
|
24
|
+
[ 2, 4, 6, 8, 10],
|
25
|
+
[ 3, 6, 9, 12, 15]
|
26
|
+
]
|
27
|
+
|
28
|
+
worksheet.write('A1', data)
|
29
|
+
|
30
|
+
chart.add_series(
|
31
|
+
:values => '=Sheet1!$A$1:$A$5',
|
32
|
+
:data_labels => {
|
33
|
+
:value => 1,
|
34
|
+
:custom => [{:delete => 1}, nil, {:delete => 1}, nil, {:delete => 1}]
|
35
|
+
}
|
36
|
+
)
|
37
|
+
|
38
|
+
chart.add_series(:values => '=Sheet1!$B$1:$B$5')
|
39
|
+
chart.add_series(:values => '=Sheet1!$C$1:$C$5')
|
40
|
+
|
41
|
+
worksheet.insert_chart('E9', chart)
|
42
|
+
|
43
|
+
workbook.close
|
44
|
+
compare_for_regression
|
45
|
+
end
|
46
|
+
end
|