caxlsx 2.0.2 → 3.0.0
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 +41 -33
- data/Rakefile +9 -11
- data/examples/auto_filter.rb +10 -1
- data/examples/conditional_formatting/example_conditional_formatting.rb +18 -3
- data/examples/data_validation.rb +57 -40
- data/examples/example.rb +115 -7
- data/examples/merge_cells.rb +17 -0
- data/examples/no_grid_with_borders.rb +18 -0
- data/examples/pivot_test.rb +63 -0
- data/examples/split.rb +16 -0
- data/lib/axlsx.rb +34 -15
- data/lib/axlsx/content_type/abstract_content_type.rb +1 -1
- data/lib/axlsx/content_type/content_type.rb +1 -1
- data/lib/axlsx/doc_props/app.rb +1 -1
- data/lib/axlsx/doc_props/core.rb +5 -5
- data/lib/axlsx/drawing/area_chart.rb +99 -0
- data/lib/axlsx/drawing/area_series.rb +110 -0
- data/lib/axlsx/drawing/axes.rb +1 -1
- data/lib/axlsx/drawing/axis.rb +12 -9
- data/lib/axlsx/drawing/bar_3D_chart.rb +13 -13
- data/lib/axlsx/drawing/bar_chart.rb +143 -0
- data/lib/axlsx/drawing/bar_series.rb +9 -9
- data/lib/axlsx/drawing/bubble_chart.rb +59 -0
- data/lib/axlsx/drawing/bubble_series.rb +63 -0
- data/lib/axlsx/drawing/cat_axis.rb +5 -5
- data/lib/axlsx/drawing/chart.rb +52 -8
- data/lib/axlsx/drawing/d_lbls.rb +3 -3
- data/lib/axlsx/drawing/drawing.rb +6 -1
- data/lib/axlsx/drawing/graphic_frame.rb +3 -3
- data/lib/axlsx/drawing/hyperlink.rb +1 -3
- data/lib/axlsx/drawing/line_3D_chart.rb +2 -2
- data/lib/axlsx/drawing/line_chart.rb +10 -10
- data/lib/axlsx/drawing/line_series.rb +32 -3
- data/lib/axlsx/drawing/marker.rb +1 -1
- data/lib/axlsx/drawing/num_data.rb +4 -4
- data/lib/axlsx/drawing/num_data_source.rb +6 -6
- data/lib/axlsx/drawing/num_val.rb +3 -1
- data/lib/axlsx/drawing/one_cell_anchor.rb +3 -2
- data/lib/axlsx/drawing/pic.rb +25 -19
- data/lib/axlsx/drawing/picture_locking.rb +1 -3
- data/lib/axlsx/drawing/pie_3D_chart.rb +5 -6
- data/lib/axlsx/drawing/pie_series.rb +6 -6
- data/lib/axlsx/drawing/scaling.rb +6 -6
- data/lib/axlsx/drawing/scatter_chart.rb +10 -10
- data/lib/axlsx/drawing/scatter_series.rb +40 -7
- data/lib/axlsx/drawing/ser_axis.rb +2 -2
- data/lib/axlsx/drawing/series.rb +3 -3
- data/lib/axlsx/drawing/series_title.rb +2 -2
- data/lib/axlsx/drawing/str_data.rb +3 -3
- data/lib/axlsx/drawing/str_val.rb +3 -1
- data/lib/axlsx/drawing/title.rb +22 -4
- data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
- data/lib/axlsx/drawing/val_axis.rb +1 -1
- data/lib/axlsx/drawing/view_3D.rb +2 -2
- data/lib/axlsx/drawing/vml_drawing.rb +1 -1
- data/lib/axlsx/package.rb +33 -31
- data/lib/axlsx/rels/relationship.rb +1 -1
- data/lib/axlsx/rels/relationships.rb +7 -4
- data/lib/axlsx/stylesheet/border_pr.rb +2 -2
- data/lib/axlsx/stylesheet/cell_alignment.rb +1 -3
- data/lib/axlsx/stylesheet/cell_protection.rb +1 -3
- data/lib/axlsx/stylesheet/cell_style.rb +1 -3
- data/lib/axlsx/stylesheet/color.rb +1 -3
- data/lib/axlsx/stylesheet/font.rb +1 -1
- data/lib/axlsx/stylesheet/gradient_stop.rb +1 -1
- data/lib/axlsx/stylesheet/num_fmt.rb +10 -3
- data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
- data/lib/axlsx/stylesheet/styles.rb +7 -7
- data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
- data/lib/axlsx/util/accessors.rb +6 -6
- data/lib/axlsx/util/constants.rb +107 -99
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/options_parser.rb +2 -1
- data/lib/axlsx/util/parser.rb +4 -4
- data/lib/axlsx/util/serialized_attributes.rb +16 -6
- data/lib/axlsx/util/simple_typed_list.rb +28 -52
- data/lib/axlsx/util/storage.rb +4 -4
- data/lib/axlsx/util/validators.rb +29 -17
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/defined_name.rb +11 -12
- data/lib/axlsx/workbook/defined_names.rb +2 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +5 -5
- data/lib/axlsx/workbook/workbook.rb +36 -11
- data/lib/axlsx/workbook/workbook_view.rb +80 -0
- data/lib/axlsx/workbook/workbook_views.rb +22 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +2 -2
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +1 -3
- data/lib/axlsx/workbook/worksheet/break.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cell.rb +136 -74
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +63 -43
- data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cfvos.rb +4 -1
- data/lib/axlsx/workbook/worksheet/col.rb +7 -10
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
- data/lib/axlsx/workbook/worksheet/comment.rb +5 -6
- data/lib/axlsx/workbook/worksheet/comments.rb +9 -12
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +1 -1
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +1 -1
- data/lib/axlsx/workbook/worksheet/data_bar.rb +4 -6
- data/lib/axlsx/workbook/worksheet/data_validation.rb +6 -4
- data/lib/axlsx/workbook/worksheet/dimension.rb +2 -2
- data/lib/axlsx/workbook/worksheet/header_footer.rb +6 -8
- data/lib/axlsx/workbook/worksheet/icon_set.rb +3 -5
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +4 -2
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
- data/lib/axlsx/workbook/worksheet/page_margins.rb +1 -3
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -1
- data/lib/axlsx/workbook/worksheet/page_setup.rb +21 -23
- data/lib/axlsx/workbook/worksheet/pane.rb +1 -3
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +44 -28
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +4 -4
- data/lib/axlsx/workbook/worksheet/print_options.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_range.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -2
- data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
- data/lib/axlsx/workbook/worksheet/row.rb +40 -51
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/selection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/table.rb +6 -6
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +1 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +4 -1
- data/lib/axlsx/workbook/worksheet/worksheet.rb +64 -78
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
- data/test/drawing/tc_area_chart.rb +39 -0
- data/test/drawing/tc_area_series.rb +71 -0
- data/test/drawing/tc_axis.rb +27 -0
- data/test/drawing/tc_bar_chart.rb +71 -0
- data/test/drawing/tc_bubble_chart.rb +44 -0
- data/test/drawing/tc_bubble_series.rb +21 -0
- data/test/drawing/tc_chart.rb +23 -10
- data/test/drawing/tc_data_source.rb +6 -0
- data/test/drawing/tc_drawing.rb +2 -2
- data/test/drawing/tc_line_chart.rb +5 -5
- data/test/drawing/tc_line_series.rb +47 -6
- data/test/drawing/tc_pic.rb +11 -15
- data/test/drawing/tc_scatter_series.rb +36 -1
- 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 +2 -0
- data/test/tc_package.rb +19 -1
- data/test/util/tc_mime_type_utils.rb +13 -0
- data/test/util/tc_simple_typed_list.rb +2 -3
- data/test/util/tc_validators.rb +34 -10
- data/test/workbook/tc_defined_name.rb +12 -4
- data/test/workbook/tc_shared_strings_table.rb +16 -1
- data/test/workbook/tc_workbook.rb +38 -3
- data/test/workbook/tc_workbook_view.rb +50 -0
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +1 -1
- data/test/workbook/worksheet/tc_break.rb +1 -1
- data/test/workbook/worksheet/tc_cell.rb +76 -8
- data/test/workbook/worksheet/tc_col.rb +2 -2
- data/test/workbook/worksheet/tc_conditional_formatting.rb +2 -2
- data/test/workbook/worksheet/tc_data_bar.rb +1 -1
- data/test/workbook/worksheet/tc_data_validation.rb +11 -11
- data/test/workbook/worksheet/tc_header_footer.rb +2 -2
- data/test/workbook/worksheet/tc_icon_set.rb +1 -1
- data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
- data/test/workbook/worksheet/tc_page_setup.rb +3 -3
- data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
- data/test/workbook/worksheet/tc_print_options.rb +1 -1
- data/test/workbook/worksheet/tc_rich_text.rb +44 -0
- data/test/workbook/worksheet/tc_rich_text_run.rb +172 -0
- data/test/workbook/worksheet/tc_row.rb +7 -2
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +1 -1
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +4 -4
- data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
- data/test/workbook/worksheet/tc_sheet_protection.rb +5 -5
- data/test/workbook/worksheet/tc_sheet_view.rb +4 -4
- data/test/workbook/worksheet/tc_table.rb +2 -3
- data/test/workbook/worksheet/tc_worksheet.rb +99 -45
- metadata +89 -16
data/lib/axlsx/drawing/axes.rb
CHANGED
@@ -32,7 +32,7 @@ module Axlsx
|
|
32
32
|
if options[:ids]
|
33
33
|
# CatAxis must come first in the XML (for Microsoft Excel at least)
|
34
34
|
sorted = axes.sort_by { |name, axis| axis.kind_of?(CatAxis) ? 0 : 1 }
|
35
|
-
sorted.
|
35
|
+
sorted.each { |axis| str << ('<c:axId val="' << axis[1].id.to_s << '"/>') }
|
36
36
|
else
|
37
37
|
axes.each { |axis| axis[1].to_xml_string(str) }
|
38
38
|
end
|
data/lib/axlsx/drawing/axis.rb
CHANGED
@@ -150,10 +150,10 @@ module Axlsx
|
|
150
150
|
# @param [String] str
|
151
151
|
# @return [String]
|
152
152
|
def to_xml_string(str = '')
|
153
|
-
str << '<c:axId val="' << @id.to_s << '"/>'
|
153
|
+
str << ('<c:axId val="' << @id.to_s << '"/>')
|
154
154
|
@scaling.to_xml_string str
|
155
|
-
str << '<c:delete val="'<< @delete.to_s << '"/>'
|
156
|
-
str << '<c:axPos val="' << @ax_pos.to_s << '"/>'
|
155
|
+
str << ('<c:delete val="' << @delete.to_s << '"/>')
|
156
|
+
str << ('<c:axPos val="' << @ax_pos.to_s << '"/>')
|
157
157
|
str << '<c:majorGridlines>'
|
158
158
|
# TODO shape properties need to be extracted into a class
|
159
159
|
if gridlines == false
|
@@ -165,21 +165,24 @@ module Axlsx
|
|
165
165
|
end
|
166
166
|
str << '</c:majorGridlines>'
|
167
167
|
@title.to_xml_string(str) unless @title == nil
|
168
|
-
|
168
|
+
# Need to set sourceLinked to 0 if we're setting a format code on this row
|
169
|
+
# otherwise it will never take, as it will always prefer the 'General' formatting
|
170
|
+
# of the cells themselves
|
171
|
+
str << ('<c:numFmt formatCode="' << @format_code << '" sourceLinked="' << (@format_code.eql?('General') ? '1' : '0') << '"/>')
|
169
172
|
str << '<c:majorTickMark val="none"/>'
|
170
173
|
str << '<c:minorTickMark val="none"/>'
|
171
|
-
str << '<c:tickLblPos val="' << @tick_lbl_pos.to_s << '"/>'
|
174
|
+
str << ('<c:tickLblPos val="' << @tick_lbl_pos.to_s << '"/>')
|
172
175
|
# TODO - this is also being used for series colors
|
173
176
|
# time to extract this into a class spPr - Shape Properties
|
174
177
|
if @color
|
175
178
|
str << '<c:spPr><a:ln><a:solidFill>'
|
176
|
-
str << '<a:srgbClr val="' << @color << '"/>'
|
179
|
+
str << ('<a:srgbClr val="' << @color << '"/>')
|
177
180
|
str << '</a:solidFill></a:ln></c:spPr>'
|
178
181
|
end
|
179
182
|
# some potential value in implementing this in full. Very detailed!
|
180
|
-
str << '<c:txPr><a:bodyPr rot="' << @label_rotation.to_s << '"/><a:lstStyle/><a:p><a:pPr><a:defRPr/></a:pPr><a:endParaRPr/></a:p></c:txPr>'
|
181
|
-
str << '<c:crossAx val="' << @cross_axis.id.to_s << '"/>'
|
182
|
-
str << '<c:crosses val="' << @crosses.to_s << '"/>'
|
183
|
+
str << ('<c:txPr><a:bodyPr rot="' << @label_rotation.to_s << '"/><a:lstStyle/><a:p><a:pPr><a:defRPr/></a:pPr><a:endParaRPr/></a:p></c:txPr>')
|
184
|
+
str << ('<c:crossAx val="' << @cross_axis.id.to_s << '"/>')
|
185
|
+
str << ('<c:crosses val="' << @crosses.to_s << '"/>')
|
183
186
|
end
|
184
187
|
|
185
188
|
end
|
@@ -125,19 +125,19 @@ module Axlsx
|
|
125
125
|
# @param [String] str
|
126
126
|
# @return [String]
|
127
127
|
def to_xml_string(str = '')
|
128
|
-
super(str) do
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
@series.each { |ser| ser.to_xml_string(
|
134
|
-
@d_lbls.to_xml_string(
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
axes.to_xml_string(
|
139
|
-
|
140
|
-
axes.to_xml_string(
|
128
|
+
super(str) do
|
129
|
+
str << '<c:bar3DChart>'
|
130
|
+
str << ('<c:barDir val="' << bar_dir.to_s << '"/>')
|
131
|
+
str << ('<c:grouping val="' << grouping.to_s << '"/>')
|
132
|
+
str << ('<c:varyColors val="' << vary_colors.to_s << '"/>')
|
133
|
+
@series.each { |ser| ser.to_xml_string(str) }
|
134
|
+
@d_lbls.to_xml_string(str) if @d_lbls
|
135
|
+
str << ('<c:gapWidth val="' << @gap_width.to_s << '"/>') unless @gap_width.nil?
|
136
|
+
str << ('<c:gapDepth val="' << @gap_depth.to_s << '"/>') unless @gap_depth.nil?
|
137
|
+
str << ('<c:shape val="' << @shape.to_s << '"/>') unless @shape.nil?
|
138
|
+
axes.to_xml_string(str, :ids => true)
|
139
|
+
str << '</c:bar3DChart>'
|
140
|
+
axes.to_xml_string(str)
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
@@ -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
|
@@ -52,20 +52,20 @@ module Axlsx
|
|
52
52
|
# @param [String] str
|
53
53
|
# @return [String]
|
54
54
|
def to_xml_string(str = '')
|
55
|
-
super(str) do
|
55
|
+
super(str) do
|
56
56
|
|
57
57
|
colors.each_with_index do |c, index|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
58
|
+
str << '<c:dPt>'
|
59
|
+
str << ('<c:idx val="' << index.to_s << '"/>')
|
60
|
+
str << '<c:spPr><a:solidFill>'
|
61
|
+
str << ('<a:srgbClr val="' << c << '"/>')
|
62
|
+
str << '</a:solidFill></c:spPr></c:dPt>'
|
63
63
|
end
|
64
64
|
|
65
|
-
@labels.to_xml_string(
|
66
|
-
@data.to_xml_string(
|
65
|
+
@labels.to_xml_string(str) unless @labels.nil?
|
66
|
+
@data.to_xml_string(str) unless @data.nil?
|
67
67
|
# this is actually only required for shapes other than box
|
68
|
-
|
68
|
+
str << ('<c:shape val="' << shape.to_s << '"></c:shape>')
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
|
4
|
+
# The BubbleChart allows you to insert a bubble chart into your worksheet
|
5
|
+
# @see Worksheet#add_chart
|
6
|
+
# @see Chart#add_series
|
7
|
+
# @see README for an example
|
8
|
+
class BubbleChart < Chart
|
9
|
+
|
10
|
+
include Axlsx::OptionsParser
|
11
|
+
|
12
|
+
# the x value axis
|
13
|
+
# @return [ValAxis]
|
14
|
+
def x_val_axis
|
15
|
+
axes[:x_val_axis]
|
16
|
+
end
|
17
|
+
alias :xValAxis :x_val_axis
|
18
|
+
|
19
|
+
# the y value axis
|
20
|
+
# @return [ValAxis]
|
21
|
+
def y_val_axis
|
22
|
+
axes[:y_val_axis]
|
23
|
+
end
|
24
|
+
alias :yValAxis :y_val_axis
|
25
|
+
|
26
|
+
# Creates a new bubble chart
|
27
|
+
def initialize(frame, options={})
|
28
|
+
@vary_colors = 0
|
29
|
+
|
30
|
+
super(frame, options)
|
31
|
+
@series_type = BubbleSeries
|
32
|
+
@d_lbls = nil
|
33
|
+
parse_options options
|
34
|
+
end
|
35
|
+
|
36
|
+
# Serializes the object
|
37
|
+
# @param [String] str
|
38
|
+
# @return [String]
|
39
|
+
def to_xml_string(str = '')
|
40
|
+
super(str) do
|
41
|
+
str << '<c:bubbleChart>'
|
42
|
+
str << ('<c:varyColors val="' << vary_colors.to_s << '"/>')
|
43
|
+
@series.each { |ser| ser.to_xml_string(str) }
|
44
|
+
d_lbls.to_xml_string(str) if @d_lbls
|
45
|
+
axes.to_xml_string(str, :ids => true)
|
46
|
+
str << '</c:bubbleChart>'
|
47
|
+
axes.to_xml_string(str)
|
48
|
+
end
|
49
|
+
str
|
50
|
+
end
|
51
|
+
|
52
|
+
# The axes for the bubble chart. BubbleChart has an x_val_axis and
|
53
|
+
# a y_val_axis
|
54
|
+
# @return [Axes]
|
55
|
+
def axes
|
56
|
+
@axes ||= Axes.new(:x_val_axis => ValAxis, :y_val_axis => ValAxis)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
|
4
|
+
# A BubbleSeries defines the x/y position and bubble size of data in the chart
|
5
|
+
# @note The recommended way to manage series is to use Chart#add_series
|
6
|
+
# @see Worksheet#add_chart
|
7
|
+
# @see Chart#add_series
|
8
|
+
# @see examples/example.rb
|
9
|
+
class BubbleSeries < Series
|
10
|
+
|
11
|
+
# The x data for this series.
|
12
|
+
# @return [AxDataSource]
|
13
|
+
attr_reader :xData
|
14
|
+
|
15
|
+
# The y data for this series.
|
16
|
+
# @return [NumDataSource]
|
17
|
+
attr_reader :yData
|
18
|
+
|
19
|
+
# The bubble size for this series.
|
20
|
+
# @return [NumDataSource]
|
21
|
+
attr_reader :bubbleSize
|
22
|
+
|
23
|
+
# The fill color for this series.
|
24
|
+
# Red, green, and blue is expressed as sequence of hex digits, RRGGBB. A perceptual gamma of 2.2 is used.
|
25
|
+
# @return [String]
|
26
|
+
attr_reader :color
|
27
|
+
|
28
|
+
# Creates a new BubbleSeries
|
29
|
+
def initialize(chart, options={})
|
30
|
+
@xData, @yData, @bubbleSize = nil
|
31
|
+
super(chart, options)
|
32
|
+
@xData = AxDataSource.new(:tag_name => :xVal, :data => options[:xData]) unless options[:xData].nil?
|
33
|
+
@yData = NumDataSource.new({:tag_name => :yVal, :data => options[:yData]}) unless options[:yData].nil?
|
34
|
+
@bubbleSize = NumDataSource.new({:tag_name => :bubbleSize, :data => options[:bubbleSize]}) unless options[:bubbleSize].nil?
|
35
|
+
end
|
36
|
+
|
37
|
+
# @see color
|
38
|
+
def color=(v)
|
39
|
+
@color = v
|
40
|
+
end
|
41
|
+
|
42
|
+
# Serializes the object
|
43
|
+
# @param [String] str
|
44
|
+
# @return [String]
|
45
|
+
def to_xml_string(str = '')
|
46
|
+
super(str) do
|
47
|
+
# needs to override the super color here to push in ln/and something else!
|
48
|
+
if color
|
49
|
+
str << '<c:spPr><a:solidFill>'
|
50
|
+
str << ('<a:srgbClr val="' << color << '"/>')
|
51
|
+
str << '</a:solidFill>'
|
52
|
+
str << '<a:ln><a:solidFill>'
|
53
|
+
str << ('<a:srgbClr val="' << color << '"/></a:solidFill></a:ln>')
|
54
|
+
str << '</c:spPr>'
|
55
|
+
end
|
56
|
+
@xData.to_xml_string(str) unless @xData.nil?
|
57
|
+
@yData.to_xml_string(str) unless @yData.nil?
|
58
|
+
@bubbleSize.to_xml_string(str) unless @bubbleSize.nil?
|
59
|
+
end
|
60
|
+
str
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -71,11 +71,11 @@ module Axlsx
|
|
71
71
|
def to_xml_string(str = '')
|
72
72
|
str << '<c:catAx>'
|
73
73
|
super(str)
|
74
|
-
str << '<c:auto val="' << @auto.to_s << '"/>'
|
75
|
-
str << '<c:lblAlgn val="' << @lbl_algn.to_s << '"/>'
|
76
|
-
str << '<c:lblOffset val="' << @lbl_offset.to_i.to_s << '"/>'
|
77
|
-
str << '<c:tickLblSkip val="' << @tick_lbl_skip.to_s << '"/>'
|
78
|
-
str << '<c:tickMarkSkip val="' << @tick_mark_skip.to_s << '"/>'
|
74
|
+
str << ('<c:auto val="' << @auto.to_s << '"/>')
|
75
|
+
str << ('<c:lblAlgn val="' << @lbl_algn.to_s << '"/>')
|
76
|
+
str << ('<c:lblOffset val="' << @lbl_offset.to_i.to_s << '"/>')
|
77
|
+
str << ('<c:tickLblSkip val="' << @tick_lbl_skip.to_s << '"/>')
|
78
|
+
str << ('<c:tickMarkSkip val="' << @tick_mark_skip.to_s << '"/>')
|
79
79
|
str << '</c:catAx>'
|
80
80
|
end
|
81
81
|
|
data/lib/axlsx/drawing/chart.rb
CHANGED
@@ -11,6 +11,7 @@ module Axlsx
|
|
11
11
|
# @param [GraphicalFrame] frame The frame that holds this chart.
|
12
12
|
# @option options [Cell, String] title
|
13
13
|
# @option options [Boolean] show_legend
|
14
|
+
# @option options [Symbol] legend_position
|
14
15
|
# @option options [Array|String|Cell] start_at The X, Y coordinates defining the top left corner of the chart.
|
15
16
|
# @option options [Array|String|Cell] end_at The X, Y coordinates defining the bottom right corner of the chart.
|
16
17
|
def initialize(frame, options={})
|
@@ -20,9 +21,11 @@ module Axlsx
|
|
20
21
|
@graphic_frame.anchor.drawing.worksheet.workbook.charts << self
|
21
22
|
@series = SimpleTypedList.new Series
|
22
23
|
@show_legend = true
|
24
|
+
@legend_position = :r
|
23
25
|
@display_blanks_as = :gap
|
24
26
|
@series_type = Series
|
25
27
|
@title = Title.new
|
28
|
+
@bg_color = nil
|
26
29
|
parse_options options
|
27
30
|
start_at(*options[:start_at]) if options[:start_at]
|
28
31
|
end_at(*options[:end_at]) if options[:end_at]
|
@@ -53,7 +56,7 @@ module Axlsx
|
|
53
56
|
# Indicates that colors should be varied by datum
|
54
57
|
# @return [Boolean]
|
55
58
|
attr_reader :vary_colors
|
56
|
-
|
59
|
+
|
57
60
|
# Configures the vary_colors options for this chart
|
58
61
|
# @param [Boolean] v The value to set
|
59
62
|
def vary_colors=(v) Axlsx::validate_boolean(v); @vary_colors = v; end
|
@@ -71,6 +74,17 @@ module Axlsx
|
|
71
74
|
# @return [Boolean]
|
72
75
|
attr_reader :show_legend
|
73
76
|
|
77
|
+
# Set the location of the chart's legend
|
78
|
+
# @return [Symbol] The position of this legend
|
79
|
+
# @note
|
80
|
+
# The following are allowed
|
81
|
+
# :b
|
82
|
+
# :l
|
83
|
+
# :r
|
84
|
+
# :t
|
85
|
+
# :tr
|
86
|
+
attr_reader :legend_position
|
87
|
+
|
74
88
|
# How to display blank values
|
75
89
|
# Options are
|
76
90
|
# * gap: Display nothing
|
@@ -80,6 +94,10 @@ module Axlsx
|
|
80
94
|
# Default :gap (although this really should vary by chart type and grouping)
|
81
95
|
attr_reader :display_blanks_as
|
82
96
|
|
97
|
+
# Background color for the chart
|
98
|
+
# @return [String]
|
99
|
+
attr_reader :bg_color
|
100
|
+
|
83
101
|
# The relationship object for this chart.
|
84
102
|
# @return [Relationship]
|
85
103
|
def relationship
|
@@ -110,6 +128,13 @@ module Axlsx
|
|
110
128
|
end
|
111
129
|
end
|
112
130
|
|
131
|
+
# The size of the Title object of the chart.
|
132
|
+
# @param [String] v The size for the title object
|
133
|
+
# @see Title
|
134
|
+
def title_size=(v)
|
135
|
+
@title.text_size = v unless v.to_s.empty?
|
136
|
+
end
|
137
|
+
|
113
138
|
# Show the legend in the chart
|
114
139
|
# @param [Boolean] v
|
115
140
|
# @return [Boolean]
|
@@ -126,6 +151,9 @@ module Axlsx
|
|
126
151
|
# @param [Integer] v must be between 1 and 48
|
127
152
|
def style=(v) DataTypeValidator.validate "Chart.style", Integer, v, lambda { |arg| arg >= 1 && arg <= 48 }; @style = v; end
|
128
153
|
|
154
|
+
# @see legend_position
|
155
|
+
def legend_position=(v) RestrictionValidator.validate "Chart.legend_position", [:b, :l, :r, :t, :tr], v; @legend_position = v; end
|
156
|
+
|
129
157
|
# backwards compatibility to allow chart.to and chart.from access to anchor markers
|
130
158
|
# @note This will be disconinued in version 2.0.0. Please use the end_at method
|
131
159
|
def to
|
@@ -146,36 +174,52 @@ module Axlsx
|
|
146
174
|
@series.last
|
147
175
|
end
|
148
176
|
|
177
|
+
# Assigns a background color to chart area
|
178
|
+
def bg_color=(v)
|
179
|
+
DataTypeValidator.validate(:color, Color, Color.new(:rgb => v))
|
180
|
+
@bg_color = v
|
181
|
+
end
|
182
|
+
|
149
183
|
# Serializes the object
|
150
184
|
# @param [String] str
|
151
185
|
# @return [String]
|
152
186
|
def to_xml_string(str = '')
|
153
187
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
154
|
-
str << '<c:chartSpace xmlns:c="' << XML_NS_C << '" xmlns:a="' << XML_NS_A << '" xmlns:r="' << XML_NS_R << '">'
|
155
|
-
str << '<c:date1904 val="' << Axlsx::Workbook.date1904.to_s << '"/>'
|
156
|
-
str << '<c:style val="' << style.to_s << '"/>'
|
188
|
+
str << ('<c:chartSpace xmlns:c="' << XML_NS_C << '" xmlns:a="' << XML_NS_A << '" xmlns:r="' << XML_NS_R << '">')
|
189
|
+
str << ('<c:date1904 val="' << Axlsx::Workbook.date1904.to_s << '"/>')
|
190
|
+
str << ('<c:style val="' << style.to_s << '"/>')
|
157
191
|
str << '<c:chart>'
|
158
192
|
@title.to_xml_string str
|
159
|
-
str << '<c:autoTitleDeleted val="' << (@title == nil).to_s << '"/>'
|
193
|
+
str << ('<c:autoTitleDeleted val="' << (@title == nil).to_s << '"/>')
|
160
194
|
@view_3D.to_xml_string(str) if @view_3D
|
161
195
|
str << '<c:floor><c:thickness val="0"/></c:floor>'
|
162
196
|
str << '<c:sideWall><c:thickness val="0"/></c:sideWall>'
|
163
197
|
str << '<c:backWall><c:thickness val="0"/></c:backWall>'
|
164
198
|
str << '<c:plotArea>'
|
165
199
|
str << '<c:layout/>'
|
166
|
-
yield
|
200
|
+
yield if block_given?
|
167
201
|
str << '</c:plotArea>'
|
168
202
|
if @show_legend
|
169
203
|
str << '<c:legend>'
|
170
|
-
str << '<c:legendPos val="
|
204
|
+
str << ('<c:legendPos val="' << @legend_position.to_s << '"/>')
|
171
205
|
str << '<c:layout/>'
|
172
206
|
str << '<c:overlay val="0"/>'
|
173
207
|
str << '</c:legend>'
|
174
208
|
end
|
175
209
|
str << '<c:plotVisOnly val="1"/>'
|
176
|
-
str << '<c:dispBlanksAs val="' << display_blanks_as.to_s << '"/>'
|
210
|
+
str << ('<c:dispBlanksAs val="' << display_blanks_as.to_s << '"/>')
|
177
211
|
str << '<c:showDLblsOverMax val="1"/>'
|
178
212
|
str << '</c:chart>'
|
213
|
+
if bg_color
|
214
|
+
str << '<c:spPr>'
|
215
|
+
str << '<a:solidFill>'
|
216
|
+
str << '<a:srgbClr val="' << bg_color << '"/>'
|
217
|
+
str << '</a:solidFill>'
|
218
|
+
str << '<a:ln>'
|
219
|
+
str << '<a:noFill/>'
|
220
|
+
str << '</a:ln>'
|
221
|
+
str << '</c:spPr>'
|
222
|
+
end
|
179
223
|
str << '<c:printSettings>'
|
180
224
|
str << '<c:headerFooter/>'
|
181
225
|
str << '<c:pageMargins b="1.0" l="0.75" r="0.75" t="1.0" header="0.5" footer="0.5"/>'
|