axlsx 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +18 -7
- data/examples/conditional_formatting/example_conditional_formatting.rb +72 -0
- data/examples/conditional_formatting/getting_barred.rb +37 -0
- data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
- data/examples/conditional_formatting/scaled_colors.rb +39 -0
- data/examples/conditional_formatting/stop_and_go.rb +37 -0
- data/examples/example.rb +6 -2
- data/examples/{real_example.rb → skydrive/real_example.rb} +0 -0
- data/lib/axlsx.rb +1 -1
- data/lib/axlsx/drawing/axis.rb +16 -0
- data/lib/axlsx/stylesheet/dxf.rb +79 -0
- data/lib/axlsx/stylesheet/font.rb +2 -1
- data/lib/axlsx/stylesheet/styles.rb +141 -50
- data/lib/axlsx/stylesheet/xf.rb +2 -0
- data/lib/axlsx/util/constants.rb +8 -0
- data/lib/axlsx/util/validators.rb +44 -0
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/workbook.rb +6 -0
- data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
- data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/color_scale.rb +76 -0
- data/lib/axlsx/workbook/worksheet/color_scale.rb~ +46 -0
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -0
- data/lib/axlsx/workbook/worksheet/data_bar.rb +97 -0
- data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
- data/lib/axlsx/workbook/worksheet/icon_set.rb~ +95 -0
- data/lib/axlsx/workbook/worksheet/row.rb +2 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +25 -3
- data/test/drawing/tc_axis.rb +8 -0
- data/test/stylesheet/tc_dxf.rb +81 -0
- data/test/stylesheet/tc_styles.rb +148 -2
- data/test/workbook/worksheet/tc_cfvo.rb +31 -0
- data/test/workbook/worksheet/tc_cfvo.rb~ +20 -0
- data/test/workbook/worksheet/tc_color_scale.rb +29 -0
- data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
- data/test/workbook/worksheet/tc_conditional_formatting.rb +173 -0
- data/test/workbook/worksheet/tc_data_bar.rb +39 -0
- data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
- data/test/workbook/worksheet/tc_icon_set.rb +45 -0
- data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
- data/test/workbook/worksheet/tc_row.rb +9 -2
- metadata +45 -27
- data/examples/axlsx.xlsx +0 -0
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/lib/axlsx/util/doc/_index.html +0 -84
- data/lib/axlsx/util/doc/class_list.html +0 -47
- data/lib/axlsx/util/doc/css/common.css +0 -1
- data/lib/axlsx/util/doc/css/full_list.css +0 -55
- data/lib/axlsx/util/doc/css/style.css +0 -322
- data/lib/axlsx/util/doc/file_list.html +0 -46
- data/lib/axlsx/util/doc/frames.html +0 -13
- data/lib/axlsx/util/doc/index.html +0 -84
- data/lib/axlsx/util/doc/js/app.js +0 -205
- data/lib/axlsx/util/doc/js/full_list.js +0 -173
- data/lib/axlsx/util/doc/js/jquery.js +0 -16
- data/lib/axlsx/util/doc/method_list.html +0 -46
- data/lib/axlsx/util/doc/top-level-namespace.html +0 -95
data/README.md
CHANGED
@@ -16,11 +16,13 @@ Axlsx: Office Open XML Spreadsheet Generation
|
|
16
16
|
|
17
17
|
**License**: MIT License
|
18
18
|
|
19
|
-
**Latest Version**: 1.1.
|
19
|
+
**Latest Version**: 1.1.2
|
20
20
|
|
21
21
|
**Ruby Version**: 1.8.7, 1.9.2, 1.9.3
|
22
22
|
|
23
|
-
**JRuby Version**: 1.6.7
|
23
|
+
**JRuby Version**: 1.6.7 1.8 and 1.9 modes
|
24
|
+
|
25
|
+
**Rubinius Version**: rubinius 2.0.0dev * lower versions may run, this gem always tests against head.
|
24
26
|
|
25
27
|
**Release Date**: April 18th 2012
|
26
28
|
|
@@ -283,6 +285,8 @@ wb.add_worksheet(:name => "Bar Chart") do |sheet|
|
|
283
285
|
sheet.add_row [1, 2, 3]
|
284
286
|
sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A4", :end_at => "F17") do |chart|
|
285
287
|
chart.add_series :data => sheet["A3:C3"], :labels => sheet["A2:C2"], :title => sheet["A1"]
|
288
|
+
chart.valAxis.label_rotation = -45
|
289
|
+
chart.catAxis.label_rotation = 45
|
286
290
|
end
|
287
291
|
end
|
288
292
|
```
|
@@ -443,15 +447,14 @@ p.use_shared_strings = true
|
|
443
447
|
p.serialize("shared_strings_example.xlsx")
|
444
448
|
```
|
445
449
|
|
446
|
-
|
447
450
|
##Disabling Autowidth
|
448
451
|
|
449
452
|
```ruby
|
450
453
|
p = Axlsx::Package.new
|
451
454
|
p.use_autowidth = false
|
452
455
|
wb = p.workbook
|
453
|
-
wb.add_worksheet(:name => "
|
454
|
-
sheet.add_row ['oh look! no autowidth
|
456
|
+
wb.add_worksheet(:name => "Manual Widths") do | sheet |
|
457
|
+
sheet.add_row ['oh look! no autowidth']
|
455
458
|
end
|
456
459
|
p.validate.each { |e| puts e.message }
|
457
460
|
p.serialize("no-use_autowidth.xlsx")
|
@@ -471,6 +474,12 @@ This gem has 100% test coverage using test/unit. To execute tests for this gem,
|
|
471
474
|
|
472
475
|
#Change log
|
473
476
|
---------
|
477
|
+
- ** April.25.12:*: 1.1.2 release
|
478
|
+
- Conditional Formatting completely implemented.
|
479
|
+
- refactoring / documentation for Style#add_style
|
480
|
+
- added in label rotation for chart axis labels
|
481
|
+
- bugfix to porperly assign style and type info to cells when only partial information is provided in the types/style option
|
482
|
+
|
474
483
|
- ** April.18.12**: 1.1.1 release
|
475
484
|
- bugfix for autowidth calculations across multiple rows
|
476
485
|
- bugfix for dimension calculations with nil cells.
|
@@ -491,7 +500,7 @@ This gem has 100% test coverage using test/unit. To execute tests for this gem,
|
|
491
500
|
- Support for tables added in - Note: Pre 2011 versions of Mac office do not support this feature and will warn.
|
492
501
|
- Support for splatter charts added
|
493
502
|
- Major (like 7x faster!) performance updates.
|
494
|
-
- Gem now supports for JRuby 1.6.7, as well as
|
503
|
+
- Gem now supports for JRuby 1.6.7, as well as experimental support for Rubinius
|
495
504
|
|
496
505
|
Please see the {file:CHANGELOG.md} document for past release information.
|
497
506
|
|
@@ -515,8 +524,10 @@ Please see the {file:CHANGELOG.md} document for past release information.
|
|
515
524
|
|
516
525
|
[moskrin](https://github.com/moskrin) - for keeping border creation on the edge.
|
517
526
|
|
527
|
+
[scpike](https://github.com/scpike) - for keeping numbers fixed even when they are rational and a super clean implementation of conditional formatting.
|
528
|
+
|
518
529
|
#Copyright and License
|
519
530
|
----------
|
520
531
|
|
521
532
|
Axlsx © 2011-2012 by [Randy Morgan](mailto:digial.ipseity@gmail.com). Axlsx is
|
522
|
-
licensed under the MIT license. Please see the
|
533
|
+
licensed under the MIT license. Please see the LICENSE document for more information.
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
4
|
+
require 'axlsx'
|
5
|
+
|
6
|
+
p = Axlsx::Package.new
|
7
|
+
book = p.workbook
|
8
|
+
|
9
|
+
# define your regular styles
|
10
|
+
percent = book.styles.add_style(:format_code => "0.00%", :border => Axlsx::STYLE_THIN_BORDER)
|
11
|
+
money = book.styles.add_style(:format_code => '0,000', :border => Axlsx::STYLE_THIN_BORDER)
|
12
|
+
|
13
|
+
# define the style for conditional formatting
|
14
|
+
profitable = book.styles.add_style( :fg_color=>"FF428751",
|
15
|
+
:type => :dxf)
|
16
|
+
|
17
|
+
book.add_worksheet(:name => "Cell Is") do |ws|
|
18
|
+
|
19
|
+
# Generate 20 rows of data
|
20
|
+
ws.add_row ["Previous Year Quarterly Profits (JPY)"]
|
21
|
+
ws.add_row ["Quarter", "Profit", "% of Total"]
|
22
|
+
offset = 3
|
23
|
+
rows = 20
|
24
|
+
offset.upto(rows + offset) do |i|
|
25
|
+
ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Apply conditional formatting to range B3:B100 in the worksheet
|
29
|
+
ws.add_conditional_formatting("B3:B100", { :type => :cellIs, :operator => :greaterThan, :formula => "100000", :dxfId => profitable, :priority => 1 })
|
30
|
+
end
|
31
|
+
|
32
|
+
book.add_worksheet(:name => "Color Scale") do |ws|
|
33
|
+
ws.add_row ["Previous Year Quarterly Profits (JPY)"]
|
34
|
+
ws.add_row ["Quarter", "Profit", "% of Total"]
|
35
|
+
offset = 3
|
36
|
+
rows = 20
|
37
|
+
offset.upto(rows + offset) do |i|
|
38
|
+
ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
|
39
|
+
end
|
40
|
+
# Apply conditional formatting to range B3:B100 in the worksheet
|
41
|
+
color_scale = Axlsx::ColorScale.new
|
42
|
+
ws.add_conditional_formatting("B3:B100", { :type => :colorScale, :operator => :greaterThan, :formula => "100000", :dxfId => profitable, :priority => 1, :color_scale => color_scale })
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
book.add_worksheet(:name => "Data Bar") do |ws|
|
47
|
+
ws.add_row ["Previous Year Quarterly Profits (JPY)"]
|
48
|
+
ws.add_row ["Quarter", "Profit", "% of Total"]
|
49
|
+
offset = 3
|
50
|
+
rows = 20
|
51
|
+
offset.upto(rows + offset) do |i|
|
52
|
+
ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
|
53
|
+
end
|
54
|
+
# Apply conditional formatting to range B3:B100 in the worksheet
|
55
|
+
data_bar = Axlsx::DataBar.new
|
56
|
+
ws.add_conditional_formatting("B3:B100", { :type => :dataBar, :dxfId => profitable, :priority => 1, :data_bar => data_bar })
|
57
|
+
end
|
58
|
+
|
59
|
+
book.add_worksheet(:name => "Icon Set") do |ws|
|
60
|
+
ws.add_row ["Previous Year Quarterly Profits (JPY)"]
|
61
|
+
ws.add_row ["Quarter", "Profit", "% of Total"]
|
62
|
+
offset = 3
|
63
|
+
rows = 20
|
64
|
+
offset.upto(rows + offset) do |i|
|
65
|
+
ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
|
66
|
+
end
|
67
|
+
# Apply conditional formatting to range B3:B100 in the worksheet
|
68
|
+
icon_set = Axlsx::IconSet.new
|
69
|
+
ws.add_conditional_formatting("B3:B100", { :type => :iconSet, :dxfId => profitable, :priority => 1, :icon_set => icon_set })
|
70
|
+
end
|
71
|
+
|
72
|
+
p.serialize('example_conditional_formatting.xlsx')
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
4
|
+
require 'axlsx'
|
5
|
+
p = Axlsx::Package.new
|
6
|
+
p.workbook do |wb|
|
7
|
+
# define your regular styles
|
8
|
+
styles = wb.styles
|
9
|
+
title = styles.add_style :sz => 15, :b => true, :u => true
|
10
|
+
default = styles.add_style :border => Axlsx::STYLE_THIN_BORDER
|
11
|
+
header = styles.add_style :bg_color => '00', :fg_color => 'FF', :b => true
|
12
|
+
money = styles.add_style :format_code => '#,###,##0', :border => Axlsx::STYLE_THIN_BORDER
|
13
|
+
percent = styles.add_style :num_fmt => Axlsx::NUM_FMT_PERCENT, :border => Axlsx::STYLE_THIN_BORDER
|
14
|
+
|
15
|
+
# define the style for conditional formatting - its the :dxf bit that counts!
|
16
|
+
profitable = styles.add_style :fg_color => 'FF428751', :sz => 12, :type => :dxf, :b => true
|
17
|
+
|
18
|
+
wb.add_worksheet(:name => 'Data Bar Conditional Formatting') do |ws|
|
19
|
+
ws.add_row ['A$$le Q1 Revenue Historical Analysis (USD)'], :style => title
|
20
|
+
ws.add_row
|
21
|
+
ws.add_row ['Quarter', 'Profit', '% of Total'], :style => header
|
22
|
+
ws.add_row ['Q1-2010', '15680000000', '=B4/SUM(B4:B7)'], :style => [default, money, percent]
|
23
|
+
ws.add_row ['Q1-2011', '26740000000', '=B5/SUM(B4:B7)'], :style => [default, money, percent]
|
24
|
+
ws.add_row ['Q1-2012', '46330000000', '=B6/SUM(B4:B7)'], :style => [default, money, percent]
|
25
|
+
ws.add_row ['Q1-2013(est)', '72230000000', '=B7/SUM(B4:B7)'], :style => [default, money, percent]
|
26
|
+
|
27
|
+
ws.merge_cells 'A1:C1'
|
28
|
+
|
29
|
+
# Apply conditional formatting to range B4:B7 in the worksheet
|
30
|
+
data_bar = Axlsx::DataBar.new
|
31
|
+
ws.add_conditional_formatting 'B4:B7', { :type => :dataBar,
|
32
|
+
:dxfId => profitable,
|
33
|
+
:priority => 1,
|
34
|
+
:data_bar => data_bar }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
p.serialize 'getting_barred.xlsx'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
4
|
+
require 'axlsx'
|
5
|
+
p = Axlsx::Package.new
|
6
|
+
p.workbook do |wb|
|
7
|
+
# define your regular styles
|
8
|
+
styles = wb.styles
|
9
|
+
title = styles.add_style :sz => 15, :b => true, :u => true
|
10
|
+
default = styles.add_style :border => Axlsx::STYLE_THIN_BORDER
|
11
|
+
header = styles.add_style :bg_color => '00', :fg_color => 'FF', :b => true
|
12
|
+
money = styles.add_style :format_code => '###,###,###,##0', :border => Axlsx::STYLE_THIN_BORDER
|
13
|
+
percent = styles.add_style :num_fmt => Axlsx::NUM_FMT_PERCENT, :border => Axlsx::STYLE_THIN_BORDER
|
14
|
+
|
15
|
+
# define the style for conditional formatting - its the :dxf bit that counts!
|
16
|
+
profitable = styles.add_style :fg_color => 'FF428751', :sz => 12, :type => :dxf, :b => true
|
17
|
+
|
18
|
+
wb.add_worksheet(:name => 'The High Notes') do |ws|
|
19
|
+
ws.add_row ['A$$le Q1 Revenue Historical Analysis (USD)'], :style => title
|
20
|
+
ws.add_row
|
21
|
+
ws.add_row ['Quarter', 'Profit', '% of Total'], :style => header
|
22
|
+
ws.add_row ['Q1-2010', '15680000000', '=B4/SUM(B4:B7)'], :style => [default, money, percent]
|
23
|
+
ws.add_row ['Q1-2011', '26740000000', '=B5/SUM(B4:B7)'], :style => [default, money, percent]
|
24
|
+
ws.add_row ['Q1-2012', '46330000000', '=B6/SUM(B4:B7)'], :style => [default, money, percent]
|
25
|
+
ws.add_row ['Q1-2013(est)', '72230000000', '=B7/SUM(B4:B7)'], :style => [default, money, percent]
|
26
|
+
|
27
|
+
ws.merge_cells 'A1:C1'
|
28
|
+
|
29
|
+
# Apply conditional formatting to range B4:B7 in the worksheet
|
30
|
+
ws.add_conditional_formatting 'B4:B7', { :type => :cellIs,
|
31
|
+
:operator => :greaterThan,
|
32
|
+
:formula => '27000000000',
|
33
|
+
:dxfId => profitable,
|
34
|
+
:priority => 1 }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
p.serialize 'the_high_notes.xlsx'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
4
|
+
require 'axlsx'
|
5
|
+
p = Axlsx::Package.new
|
6
|
+
p.workbook do |wb|
|
7
|
+
# define your regular styles
|
8
|
+
styles = wb.styles
|
9
|
+
title = styles.add_style :sz => 15, :b => true, :u => true
|
10
|
+
default = styles.add_style :border => Axlsx::STYLE_THIN_BORDER
|
11
|
+
header = styles.add_style :bg_color => '00', :fg_color => 'FF', :b => true
|
12
|
+
money = styles.add_style :format_code => '#,###,##0', :border => Axlsx::STYLE_THIN_BORDER
|
13
|
+
percent = styles.add_style :num_fmt => Axlsx::NUM_FMT_PERCENT, :border => Axlsx::STYLE_THIN_BORDER
|
14
|
+
|
15
|
+
# define the style for conditional formatting - its the :dxf bit that counts!
|
16
|
+
profitable = styles.add_style :fg_color => 'FF428751', :sz => 12, :type => :dxf, :b => true
|
17
|
+
|
18
|
+
wb.add_worksheet(:name => 'Scaled Colors') do |ws|
|
19
|
+
ws.add_row ['A$$le Q1 Revenue Historical Analysis (USD)'], :style => title
|
20
|
+
ws.add_row
|
21
|
+
ws.add_row ['Quarter', 'Profit', '% of Total'], :style => header
|
22
|
+
ws.add_row ['Q1-2010', '15680000000', '=B4/SUM(B4:B7)'], :style => [default, money, percent]
|
23
|
+
ws.add_row ['Q1-2011', '26740000000', '=B5/SUM(B4:B7)'], :style => [default, money, percent]
|
24
|
+
ws.add_row ['Q1-2012', '46330000000', '=B6/SUM(B4:B7)'], :style => [default, money, percent]
|
25
|
+
ws.add_row ['Q1-2013(est)', '72230000000', '=B7/SUM(B4:B7)'], :style => [default, money, percent]
|
26
|
+
|
27
|
+
ws.merge_cells 'A1:C1'
|
28
|
+
|
29
|
+
# Apply conditional formatting to range B4:B7 in the worksheet
|
30
|
+
color_scale = Axlsx::ColorScale.new
|
31
|
+
ws.add_conditional_formatting 'B4:B7', { :type => :colorScale,
|
32
|
+
:operator => :greaterThan,
|
33
|
+
:formula => '27000000000',
|
34
|
+
:dxfId => profitable,
|
35
|
+
:priority => 1,
|
36
|
+
:color_scale => color_scale }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
p.serialize 'scaled_colors.xlsx'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
4
|
+
require 'axlsx'
|
5
|
+
p = Axlsx::Package.new
|
6
|
+
p.workbook do |wb|
|
7
|
+
# define your regular styles
|
8
|
+
styles = wb.styles
|
9
|
+
title = styles.add_style :sz => 15, :b => true, :u => true
|
10
|
+
default = styles.add_style :border => Axlsx::STYLE_THIN_BORDER
|
11
|
+
header = styles.add_style :bg_color => '00', :fg_color => 'FF', :b => true
|
12
|
+
money = styles.add_style :format_code => '#,###,##0', :border => Axlsx::STYLE_THIN_BORDER
|
13
|
+
percent = styles.add_style :num_fmt => Axlsx::NUM_FMT_PERCENT, :border => Axlsx::STYLE_THIN_BORDER
|
14
|
+
|
15
|
+
# define the style for conditional formatting - its the :dxf bit that counts!
|
16
|
+
profitable = styles.add_style :fg_color => 'FF428751', :sz => 12, :type => :dxf, :b => true
|
17
|
+
|
18
|
+
wb.add_worksheet(:name => 'Downtown traffic') do |ws|
|
19
|
+
ws.add_row ['A$$le Q1 Revenue Historical Analysis (USD)'], :style => title
|
20
|
+
ws.add_row
|
21
|
+
ws.add_row ['Quarter', 'Profit', '% of Total'], :style => header
|
22
|
+
ws.add_row ['Q1-2010', '15680000000', '=B4/SUM(B4:B7)'], :style => [default, money, percent]
|
23
|
+
ws.add_row ['Q1-2011', '26740000000', '=B5/SUM(B4:B7)'], :style => [default, money, percent]
|
24
|
+
ws.add_row ['Q1-2012', '46330000000', '=B6/SUM(B4:B7)'], :style => [default, money, percent]
|
25
|
+
ws.add_row ['Q1-2013(est)', '72230000000', '=B7/SUM(B4:B7)'], :style => [default, money, percent]
|
26
|
+
|
27
|
+
ws.merge_cells 'A1:C1'
|
28
|
+
|
29
|
+
# Apply conditional formatting to range B3:B7 in the worksheet
|
30
|
+
icon_set = Axlsx::IconSet.new
|
31
|
+
ws.add_conditional_formatting 'B3:B7', { :type => :iconSet,
|
32
|
+
:dxfId => profitable,
|
33
|
+
:priority => 1,
|
34
|
+
:icon_set => icon_set }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
p.serialize 'stop_and_go.xlsx'
|
data/examples/example.rb
CHANGED
@@ -42,7 +42,7 @@ require 'date'
|
|
42
42
|
wb.styles do |s|
|
43
43
|
date = s.add_style(:format_code => "yyyy-mm-dd", :border => Axlsx::STYLE_THIN_BORDER)
|
44
44
|
padded = s.add_style(:format_code => "00#", :border => Axlsx::STYLE_THIN_BORDER)
|
45
|
-
percent = s.add_style(:format_code => "
|
45
|
+
percent = s.add_style(:format_code => "###0%", :border => Axlsx::STYLE_THIN_BORDER)
|
46
46
|
# wb.date1904 = true # Use the 1904 date system (Used by Excel for Mac < 2011)
|
47
47
|
wb.add_worksheet(:name => "Formatting Data") do |sheet|
|
48
48
|
sheet.add_row ["Custom Formatted Date", "Percent Formatted Float", "Padded Numbers"], :style => Axlsx::STYLE_THIN_BORDER
|
@@ -146,7 +146,9 @@ end
|
|
146
146
|
|
147
147
|
wb.add_worksheet(:name => "Automatic cell types") do |sheet|
|
148
148
|
sheet.add_row ["Date", "Time", "String", "Boolean", "Float", "Integer"]
|
149
|
-
|
149
|
+
date_format = wb.styles.add_style :format_code => 'YYYY-MMM-DD'
|
150
|
+
time_format = wb.styles.add_style :format_code => 'HH:MM:SS'
|
151
|
+
sheet.add_row [Date.today, Time.now, "value", true, 0.1, 1], :style => [date_format, time_format]
|
150
152
|
end
|
151
153
|
|
152
154
|
##Merging Cells.
|
@@ -170,6 +172,8 @@ wb.add_worksheet(:name => "Bar Chart") do |sheet|
|
|
170
172
|
sheet.add_row [1, 2, 3]
|
171
173
|
sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A4", :end_at => "F17") do |chart|
|
172
174
|
chart.add_series :data => sheet["A3:C3"], :labels => sheet["A2:C2"], :title => sheet["A1"]
|
175
|
+
chart.valAxis.label_rotation = -45
|
176
|
+
chart.catAxis.label_rotation = 45
|
173
177
|
end
|
174
178
|
end
|
175
179
|
|
File without changes
|
data/lib/axlsx.rb
CHANGED
data/lib/axlsx/drawing/axis.rb
CHANGED
@@ -36,6 +36,10 @@ module Axlsx
|
|
36
36
|
# @return [Symbol]
|
37
37
|
attr_reader :crosses
|
38
38
|
|
39
|
+
# specifies how the degree of label rotation
|
40
|
+
# @return [Integer]
|
41
|
+
attr_reader :label_rotation
|
42
|
+
|
39
43
|
# specifies if gridlines should be shown in the chart
|
40
44
|
# @return [Boolean]
|
41
45
|
attr_reader :gridlines
|
@@ -53,6 +57,7 @@ module Axlsx
|
|
53
57
|
@axId = axId
|
54
58
|
@crossAx = crossAx
|
55
59
|
@format_code = "General"
|
60
|
+
@label_rotation = 0
|
56
61
|
@scaling = Scaling.new(:orientation=>:minMax)
|
57
62
|
self.axPos = :b
|
58
63
|
self.tickLblPos = :nextTo
|
@@ -83,6 +88,15 @@ module Axlsx
|
|
83
88
|
# must be one of [:autoZero, :min, :max]
|
84
89
|
def crosses=(v) RestrictionValidator.validate "#{self.class}.crosses", [:autoZero, :min, :max], v; @crosses = v; end
|
85
90
|
|
91
|
+
# Specify the degree of label rotation to apply to labels
|
92
|
+
# default true
|
93
|
+
def label_rotation=(v)
|
94
|
+
Axlsx::validate_int(v)
|
95
|
+
adjusted = v.to_i * 60000
|
96
|
+
Axlsx::validate_angle(adjusted)
|
97
|
+
@label_rotation = adjusted
|
98
|
+
end
|
99
|
+
|
86
100
|
|
87
101
|
# Serializes the object
|
88
102
|
# @param [String] str
|
@@ -105,6 +119,8 @@ module Axlsx
|
|
105
119
|
str << '<c:majorTickMark val="none"/>'
|
106
120
|
str << '<c:minorTickMark val="none"/>'
|
107
121
|
str << '<c:tickLblPos val="' << @tickLblPos.to_s << '"/>'
|
122
|
+
# some potential value in implementing this in full. Very detailed!
|
123
|
+
str << "<c:txPr><a:bodyPr rot='#{@label_rotation}'/><a:lstStyle/><a:p><a:pPr><a:defRPr/></a:pPr><a:endParaRPr/></a:p></c:txPr>"
|
108
124
|
str << '<c:crossAx val="' << @crossAx.to_s << '"/>'
|
109
125
|
str << '<c:crosses val="' << @crosses.to_s << '"/>'
|
110
126
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
# The Dxf class defines an incremental formatting record for use in Styles. The recommended way to manage styles for your workbook is with Styles#add_style
|
4
|
+
# @see Styles#add_style
|
5
|
+
class Dxf
|
6
|
+
# The order in which the child elements is put in the XML seems to
|
7
|
+
# be important for Excel
|
8
|
+
CHILD_ELEMENTS = [:font, :numFmt, :fill, :alignment, :border, :protection]
|
9
|
+
#does not support extList (ExtensionList)
|
10
|
+
|
11
|
+
# The cell alignment for this style
|
12
|
+
# @return [CellAlignment]
|
13
|
+
# @see CellAlignment
|
14
|
+
attr_reader :alignment
|
15
|
+
|
16
|
+
# The cell protection for this style
|
17
|
+
# @return [CellProtection]
|
18
|
+
# @see CellProtection
|
19
|
+
attr_reader :protection
|
20
|
+
|
21
|
+
# the child NumFmt to be used to this style
|
22
|
+
# @return [NumFmt]
|
23
|
+
attr_reader :numFmt
|
24
|
+
|
25
|
+
# the child font to be used for this style
|
26
|
+
# @return [Font]
|
27
|
+
attr_reader :font
|
28
|
+
|
29
|
+
# the child fill to be used in this style
|
30
|
+
# @return [Fill]
|
31
|
+
attr_reader :fill
|
32
|
+
|
33
|
+
# the border to be used in this style
|
34
|
+
# @return [Border]
|
35
|
+
attr_reader :border
|
36
|
+
|
37
|
+
# Creates a new Xf object
|
38
|
+
# @option options [Border] border
|
39
|
+
# @option options [NumFmt] numFmt
|
40
|
+
# @option options [Fill] fill
|
41
|
+
# @option options [Font] font
|
42
|
+
# @option options [CellAlignment] alignment
|
43
|
+
# @option options [CellProtection] protection
|
44
|
+
def initialize(options={})
|
45
|
+
options.each do |o|
|
46
|
+
next if o[1].nil?
|
47
|
+
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# @see Dxf#alignment
|
52
|
+
def alignment=(v) DataTypeValidator.validate "Dxf.alignment", CellAlignment, v; @alignment = v end
|
53
|
+
# @see protection
|
54
|
+
def protection=(v) DataTypeValidator.validate "Dxf.protection", CellProtection, v; @protection = v end
|
55
|
+
# @see numFmt
|
56
|
+
def numFmt=(v) DataTypeValidator.validate "Dxf.numFmt", NumFmt, v; @numFmt = v end
|
57
|
+
# @see font
|
58
|
+
def font=(v) DataTypeValidator.validate "Dxf.font", Font, v; @font = v end
|
59
|
+
# @see border
|
60
|
+
def border=(v) DataTypeValidator.validate "Dxf.border", Border, v; @border = v end
|
61
|
+
# @see fill
|
62
|
+
def fill=(v) DataTypeValidator.validate "Dxf.fill", Fill, v; @fill = v end
|
63
|
+
|
64
|
+
# Serializes the object
|
65
|
+
# @param [String] str
|
66
|
+
# @return [String]
|
67
|
+
def to_xml_string(str = '')
|
68
|
+
str << '<dxf>'
|
69
|
+
# Dxf elements have no attributes. All of the instance variables
|
70
|
+
# are child elements.
|
71
|
+
CHILD_ELEMENTS.each do |element|
|
72
|
+
self.send(element).to_xml_string(str) if self.send(element)
|
73
|
+
end
|
74
|
+
str << '</dxf>'
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|