caxlsx 2.0.2 → 3.0.4
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.
- 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"/>'
|