axlsx 2.1.0.pre → 3.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +17 -20
- data/Rakefile +0 -1
- data/examples/conditional_formatting/example_conditional_formatting.rb +15 -0
- data/examples/example.rb +31 -1
- data/lib/axlsx.rb +9 -4
- data/lib/axlsx/drawing/area_chart.rb +99 -0
- data/lib/axlsx/drawing/area_series.rb +110 -0
- data/lib/axlsx/drawing/bar_chart.rb +143 -0
- data/lib/axlsx/drawing/chart.rb +8 -1
- data/lib/axlsx/drawing/d_lbls.rb +3 -3
- data/lib/axlsx/drawing/drawing.rb +3 -0
- data/lib/axlsx/drawing/line_series.rb +18 -1
- data/lib/axlsx/drawing/num_val.rb +3 -1
- data/lib/axlsx/drawing/one_cell_anchor.rb +2 -1
- data/lib/axlsx/drawing/pic.rb +24 -17
- data/lib/axlsx/drawing/scaling.rb +2 -2
- data/lib/axlsx/drawing/scatter_series.rb +16 -2
- data/lib/axlsx/drawing/str_val.rb +3 -1
- data/lib/axlsx/drawing/title.rb +19 -1
- data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
- data/lib/axlsx/drawing/view_3D.rb +2 -2
- data/lib/axlsx/package.rb +7 -16
- data/lib/axlsx/rels/relationships.rb +5 -2
- data/lib/axlsx/stylesheet/num_fmt.rb +9 -0
- data/lib/axlsx/stylesheet/styles.rb +1 -1
- data/lib/axlsx/util/constants.rb +8 -5
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/simple_typed_list.rb +1 -1
- data/lib/axlsx/util/validators.rb +14 -9
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/workbook.rb +19 -1
- data/lib/axlsx/workbook/workbook_view.rb +5 -3
- data/lib/axlsx/workbook/worksheet/cell.rb +26 -19
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +15 -5
- data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -0
- data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +2 -0
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +36 -13
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +4 -1
- data/lib/axlsx/workbook/worksheet/rich_text.rb +23 -3
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +28 -32
- data/lib/axlsx/workbook/worksheet/row.rb +7 -0
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +3 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +8 -51
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/test/axlsx.qcachegrind +2226 -0
- data/test/drawing/tc_area_chart.rb +39 -0
- data/test/drawing/tc_area_series.rb +71 -0
- data/test/drawing/tc_bar_chart.rb +71 -0
- data/test/drawing/tc_chart.rb +23 -10
- data/test/drawing/tc_drawing.rb +2 -2
- data/test/drawing/tc_line_series.rb +38 -5
- data/test/drawing/tc_pic.rb +11 -19
- data/test/drawing/tc_scatter_series.rb +16 -5
- data/test/drawing/tc_str_val.rb +9 -0
- data/test/drawing/tc_title.rb +5 -0
- data/test/stylesheet/tc_styles.rb +2 -2
- data/test/tc_axlsx.rb +31 -0
- data/test/tc_helper.rb +3 -1
- data/test/tc_package.rb +12 -0
- data/test/util/tc_mime_type_utils.rb +13 -0
- data/test/util/tc_simple_typed_list.rb +1 -1
- data/test/util/tc_validators.rb +34 -10
- data/test/workbook/tc_shared_strings_table.rb +16 -1
- data/test/workbook/tc_workbook.rb +22 -1
- data/test/workbook/worksheet/tc_cell.rb +53 -11
- data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
- data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
- data/test/workbook/worksheet/tc_rich_text_run.rb +11 -11
- data/test/workbook/worksheet/tc_row.rb +5 -0
- data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
- data/test/workbook/worksheet/tc_table.rb +2 -3
- data/test/workbook/worksheet/tc_worksheet.rb +53 -38
- metadata +72 -20
- data/examples/IMAGE1UP.JPEG +0 -0
- data/lib/axlsx/util/string.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ace95e053d44bf7ebbd97250359660526f4672d
|
4
|
+
data.tar.gz: fbbcb63a35a7c7b39a15895e6c7d6478ea32a5a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cce5eb9c776949ceb488f48d6014eeff6090203b90ca80dc43a553c5439f847a4885f698772eed72096a82049048ba9a26e7013a5e0de5a984fe7c7f6afe6cac
|
7
|
+
data.tar.gz: 2a882ec60dd5ddf6e96f662c69f00db4ce0516e1063797f3341e630549f17813796f868e00b8c7548531cf48c3f804c84759f5367e548ac466857273a9745702
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
---------
|
3
|
+
- **April.1.17**:3.0.0-pre
|
4
|
+
- Support for ruby versions limited to officially supported version
|
5
|
+
- Updates to dependency gems, especially nokogiri and ruby-zip
|
6
|
+
- Patch options parsing for two cell anchor
|
7
|
+
- Remove support for depreciated worksheet members
|
3
8
|
- **November.25.12**:1.3.4
|
4
9
|
- Support for headers and footers for worksheets
|
5
10
|
- bug fix: Properly escape hyperlink urls
|
data/README.md
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
Axlsx: Office Open XML Spreadsheet Generation
|
2
2
|
====================================
|
3
|
-
[![Build Status](https://secure.travis-ci.org/randym/axlsx.
|
3
|
+
[![Build Status](https://secure.travis-ci.org/randym/axlsx.svg?branch=master)](http://travis-ci.org/randym/axlsx/)
|
4
4
|
|
5
|
-
If you are using axlsx for
|
5
|
+
If you are using axlsx for commercial purposes, or just want to show your
|
6
6
|
appreciation for the gem, please don't hesitate to make a donation.
|
7
7
|
|
8
|
-
[![Click here to lend your support to: axlsx and make a donation at www.pledgie.com !](http://www.pledgie.com/campaigns/17814.png?skin_name=chrome)](http://www.pledgie.com/campaigns/17814)
|
9
|
-
|
10
8
|
**IRC**:[irc.freenode.net / #axlsx](irc://irc.freenode.net/axlsx)
|
11
9
|
|
12
10
|
**Git**:[http://github.com/randym/axlsx](http://github.com/randym/axlsx)
|
@@ -17,17 +15,17 @@ appreciation for the gem, please don't hesitate to make a donation.
|
|
17
15
|
|
18
16
|
**Author**: Randy Morgan
|
19
17
|
|
20
|
-
**Copyright**: 2011 -
|
18
|
+
**Copyright**: 2011 - 2017
|
21
19
|
|
22
20
|
**License**: MIT License
|
23
21
|
|
24
|
-
**Latest Version**:
|
22
|
+
**Latest Version**: 3.0.0
|
25
23
|
|
26
|
-
**Ruby Version**:
|
24
|
+
**Ruby Version**: 2.2.7, 2.3.4, 2.4.1
|
27
25
|
|
28
26
|
**JRuby Version**: 1.9 modes
|
29
27
|
|
30
|
-
**Rubinius Version**: rubinius
|
28
|
+
**Rubinius Version**: rubinius 3 * lower versions may run, this gem always tests against head.
|
31
29
|
|
32
30
|
**Release Date**: September 12th 2013
|
33
31
|
|
@@ -52,7 +50,7 @@ If you are working with ActiveAdmin see:
|
|
52
50
|
|
53
51
|
[activeadmin-axlsx](http://github.com/randym/activeadmin-axlsx)
|
54
52
|
|
55
|
-
It
|
53
|
+
It provides a plugin and dsl for generating downloadable reports.
|
56
54
|
|
57
55
|
The examples directory contains a number of more specific examples as
|
58
56
|
well.
|
@@ -153,7 +151,7 @@ There is much, much more you can do with this gem. If you get stuck, grab me on
|
|
153
151
|
|
154
152
|
This gem is 100% documented with YARD, an exceptional documentation library. To see documentation for this, and all the gems installed on your system use:
|
155
153
|
|
156
|
-
gem install yard
|
154
|
+
gem install yard kramdown
|
157
155
|
|
158
156
|
yard server -g
|
159
157
|
|
@@ -231,16 +229,15 @@ related to themes, which axlsx does not implement at this time.
|
|
231
229
|
- you must set 'use_shared_strings' to true. This is most
|
232
230
|
conveniently done just before rendering by calling Package.use_shared_strings = true prior to serialization.
|
233
231
|
|
234
|
-
```ruby
|
235
|
-
p = Axlsx::Package.new
|
236
|
-
p.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
|
237
|
-
|
238
|
-
|
239
|
-
end
|
240
|
-
p.use_shared_strings = true
|
241
|
-
p.serialize('simple.xlsx')
|
242
|
-
```
|
243
|
-
|
232
|
+
```ruby
|
233
|
+
p = Axlsx::Package.new
|
234
|
+
p.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
|
235
|
+
sheet.add_row ["First Column", "Second", "Third"]
|
236
|
+
sheet.add_row [1, 2, 3]
|
237
|
+
end
|
238
|
+
p.use_shared_strings = true
|
239
|
+
p.serialize('simple.xlsx')
|
240
|
+
```
|
244
241
|
- charts do not render
|
245
242
|
|
246
243
|
|
data/Rakefile
CHANGED
@@ -9,6 +9,7 @@ book = p.workbook
|
|
9
9
|
# define your regular styles
|
10
10
|
percent = book.styles.add_style(:format_code => "0.00%", :border => Axlsx::STYLE_THIN_BORDER)
|
11
11
|
money = book.styles.add_style(:format_code => '0,000', :border => Axlsx::STYLE_THIN_BORDER)
|
12
|
+
status = book.styles.add_style(:border => Axlsx::STYLE_THIN_BORDER)
|
12
13
|
|
13
14
|
# define the style for conditional formatting
|
14
15
|
profitable = book.styles.add_style( :fg_color => "428751", :type => :dxf )
|
@@ -71,4 +72,18 @@ book.add_worksheet(:name => "Icon Set") do |ws|
|
|
71
72
|
ws.add_conditional_formatting("B3:B100", { :type => :iconSet, :dxfId => profitable, :priority => 1, :icon_set => icon_set })
|
72
73
|
end
|
73
74
|
|
75
|
+
book.add_worksheet(:name => "Contains Text") do |ws|
|
76
|
+
ws.add_row ["Previous Year Quarterly Profits (JPY)"]
|
77
|
+
ws.add_row ["Quarter", "Profit", "% of Total", "Status"]
|
78
|
+
offset = 3
|
79
|
+
rows = 20
|
80
|
+
offset.upto(rows + offset) do |i|
|
81
|
+
ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})", (10000*((rows/2-i) * (rows/2-i))) > 100000 ? "PROFIT" : "LOSS"], :style=>[nil, money, percent, status]
|
82
|
+
end
|
83
|
+
|
84
|
+
# Apply conditional formatting to range D3:D100 in the worksheet
|
85
|
+
ws.add_conditional_formatting("D3:D100", { :type => :containsText, :operator => :equal, :text => "PROFIT", :dxfId => profitable, :priority => 1 })
|
86
|
+
ws.add_conditional_formatting("D3:D100", { :type => :containsText, :operator => :equal, :text => "LOSS", :dxfId => unprofitable, :priority => 1 })
|
87
|
+
end
|
88
|
+
|
74
89
|
p.serialize('example_conditional_formatting.xlsx')
|
data/examples/example.rb
CHANGED
@@ -51,6 +51,7 @@ examples << :no_autowidth
|
|
51
51
|
examples << :cached_formula
|
52
52
|
examples << :page_breaks
|
53
53
|
examples << :rich_text
|
54
|
+
examples << :tab_color
|
54
55
|
|
55
56
|
p = Axlsx::Package.new
|
56
57
|
wb = p.workbook
|
@@ -676,7 +677,7 @@ end
|
|
676
677
|
|
677
678
|
## Book Views
|
678
679
|
#
|
679
|
-
## Book views let you specify which sheet the show as active when the user opens the work book as well as a bunch of other
|
680
|
+
## Book views let you specify which sheet the show as active when the user opens the work book as well as a bunch of other
|
680
681
|
## tuning values for the UI @see Axlsx::WorkbookView
|
681
682
|
## ```ruby
|
682
683
|
if examples.include? :book_view
|
@@ -700,6 +701,7 @@ end
|
|
700
701
|
if examples.include? :conditional_formatting
|
701
702
|
percent = wb.styles.add_style(:format_code => "0.00%", :border => Axlsx::STYLE_THIN_BORDER)
|
702
703
|
money = wb.styles.add_style(:format_code => '0,000', :border => Axlsx::STYLE_THIN_BORDER)
|
704
|
+
status = wb.styles.add_style(:border => Axlsx::STYLE_THIN_BORDER)
|
703
705
|
|
704
706
|
# define the style for conditional formatting
|
705
707
|
profitable = wb.styles.add_style( :fg_color => "FF428751", :type => :dxf )
|
@@ -763,6 +765,19 @@ if examples.include? :conditional_formatting
|
|
763
765
|
icon_set = Axlsx::IconSet.new
|
764
766
|
sheet.add_conditional_formatting("B3:B100", { :type => :iconSet, :dxfId => profitable, :priority => 1, :icon_set => icon_set })
|
765
767
|
end
|
768
|
+
|
769
|
+
wb.add_worksheet(:name => "Contains Text") do |sheet|
|
770
|
+
sheet.add_row ["Previous Year Quarterly Profits (JPY)"]
|
771
|
+
sheet.add_row ["Quarter", "Profit", "% of Total", "Status"]
|
772
|
+
offset = 3
|
773
|
+
rows = 20
|
774
|
+
offset.upto(rows + offset) do |i|
|
775
|
+
sheet.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})", (10000*((rows/2-i) * (rows/2-i))) > 100000 ? "PROFIT" : "LOSS"], :style=>[nil, money, percent, status]
|
776
|
+
end
|
777
|
+
# Apply conditional formatting to range D3:D100 in the worksheet to match words.
|
778
|
+
sheet.add_conditional_formatting("D3:D100", { :type => :containsText, :operator => :equal, :text => "PROFIT", :dxfId => profitable, :priority => 1 })
|
779
|
+
sheet.add_conditional_formatting("D3:D100", { :type => :containsText, :operator => :equal, :text => "LOSS", :dxfId => unprofitable, :priority => 1 })
|
780
|
+
end
|
766
781
|
end
|
767
782
|
|
768
783
|
# Page Breaks
|
@@ -843,3 +858,18 @@ if examples.include? :rich_text
|
|
843
858
|
p.serialize 'rich_text.xlsx'
|
844
859
|
end
|
845
860
|
#```
|
861
|
+
|
862
|
+
##Change tab color of sheet
|
863
|
+
|
864
|
+
#```ruby
|
865
|
+
if examples.include? :tab_color
|
866
|
+
p = Axlsx::Package.new
|
867
|
+
p.use_shared_strings = true
|
868
|
+
wb = p.workbook
|
869
|
+
wb.add_worksheet(:name => "Change Tab Color") do |sheet|
|
870
|
+
sheet.add_row ["Check", "out", "the", "Tab Color", "below!"]
|
871
|
+
sheet.sheet_pr.tab_color = "FFFF6666"
|
872
|
+
end
|
873
|
+
p.serialize 'tab_color.xlsx'
|
874
|
+
end
|
875
|
+
##```
|
data/lib/axlsx.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'htmlentities'
|
3
3
|
require 'axlsx/version.rb'
|
4
|
+
require 'mimemagic'
|
4
5
|
|
5
6
|
require 'axlsx/util/simple_typed_list.rb'
|
6
7
|
require 'axlsx/util/constants.rb'
|
@@ -10,7 +11,7 @@ require 'axlsx/util/serialized_attributes'
|
|
10
11
|
require 'axlsx/util/options_parser'
|
11
12
|
# to be included with parsable intitites.
|
12
13
|
#require 'axlsx/util/parser.rb'
|
13
|
-
require 'axlsx/util/
|
14
|
+
require 'axlsx/util/mime_type_utils'
|
14
15
|
|
15
16
|
require 'axlsx/stylesheet/styles.rb'
|
16
17
|
|
@@ -134,10 +135,14 @@ module Axlsx
|
|
134
135
|
# @param [String] str The string to process
|
135
136
|
# @return [String]
|
136
137
|
def self.sanitize(str)
|
137
|
-
str.
|
138
|
-
|
138
|
+
if str.frozen?
|
139
|
+
str.delete(CONTROL_CHARS)
|
140
|
+
else
|
141
|
+
str.delete!(CONTROL_CHARS)
|
142
|
+
str
|
143
|
+
end
|
139
144
|
end
|
140
|
-
|
145
|
+
|
141
146
|
# If value is boolean return 1 or 0
|
142
147
|
# else return the value
|
143
148
|
# @param [Object] value The value to process
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
|
4
|
+
# The AreaChart is a two dimentional line chart (who would have guessed?) that you can add to your worksheet.
|
5
|
+
# @example Creating a chart
|
6
|
+
# # This example creates a line in a single sheet.
|
7
|
+
# require "rubygems" # if that is your preferred way to manage gems!
|
8
|
+
# require "axlsx"
|
9
|
+
#
|
10
|
+
# p = Axlsx::Package.new
|
11
|
+
# ws = p.workbook.add_worksheet
|
12
|
+
# ws.add_row ["This is a chart with no data in the sheet"]
|
13
|
+
#
|
14
|
+
# chart = ws.add_chart(Axlsx::AreaChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
|
15
|
+
# chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
|
16
|
+
#
|
17
|
+
# @see Worksheet#add_chart
|
18
|
+
# @see Worksheet#add_row
|
19
|
+
# @see Chart#add_series
|
20
|
+
# @see Series
|
21
|
+
# @see Package#serialize
|
22
|
+
class AreaChart < Chart
|
23
|
+
|
24
|
+
# the category axis
|
25
|
+
# @return [CatAxis]
|
26
|
+
def cat_axis
|
27
|
+
axes[:cat_axis]
|
28
|
+
end
|
29
|
+
alias :catAxis :cat_axis
|
30
|
+
|
31
|
+
# the category axis
|
32
|
+
# @return [ValAxis]
|
33
|
+
def val_axis
|
34
|
+
axes[:val_axis]
|
35
|
+
end
|
36
|
+
alias :valAxis :val_axis
|
37
|
+
|
38
|
+
# must be one of [:percentStacked, :clustered, :standard, :stacked]
|
39
|
+
# @return [Symbol]
|
40
|
+
attr_reader :grouping
|
41
|
+
|
42
|
+
# Creates a new line chart object
|
43
|
+
# @param [GraphicFrame] frame The workbook that owns this chart.
|
44
|
+
# @option options [Cell, String] title
|
45
|
+
# @option options [Boolean] show_legend
|
46
|
+
# @option options [Symbol] grouping
|
47
|
+
# @see Chart
|
48
|
+
def initialize(frame, options={})
|
49
|
+
@vary_colors = false
|
50
|
+
@grouping = :standard
|
51
|
+
super(frame, options)
|
52
|
+
@series_type = AreaSeries
|
53
|
+
@d_lbls = nil
|
54
|
+
end
|
55
|
+
|
56
|
+
# @see grouping
|
57
|
+
def grouping=(v)
|
58
|
+
RestrictionValidator.validate "AreaChart.grouping", [:percentStacked, :standard, :stacked], v
|
59
|
+
@grouping = v
|
60
|
+
end
|
61
|
+
|
62
|
+
# The node name to use in serialization. As AreaChart is used as the
|
63
|
+
# base class for Liine3DChart we need to be sure to serialize the
|
64
|
+
# chart based on the actual class type and not a fixed node name.
|
65
|
+
# @return [String]
|
66
|
+
def node_name
|
67
|
+
path = self.class.to_s
|
68
|
+
if i = path.rindex('::')
|
69
|
+
path = path[(i+2)..-1]
|
70
|
+
end
|
71
|
+
path[0] = path[0].chr.downcase
|
72
|
+
path
|
73
|
+
end
|
74
|
+
|
75
|
+
# Serializes the object
|
76
|
+
# @param [String] str
|
77
|
+
# @return [String]
|
78
|
+
def to_xml_string(str = '')
|
79
|
+
super(str) do
|
80
|
+
str << ("<c:" << node_name << ">")
|
81
|
+
str << ('<c:grouping val="' << grouping.to_s << '"/>')
|
82
|
+
str << ('<c:varyColors val="' << vary_colors.to_s << '"/>')
|
83
|
+
@series.each { |ser| ser.to_xml_string(str) }
|
84
|
+
@d_lbls.to_xml_string(str) if @d_lbls
|
85
|
+
yield if block_given?
|
86
|
+
axes.to_xml_string(str, :ids => true)
|
87
|
+
str << ("</c:" << node_name << ">")
|
88
|
+
axes.to_xml_string(str)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# The axes for this chart. AreaCharts have a category and value
|
93
|
+
# axis.
|
94
|
+
# @return [Axes]
|
95
|
+
def axes
|
96
|
+
@axes ||= Axes.new(:cat_axis => CatAxis, :val_axis => ValAxis)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
# A AreaSeries defines the title, data and labels for line charts
|
4
|
+
# @note The recommended way to manage series is to use Chart#add_series
|
5
|
+
# @see Worksheet#add_chart
|
6
|
+
# @see Chart#add_series
|
7
|
+
class AreaSeries < Series
|
8
|
+
|
9
|
+
# The data for this series.
|
10
|
+
# @return [ValAxisData]
|
11
|
+
attr_reader :data
|
12
|
+
|
13
|
+
# The labels for this series.
|
14
|
+
# @return [CatAxisData]
|
15
|
+
attr_reader :labels
|
16
|
+
|
17
|
+
# The fill color for this series.
|
18
|
+
# Red, green, and blue is expressed as sequence of hex digits, RRGGBB. A perceptual gamma of 2.2 is used.
|
19
|
+
# @return [String]
|
20
|
+
attr_reader :color
|
21
|
+
|
22
|
+
# show markers on values
|
23
|
+
# @return [Boolean]
|
24
|
+
attr_reader :show_marker
|
25
|
+
|
26
|
+
# custom marker symbol
|
27
|
+
# @return [String]
|
28
|
+
attr_reader :marker_symbol
|
29
|
+
|
30
|
+
# line smoothing on values
|
31
|
+
# @return [Boolean]
|
32
|
+
attr_reader :smooth
|
33
|
+
|
34
|
+
# Creates a new series
|
35
|
+
# @option options [Array, SimpleTypedList] data
|
36
|
+
# @option options [Array, SimpleTypedList] labels
|
37
|
+
# @param [Chart] chart
|
38
|
+
def initialize(chart, options={})
|
39
|
+
@show_marker = false
|
40
|
+
@marker_symbol = options[:marker_symbol] ? options[:marker_symbol] : :default
|
41
|
+
@smooth = false
|
42
|
+
@labels, @data = nil, nil
|
43
|
+
super(chart, options)
|
44
|
+
@labels = AxDataSource.new(:data => options[:labels]) unless options[:labels].nil?
|
45
|
+
@data = NumDataSource.new(options) unless options[:data].nil?
|
46
|
+
end
|
47
|
+
|
48
|
+
# @see color
|
49
|
+
def color=(v)
|
50
|
+
@color = v
|
51
|
+
end
|
52
|
+
|
53
|
+
# @see show_marker
|
54
|
+
def show_marker=(v)
|
55
|
+
Axlsx::validate_boolean(v)
|
56
|
+
@show_marker = v
|
57
|
+
end
|
58
|
+
|
59
|
+
# @see marker_symbol
|
60
|
+
def marker_symbol=(v)
|
61
|
+
Axlsx::validate_marker_symbol(v)
|
62
|
+
@marker_symbol = v
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see smooth
|
66
|
+
def smooth=(v)
|
67
|
+
Axlsx::validate_boolean(v)
|
68
|
+
@smooth = v
|
69
|
+
end
|
70
|
+
|
71
|
+
# Serializes the object
|
72
|
+
# @param [String] str
|
73
|
+
# @return [String]
|
74
|
+
def to_xml_string(str = '')
|
75
|
+
super(str) do
|
76
|
+
if color
|
77
|
+
str << '<c:spPr><a:solidFill>'
|
78
|
+
str << ('<a:srgbClr val="' << color << '"/>')
|
79
|
+
str << '</a:solidFill>'
|
80
|
+
str << '<a:ln w="28800">'
|
81
|
+
str << '<a:solidFill>'
|
82
|
+
str << ('<a:srgbClr val="' << color << '"/>')
|
83
|
+
str << '</a:solidFill>'
|
84
|
+
str << '</a:ln>'
|
85
|
+
str << '<a:round/>'
|
86
|
+
str << '</c:spPr>'
|
87
|
+
end
|
88
|
+
|
89
|
+
if !@show_marker
|
90
|
+
str << '<c:marker><c:symbol val="none"/></c:marker>'
|
91
|
+
elsif @marker_symbol != :default
|
92
|
+
str << '<c:marker><c:symbol val="' + @marker_symbol.to_s + '"/></c:marker>'
|
93
|
+
end
|
94
|
+
|
95
|
+
@labels.to_xml_string(str) unless @labels.nil?
|
96
|
+
@data.to_xml_string(str) unless @data.nil?
|
97
|
+
str << ('<c:smooth val="' << ((smooth) ? '1' : '0') << '"/>')
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
# assigns the data for this series
|
104
|
+
def data=(v) DataTypeValidator.validate "Series.data", [NumDataSource], v; @data = v; end
|
105
|
+
|
106
|
+
# assigns the labels for this series
|
107
|
+
def labels=(v) DataTypeValidator.validate "Series.labels", [AxDataSource], v; @labels = v; end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
|
4
|
+
# The BarChart is a three dimentional barchart (who would have guessed?) that you can add to your worksheet.
|
5
|
+
# @see Worksheet#add_chart
|
6
|
+
# @see Chart#add_series
|
7
|
+
# @see Package#serialize
|
8
|
+
# @see README for an example
|
9
|
+
class BarChart < Chart
|
10
|
+
|
11
|
+
# the category axis
|
12
|
+
# @return [CatAxis]
|
13
|
+
def cat_axis
|
14
|
+
axes[:cat_axis]
|
15
|
+
end
|
16
|
+
alias :catAxis :cat_axis
|
17
|
+
|
18
|
+
# the value axis
|
19
|
+
# @return [ValAxis]
|
20
|
+
def val_axis
|
21
|
+
axes[:val_axis]
|
22
|
+
end
|
23
|
+
alias :valAxis :val_axis
|
24
|
+
|
25
|
+
# The direction of the bars in the chart
|
26
|
+
# must be one of [:bar, :col]
|
27
|
+
# @return [Symbol]
|
28
|
+
def bar_dir
|
29
|
+
@bar_dir ||= :bar
|
30
|
+
end
|
31
|
+
alias :barDir :bar_dir
|
32
|
+
|
33
|
+
# space between bar or column clusters, as a percentage of the bar or column width.
|
34
|
+
# @return [String]
|
35
|
+
attr_reader :gap_depth
|
36
|
+
alias :gapDepth :gap_depth
|
37
|
+
|
38
|
+
# space between bar or column clusters, as a percentage of the bar or column width.
|
39
|
+
# @return [String]
|
40
|
+
def gap_width
|
41
|
+
@gap_width ||= 150
|
42
|
+
end
|
43
|
+
alias :gapWidth :gap_width
|
44
|
+
|
45
|
+
#grouping for a column, line, or area chart.
|
46
|
+
# must be one of [:percentStacked, :clustered, :standard, :stacked]
|
47
|
+
# @return [Symbol]
|
48
|
+
def grouping
|
49
|
+
@grouping ||= :clustered
|
50
|
+
end
|
51
|
+
|
52
|
+
# The shabe of the bars or columns
|
53
|
+
# must be one of [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax]
|
54
|
+
# @return [Symbol]
|
55
|
+
def shape
|
56
|
+
@shape ||= :box
|
57
|
+
end
|
58
|
+
|
59
|
+
# validation regex for gap amount percent
|
60
|
+
GAP_AMOUNT_PERCENT = /0*(([0-9])|([1-9][0-9])|([1-4][0-9][0-9])|500)%/
|
61
|
+
|
62
|
+
# Creates a new bar chart object
|
63
|
+
# @param [GraphicFrame] frame The workbook that owns this chart.
|
64
|
+
# @option options [Cell, String] title
|
65
|
+
# @option options [Boolean] show_legend
|
66
|
+
# @option options [Symbol] bar_dir
|
67
|
+
# @option options [Symbol] grouping
|
68
|
+
# @option options [String] gap_width
|
69
|
+
# @option options [String] gap_depth
|
70
|
+
# @option options [Symbol] shape
|
71
|
+
# @see Chart
|
72
|
+
def initialize(frame, options={})
|
73
|
+
@vary_colors = true
|
74
|
+
@gap_width, @gap_depth, @shape = nil, nil, nil
|
75
|
+
super(frame, options)
|
76
|
+
@series_type = BarSeries
|
77
|
+
@d_lbls = nil
|
78
|
+
end
|
79
|
+
|
80
|
+
# The direction of the bars in the chart
|
81
|
+
# must be one of [:bar, :col]
|
82
|
+
def bar_dir=(v)
|
83
|
+
RestrictionValidator.validate "BarChart.bar_dir", [:bar, :col], v
|
84
|
+
@bar_dir = v
|
85
|
+
end
|
86
|
+
alias :barDir= :bar_dir=
|
87
|
+
|
88
|
+
#grouping for a column, line, or area chart.
|
89
|
+
# must be one of [:percentStacked, :clustered, :standard, :stacked]
|
90
|
+
def grouping=(v)
|
91
|
+
RestrictionValidator.validate "BarChart.grouping", [:percentStacked, :clustered, :standard, :stacked], v
|
92
|
+
@grouping = v
|
93
|
+
end
|
94
|
+
|
95
|
+
# space between bar or column clusters, as a percentage of the bar or column width.
|
96
|
+
def gap_width=(v)
|
97
|
+
RegexValidator.validate "BarChart.gap_width", GAP_AMOUNT_PERCENT, v
|
98
|
+
@gap_width=(v)
|
99
|
+
end
|
100
|
+
alias :gapWidth= :gap_width=
|
101
|
+
|
102
|
+
# space between bar or column clusters, as a percentage of the bar or column width.
|
103
|
+
def gap_depth=(v)
|
104
|
+
RegexValidator.validate "BarChart.gap_didth", GAP_AMOUNT_PERCENT, v
|
105
|
+
@gap_depth=(v)
|
106
|
+
end
|
107
|
+
alias :gapDepth= :gap_depth=
|
108
|
+
|
109
|
+
# The shabe of the bars or columns
|
110
|
+
# must be one of [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax]
|
111
|
+
def shape=(v)
|
112
|
+
RestrictionValidator.validate "BarChart.shape", [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax], v
|
113
|
+
@shape = v
|
114
|
+
end
|
115
|
+
|
116
|
+
# Serializes the object
|
117
|
+
# @param [String] str
|
118
|
+
# @return [String]
|
119
|
+
def to_xml_string(str = '')
|
120
|
+
super(str) do
|
121
|
+
str << '<c:barChart>'
|
122
|
+
str << ('<c:barDir val="' << bar_dir.to_s << '"/>')
|
123
|
+
str << ('<c:grouping val="' << grouping.to_s << '"/>')
|
124
|
+
str << ('<c:varyColors val="' << vary_colors.to_s << '"/>')
|
125
|
+
@series.each { |ser| ser.to_xml_string(str) }
|
126
|
+
@d_lbls.to_xml_string(str) if @d_lbls
|
127
|
+
str << ('<c:gapWidth val="' << @gap_width.to_s << '"/>') unless @gap_width.nil?
|
128
|
+
str << ('<c:gapDepth val="' << @gap_depth.to_s << '"/>') unless @gap_depth.nil?
|
129
|
+
str << ('<c:shape val="' << @shape.to_s << '"/>') unless @shape.nil?
|
130
|
+
axes.to_xml_string(str, :ids => true)
|
131
|
+
str << '</c:barChart>'
|
132
|
+
axes.to_xml_string(str)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# A hash of axes used by this chart. Bar charts have a value and
|
137
|
+
# category axes specified via axes[:val_axes] and axes[:cat_axis]
|
138
|
+
# @return [Axes]
|
139
|
+
def axes
|
140
|
+
@axes ||= Axes.new(:cat_axis => CatAxis, :val_axis => ValAxis)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|