caxlsx 2.0.2 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +125 -30
- data/README.md +65 -151
- data/Rakefile +9 -11
- data/examples/{image1.jpeg → assets/image1.jpeg} +0 -0
- data/examples/generate.rb +15 -0
- data/lib/axlsx.rb +35 -17
- 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 +12 -14
- 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 +4 -4
- 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 +4 -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 +23 -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 +58 -47
- data/lib/axlsx/rels/relationship.rb +27 -26
- 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 +11 -3
- 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 +108 -99
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/options_parser.rb +2 -1
- 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 +31 -19
- data/lib/axlsx/util/zip_command.rb +73 -0
- 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 -20
- 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 +164 -75
- 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 +14 -13
- 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 +8 -6
- 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 +42 -52
- 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 +76 -81
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
- data/lib/caxlsx.rb +2 -0
- 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 +4 -4
- data/test/drawing/tc_hyperlink.rb +1 -1
- data/test/drawing/tc_line_chart.rb +5 -5
- data/test/drawing/tc_line_series.rb +47 -6
- data/test/drawing/tc_one_cell_anchor.rb +1 -1
- data/test/drawing/tc_pic.rb +11 -15
- data/test/drawing/tc_pie_series.rb +2 -1
- data/test/drawing/tc_scatter_series.rb +36 -1
- data/test/drawing/tc_series_title.rb +21 -0
- data/test/drawing/tc_str_val.rb +9 -0
- data/test/drawing/tc_title.rb +21 -0
- data/test/fixtures/image1.gif +0 -0
- data/test/fixtures/image1.jpeg +0 -0
- data/test/fixtures/image1.jpg +0 -0
- data/test/fixtures/image1.png +0 -0
- data/test/fixtures/image1_fake.jpg +0 -0
- data/test/rels/tc_relationship.rb +8 -0
- data/test/stylesheet/tc_font.rb +14 -2
- data/test/stylesheet/tc_styles.rb +29 -3
- data/test/tc_axlsx.rb +37 -0
- data/test/tc_helper.rb +2 -0
- data/test/tc_package.rb +50 -13
- 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 +35 -11
- 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 +143 -9
- data/test/workbook/worksheet/tc_col.rb +18 -3
- 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 +173 -0
- data/test/workbook/worksheet/tc_row.rb +24 -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 +123 -60
- metadata +180 -128
- data/examples/2010_comments.rb +0 -17
- data/examples/anchor_swapping.rb +0 -28
- data/examples/auto_filter.rb +0 -16
- data/examples/basic_charts.rb +0 -58
- data/examples/chart_colors.rb +0 -88
- data/examples/colored_links.rb +0 -59
- data/examples/conditional_formatting/example_conditional_formatting.rb +0 -74
- data/examples/conditional_formatting/getting_barred.rb +0 -37
- data/examples/conditional_formatting/hitting_the_high_notes.rb +0 -37
- data/examples/conditional_formatting/scaled_colors.rb +0 -39
- data/examples/conditional_formatting/stop_and_go.rb +0 -37
- data/examples/data_validation.rb +0 -50
- data/examples/example.rb +0 -777
- data/examples/extractive.rb +0 -45
- data/examples/ios_preview.rb +0 -14
- data/examples/page_setup.rb +0 -11
- data/examples/pivot_table.rb +0 -39
- data/examples/sheet_protection.rb +0 -10
- data/examples/skydrive/real_example.rb +0 -63
- data/examples/styles.rb +0 -66
- data/examples/underline.rb +0 -13
- data/examples/wrap_text.rb +0 -21
- data/lib/axlsx/util/parser.rb +0 -44
@@ -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 two dimentional barchart 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 shape 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 shape 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
|
@@ -15,9 +15,8 @@ module Axlsx
|
|
15
15
|
# @return [Array, SimpleTypedList]
|
16
16
|
attr_reader :labels
|
17
17
|
|
18
|
-
# The
|
19
|
-
# must be one of
|
20
|
-
# @return [Symbol]
|
18
|
+
# The shape of the bars or columns
|
19
|
+
# @return [Symbol] must be one of [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax]
|
21
20
|
attr_reader :shape
|
22
21
|
|
23
22
|
# An array of rgb colors to apply to your bar chart.
|
@@ -41,8 +40,7 @@ module Axlsx
|
|
41
40
|
# @see colors
|
42
41
|
def colors=(v) DataTypeValidator.validate "BarSeries.colors", [Array], v; @colors = v end
|
43
42
|
|
44
|
-
#
|
45
|
-
# must be one of [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax]
|
43
|
+
# @see shape
|
46
44
|
def shape=(v)
|
47
45
|
RestrictionValidator.validate "BarSeries.shape", [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax], v
|
48
46
|
@shape = v
|
@@ -52,20 +50,20 @@ module Axlsx
|
|
52
50
|
# @param [String] str
|
53
51
|
# @return [String]
|
54
52
|
def to_xml_string(str = '')
|
55
|
-
super(str) do
|
53
|
+
super(str) do
|
56
54
|
|
57
55
|
colors.each_with_index do |c, index|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
56
|
+
str << '<c:dPt>'
|
57
|
+
str << ('<c:idx val="' << index.to_s << '"/>')
|
58
|
+
str << '<c:spPr><a:solidFill>'
|
59
|
+
str << ('<a:srgbClr val="' << c << '"/>')
|
60
|
+
str << '</a:solidFill></c:spPr></c:dPt>'
|
63
61
|
end
|
64
62
|
|
65
|
-
@labels.to_xml_string(
|
66
|
-
@data.to_xml_string(
|
63
|
+
@labels.to_xml_string(str) unless @labels.nil?
|
64
|
+
@data.to_xml_string(str) unless @data.nil?
|
67
65
|
# this is actually only required for shapes other than box
|
68
|
-
|
66
|
+
str << ('<c:shape val="' << shape.to_s << '"></c:shape>')
|
69
67
|
end
|
70
68
|
end
|
71
69
|
|
@@ -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"/>'
|