caxlsx 3.4.1 → 4.1.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 +24 -1
- data/README.md +9 -11
- data/Rakefile +7 -5
- data/examples/generate.rb +3 -1
- data/lib/axlsx/content_type/abstract_content_type.rb +12 -4
- data/lib/axlsx/content_type/content_type.rb +8 -6
- data/lib/axlsx/content_type/default.rb +7 -2
- data/lib/axlsx/content_type/override.rb +7 -2
- data/lib/axlsx/doc_props/app.rb +95 -26
- data/lib/axlsx/doc_props/core.rb +8 -6
- data/lib/axlsx/drawing/area_chart.rb +10 -8
- data/lib/axlsx/drawing/area_series.rb +20 -12
- data/lib/axlsx/drawing/ax_data_source.rb +2 -0
- data/lib/axlsx/drawing/axes.rb +6 -4
- data/lib/axlsx/drawing/axis.rb +42 -22
- data/lib/axlsx/drawing/bar_3D_chart.rb +14 -12
- data/lib/axlsx/drawing/bar_chart.rb +13 -11
- data/lib/axlsx/drawing/bar_series.rb +20 -9
- data/lib/axlsx/drawing/bubble_chart.rb +6 -4
- data/lib/axlsx/drawing/bubble_series.rb +8 -6
- data/lib/axlsx/drawing/cat_axis.rb +29 -12
- data/lib/axlsx/drawing/chart.rb +46 -20
- data/lib/axlsx/drawing/d_lbls.rb +10 -8
- data/lib/axlsx/drawing/drawing.rb +59 -56
- data/lib/axlsx/drawing/graphic_frame.rb +6 -4
- data/lib/axlsx/drawing/hyperlink.rb +19 -8
- data/lib/axlsx/drawing/line_3D_chart.rb +7 -5
- data/lib/axlsx/drawing/line_chart.rb +10 -8
- data/lib/axlsx/drawing/line_series.rb +20 -12
- data/lib/axlsx/drawing/marker.rb +24 -7
- data/lib/axlsx/drawing/num_data.rb +9 -7
- data/lib/axlsx/drawing/num_data_source.rb +9 -7
- data/lib/axlsx/drawing/num_val.rb +7 -5
- data/lib/axlsx/drawing/one_cell_anchor.rb +13 -5
- data/lib/axlsx/drawing/pic.rb +26 -15
- data/lib/axlsx/drawing/picture_locking.rb +3 -1
- data/lib/axlsx/drawing/pie_3D_chart.rb +6 -4
- data/lib/axlsx/drawing/pie_chart.rb +36 -0
- data/lib/axlsx/drawing/pie_series.rb +23 -9
- data/lib/axlsx/drawing/scaling.rb +25 -9
- data/lib/axlsx/drawing/scatter_chart.rb +7 -5
- data/lib/axlsx/drawing/scatter_series.rb +14 -12
- data/lib/axlsx/drawing/ser_axis.rb +13 -5
- data/lib/axlsx/drawing/series.rb +13 -5
- data/lib/axlsx/drawing/series_title.rb +6 -4
- data/lib/axlsx/drawing/str_data.rb +7 -5
- data/lib/axlsx/drawing/str_val.rb +6 -4
- data/lib/axlsx/drawing/title.rb +13 -14
- data/lib/axlsx/drawing/two_cell_anchor.rb +4 -2
- data/lib/axlsx/drawing/val_axis.rb +4 -2
- data/lib/axlsx/drawing/view_3D.rb +16 -8
- data/lib/axlsx/drawing/vml_drawing.rb +18 -16
- data/lib/axlsx/drawing/vml_shape.rb +24 -22
- data/lib/axlsx/package.rb +73 -67
- data/lib/axlsx/rels/relationship.rb +21 -6
- data/lib/axlsx/rels/relationships.rb +6 -4
- data/lib/axlsx/stylesheet/border.rb +15 -4
- data/lib/axlsx/stylesheet/border_pr.rb +19 -6
- data/lib/axlsx/stylesheet/cell_alignment.rb +41 -10
- data/lib/axlsx/stylesheet/cell_protection.rb +12 -3
- data/lib/axlsx/stylesheet/cell_style.rb +33 -8
- data/lib/axlsx/stylesheet/color.rb +15 -7
- data/lib/axlsx/stylesheet/dxf.rb +34 -9
- data/lib/axlsx/stylesheet/fill.rb +7 -2
- data/lib/axlsx/stylesheet/font.rb +65 -17
- data/lib/axlsx/stylesheet/gradient_fill.rb +12 -4
- data/lib/axlsx/stylesheet/gradient_stop.rb +14 -5
- data/lib/axlsx/stylesheet/num_fmt.rb +14 -10
- data/lib/axlsx/stylesheet/pattern_fill.rb +18 -5
- data/lib/axlsx/stylesheet/styles.rb +124 -82
- data/lib/axlsx/stylesheet/table_style.rb +19 -6
- data/lib/axlsx/stylesheet/table_style_element.rb +15 -4
- data/lib/axlsx/stylesheet/table_styles.rb +14 -5
- data/lib/axlsx/stylesheet/xf.rb +73 -18
- data/lib/axlsx/util/accessors.rb +10 -6
- data/lib/axlsx/util/buffered_zip_output_stream.rb +60 -0
- data/lib/axlsx/util/constants.rb +117 -104
- data/lib/axlsx/util/mime_type_utils.rb +3 -5
- data/lib/axlsx/util/options_parser.rb +3 -1
- data/lib/axlsx/util/serialized_attributes.rb +42 -17
- data/lib/axlsx/util/simple_typed_list.rb +47 -47
- data/lib/axlsx/util/storage.rb +11 -10
- data/lib/axlsx/util/validators.rb +101 -41
- data/lib/axlsx/util/zip_command.rb +10 -10
- data/lib/axlsx/version.rb +3 -1
- data/lib/axlsx/workbook/defined_name.rb +6 -4
- data/lib/axlsx/workbook/defined_names.rb +4 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +8 -6
- data/lib/axlsx/workbook/workbook.rb +94 -79
- data/lib/axlsx/workbook/workbook_view.rb +3 -1
- data/lib/axlsx/workbook/workbook_views.rb +4 -2
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +65 -8
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +11 -5
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +11 -7
- data/lib/axlsx/workbook/worksheet/auto_filter/sort_condition.rb +51 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/sort_state.rb +56 -0
- data/lib/axlsx/workbook/worksheet/border_creator.rb +5 -3
- data/lib/axlsx/workbook/worksheet/break.rb +3 -1
- data/lib/axlsx/workbook/worksheet/cell.rb +83 -64
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +31 -27
- data/lib/axlsx/workbook/worksheet/cfvo.rb +11 -3
- data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -1
- data/lib/axlsx/workbook/worksheet/col.rb +5 -3
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +6 -4
- data/lib/axlsx/workbook/worksheet/color_scale.rb +12 -10
- data/lib/axlsx/workbook/worksheet/cols.rb +4 -2
- data/lib/axlsx/workbook/worksheet/comment.rb +8 -6
- data/lib/axlsx/workbook/worksheet/comments.rb +6 -4
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +16 -5
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +73 -16
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +4 -2
- data/lib/axlsx/workbook/worksheet/data_bar.rb +14 -13
- data/lib/axlsx/workbook/worksheet/data_validation.rb +69 -28
- data/lib/axlsx/workbook/worksheet/data_validations.rb +4 -2
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +7 -5
- data/lib/axlsx/workbook/worksheet/dimension.rb +4 -2
- data/lib/axlsx/workbook/worksheet/header_footer.rb +4 -2
- data/lib/axlsx/workbook/worksheet/icon_set.rb +38 -9
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +6 -6
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/page_margins.rb +39 -11
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +7 -4
- data/lib/axlsx/workbook/worksheet/page_setup.rb +34 -9
- data/lib/axlsx/workbook/worksheet/pane.rb +17 -9
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +20 -19
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -6
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +3 -1
- data/lib/axlsx/workbook/worksheet/print_options.rb +3 -1
- data/lib/axlsx/workbook/worksheet/protected_range.rb +3 -1
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +6 -4
- data/lib/axlsx/workbook/worksheet/rich_text.rb +3 -1
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +46 -24
- data/lib/axlsx/workbook/worksheet/row.rb +11 -9
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +7 -5
- data/lib/axlsx/workbook/worksheet/selection.rb +15 -7
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
- data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +8 -4
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +11 -9
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +38 -15
- data/lib/axlsx/workbook/worksheet/table.rb +9 -7
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +4 -2
- data/lib/axlsx/workbook/worksheet/tables.rb +4 -2
- data/lib/axlsx/workbook/worksheet/worksheet.rb +56 -39
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +4 -2
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +8 -2
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +7 -5
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +5 -3
- data/lib/axlsx.rb +56 -42
- data/lib/caxlsx.rb +3 -1
- metadata +39 -71
data/lib/axlsx/drawing/axis.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# the access class defines common properties and values for a chart axis.
|
3
5
|
class Axis
|
@@ -13,7 +15,7 @@ module Axlsx
|
|
13
15
|
@id = rand(8**8)
|
14
16
|
@format_code = "General"
|
15
17
|
@delete = @label_rotation = 0
|
16
|
-
@scaling = Scaling.new(:
|
18
|
+
@scaling = Scaling.new(orientation: :minMax)
|
17
19
|
@title = @color = nil
|
18
20
|
self.ax_pos = :b
|
19
21
|
self.tick_lbl_pos = :nextTo
|
@@ -97,36 +99,54 @@ module Axlsx
|
|
97
99
|
|
98
100
|
# The position of the axis
|
99
101
|
# must be one of [:l, :r, :t, :b]
|
100
|
-
def ax_pos=(v)
|
102
|
+
def ax_pos=(v)
|
103
|
+
RestrictionValidator.validate "#{self.class}.ax_pos", [:l, :r, :b, :t], v
|
104
|
+
@ax_pos = v
|
105
|
+
end
|
101
106
|
alias :axPos= :ax_pos=
|
102
107
|
|
103
108
|
# the position of the tick labels
|
104
109
|
# must be one of [:nextTo, :high, :low1]
|
105
|
-
def tick_lbl_pos=(v)
|
110
|
+
def tick_lbl_pos=(v)
|
111
|
+
RestrictionValidator.validate "#{self.class}.tick_lbl_pos", [:nextTo, :high, :low, :none], v
|
112
|
+
@tick_lbl_pos = v
|
113
|
+
end
|
106
114
|
alias :tickLblPos= :tick_lbl_pos=
|
107
115
|
|
108
116
|
# The number format format code for this axis
|
109
117
|
# default :General
|
110
|
-
def format_code=(v)
|
118
|
+
def format_code=(v)
|
119
|
+
Axlsx.validate_string(v)
|
120
|
+
@format_code = v
|
121
|
+
end
|
111
122
|
|
112
123
|
# Specify if gridlines should be shown for this axis
|
113
124
|
# default true
|
114
|
-
def gridlines=(v)
|
125
|
+
def gridlines=(v)
|
126
|
+
Axlsx.validate_boolean(v)
|
127
|
+
@gridlines = v
|
128
|
+
end
|
115
129
|
|
116
130
|
# Specify if axis should be removed from the chart
|
117
131
|
# default false
|
118
|
-
def delete=(v)
|
132
|
+
def delete=(v)
|
133
|
+
Axlsx.validate_boolean(v)
|
134
|
+
@delete = v
|
135
|
+
end
|
119
136
|
|
120
137
|
# specifies how the perpendicular axis is crossed
|
121
138
|
# must be one of [:autoZero, :min, :max]
|
122
|
-
def crosses=(v)
|
139
|
+
def crosses=(v)
|
140
|
+
RestrictionValidator.validate "#{self.class}.crosses", [:autoZero, :min, :max], v
|
141
|
+
@crosses = v
|
142
|
+
end
|
123
143
|
|
124
144
|
# Specify the degree of label rotation to apply to labels
|
125
145
|
# default true
|
126
146
|
def label_rotation=(v)
|
127
|
-
Axlsx
|
147
|
+
Axlsx.validate_int(v)
|
128
148
|
adjusted = v.to_i * 60000
|
129
|
-
Axlsx
|
149
|
+
Axlsx.validate_angle(adjusted)
|
130
150
|
@label_rotation = adjusted
|
131
151
|
end
|
132
152
|
|
@@ -146,13 +166,13 @@ module Axlsx
|
|
146
166
|
# Serializes the object
|
147
167
|
# @param [String] str
|
148
168
|
# @return [String]
|
149
|
-
def to_xml_string(str = '')
|
150
|
-
str <<
|
169
|
+
def to_xml_string(str = +'')
|
170
|
+
str << '<c:axId val="' << @id.to_s << '"/>'
|
151
171
|
@scaling.to_xml_string str
|
152
|
-
str <<
|
153
|
-
str <<
|
172
|
+
str << '<c:delete val="' << @delete.to_s << '"/>'
|
173
|
+
str << '<c:axPos val="' << @ax_pos.to_s << '"/>'
|
154
174
|
str << '<c:majorGridlines>'
|
155
|
-
# TODO shape properties need to be extracted into a class
|
175
|
+
# TODO: shape properties need to be extracted into a class
|
156
176
|
if gridlines == false
|
157
177
|
str << '<c:spPr>'
|
158
178
|
str << '<a:ln>'
|
@@ -161,25 +181,25 @@ module Axlsx
|
|
161
181
|
str << '</c:spPr>'
|
162
182
|
end
|
163
183
|
str << '</c:majorGridlines>'
|
164
|
-
@title.to_xml_string(str) unless @title
|
184
|
+
@title.to_xml_string(str) unless @title.nil?
|
165
185
|
# Need to set sourceLinked to 0 if we're setting a format code on this row
|
166
186
|
# otherwise it will never take, as it will always prefer the 'General' formatting
|
167
187
|
# of the cells themselves
|
168
|
-
str <<
|
188
|
+
str << '<c:numFmt formatCode="' << @format_code << '" sourceLinked="' << (@format_code.eql?('General') ? '1' : '0') << '"/>'
|
169
189
|
str << '<c:majorTickMark val="none"/>'
|
170
190
|
str << '<c:minorTickMark val="none"/>'
|
171
|
-
str <<
|
172
|
-
# TODO
|
191
|
+
str << '<c:tickLblPos val="' << @tick_lbl_pos.to_s << '"/>'
|
192
|
+
# TODO: this is also being used for series colors
|
173
193
|
# time to extract this into a class spPr - Shape Properties
|
174
194
|
if @color
|
175
195
|
str << '<c:spPr><a:ln><a:solidFill>'
|
176
|
-
str <<
|
196
|
+
str << '<a:srgbClr val="' << @color << '"/>'
|
177
197
|
str << '</a:solidFill></a:ln></c:spPr>'
|
178
198
|
end
|
179
199
|
# some potential value in implementing this in full. Very detailed!
|
180
|
-
str <<
|
181
|
-
str <<
|
182
|
-
str <<
|
200
|
+
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>'
|
201
|
+
str << '<c:crossAx val="' << @cross_axis.id.to_s << '"/>'
|
202
|
+
str << '<c:crosses val="' << @crosses.to_s << '"/>'
|
183
203
|
end
|
184
204
|
end
|
185
205
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# The Bar3DChart is a three dimentional barchart (who would have guessed?) that you can add to your worksheet.
|
3
5
|
# @see Worksheet#add_chart
|
@@ -75,7 +77,7 @@ module Axlsx
|
|
75
77
|
@gap_width, @gap_depth, @shape = nil, nil, nil
|
76
78
|
super(frame, options)
|
77
79
|
@series_type = BarSeries
|
78
|
-
@view_3D = View3D.new({ :
|
80
|
+
@view_3D = View3D.new({ r_ang_ax: 1 }.merge(options))
|
79
81
|
@d_lbls = nil
|
80
82
|
end
|
81
83
|
|
@@ -97,14 +99,14 @@ module Axlsx
|
|
97
99
|
# space between bar or column clusters, as a percentage of the bar or column width.
|
98
100
|
def gap_width=(v)
|
99
101
|
RangeValidator.validate "Bar3DChart.gap_width", 0, 500, v
|
100
|
-
@gap_width =
|
102
|
+
@gap_width = v
|
101
103
|
end
|
102
104
|
alias :gapWidth= :gap_width=
|
103
105
|
|
104
106
|
# space between bar or column clusters, as a percentage of the bar or column width.
|
105
107
|
def gap_depth=(v)
|
106
108
|
RangeValidator.validate "Bar3DChart.gap_depth", 0, 500, v
|
107
|
-
@gap_depth =
|
109
|
+
@gap_depth = v
|
108
110
|
end
|
109
111
|
alias :gapDepth= :gap_depth=
|
110
112
|
|
@@ -118,18 +120,18 @@ module Axlsx
|
|
118
120
|
# Serializes the object
|
119
121
|
# @param [String] str
|
120
122
|
# @return [String]
|
121
|
-
def to_xml_string(str = '')
|
123
|
+
def to_xml_string(str = +'')
|
122
124
|
super(str) do
|
123
125
|
str << '<c:bar3DChart>'
|
124
|
-
str <<
|
125
|
-
str <<
|
126
|
-
str <<
|
126
|
+
str << '<c:barDir val="' << bar_dir.to_s << '"/>'
|
127
|
+
str << '<c:grouping val="' << grouping.to_s << '"/>'
|
128
|
+
str << '<c:varyColors val="' << vary_colors.to_s << '"/>'
|
127
129
|
@series.each { |ser| ser.to_xml_string(str) }
|
128
130
|
@d_lbls.to_xml_string(str) if @d_lbls
|
129
|
-
str <<
|
130
|
-
str <<
|
131
|
-
str <<
|
132
|
-
axes.to_xml_string(str, :
|
131
|
+
str << '<c:gapWidth val="' << @gap_width.to_s << '"/>' unless @gap_width.nil?
|
132
|
+
str << '<c:gapDepth val="' << @gap_depth.to_s << '"/>' unless @gap_depth.nil?
|
133
|
+
str << '<c:shape val="' << @shape.to_s << '"/>' unless @shape.nil?
|
134
|
+
axes.to_xml_string(str, ids: true)
|
133
135
|
str << '</c:bar3DChart>'
|
134
136
|
axes.to_xml_string(str)
|
135
137
|
end
|
@@ -139,7 +141,7 @@ module Axlsx
|
|
139
141
|
# category axes specified via axes[:val_axes] and axes[:cat_axis]
|
140
142
|
# @return [Axes]
|
141
143
|
def axes
|
142
|
-
@axes ||= Axes.new(:
|
144
|
+
@axes ||= Axes.new(cat_axis: CatAxis, val_axis: ValAxis)
|
143
145
|
end
|
144
146
|
end
|
145
147
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# The BarChart is a two dimentional barchart that you can add to your worksheet.
|
3
5
|
# @see Worksheet#add_chart
|
@@ -89,13 +91,13 @@ module Axlsx
|
|
89
91
|
# space between bar or column clusters, as a percentage of the bar or column width.
|
90
92
|
def gap_width=(v)
|
91
93
|
RangeValidator.validate "BarChart.gap_width", 0, 500, v
|
92
|
-
@gap_width =
|
94
|
+
@gap_width = v
|
93
95
|
end
|
94
96
|
alias :gapWidth= :gap_width=
|
95
97
|
|
96
98
|
def overlap=(v)
|
97
99
|
RangeValidator.validate "BarChart.overlap", -100, 100, v
|
98
|
-
@overlap =
|
100
|
+
@overlap = v
|
99
101
|
end
|
100
102
|
|
101
103
|
# The shape of the bars or columns
|
@@ -108,18 +110,18 @@ module Axlsx
|
|
108
110
|
# Serializes the object
|
109
111
|
# @param [String] str
|
110
112
|
# @return [String]
|
111
|
-
def to_xml_string(str = '')
|
113
|
+
def to_xml_string(str = +'')
|
112
114
|
super(str) do
|
113
115
|
str << '<c:barChart>'
|
114
|
-
str <<
|
115
|
-
str <<
|
116
|
-
str <<
|
116
|
+
str << '<c:barDir val="' << bar_dir.to_s << '"/>'
|
117
|
+
str << '<c:grouping val="' << grouping.to_s << '"/>'
|
118
|
+
str << '<c:varyColors val="' << vary_colors.to_s << '"/>'
|
117
119
|
@series.each { |ser| ser.to_xml_string(str) }
|
118
120
|
@d_lbls.to_xml_string(str) if @d_lbls
|
119
|
-
str <<
|
120
|
-
str <<
|
121
|
-
str <<
|
122
|
-
axes.to_xml_string(str, :
|
121
|
+
str << '<c:overlap val="' << @overlap.to_s << '"/>' unless @overlap.nil?
|
122
|
+
str << '<c:gapWidth val="' << @gap_width.to_s << '"/>' unless @gap_width.nil?
|
123
|
+
str << '<c:shape val="' << @shape.to_s << '"/>' unless @shape.nil?
|
124
|
+
axes.to_xml_string(str, ids: true)
|
123
125
|
str << '</c:barChart>'
|
124
126
|
axes.to_xml_string(str)
|
125
127
|
end
|
@@ -129,7 +131,7 @@ module Axlsx
|
|
129
131
|
# category axes specified via axes[:val_axes] and axes[:cat_axis]
|
130
132
|
# @return [Axes]
|
131
133
|
def axes
|
132
|
-
@axes ||= Axes.new(:
|
134
|
+
@axes ||= Axes.new(cat_axis: CatAxis, val_axis: ValAxis)
|
133
135
|
end
|
134
136
|
end
|
135
137
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# A BarSeries defines the title, data and labels for bar charts
|
3
5
|
# @note The recommended way to manage series is to use Chart#add_series
|
@@ -36,12 +38,15 @@ module Axlsx
|
|
36
38
|
@shape = :box
|
37
39
|
@colors = []
|
38
40
|
super(chart, options)
|
39
|
-
self.labels = AxDataSource.new({ :
|
41
|
+
self.labels = AxDataSource.new({ data: options[:labels] }) unless options[:labels].nil?
|
40
42
|
self.data = NumDataSource.new(options) unless options[:data].nil?
|
41
43
|
end
|
42
44
|
|
43
45
|
# @see colors
|
44
|
-
def colors=(v)
|
46
|
+
def colors=(v)
|
47
|
+
DataTypeValidator.validate "BarSeries.colors", [Array], v
|
48
|
+
@colors = v
|
49
|
+
end
|
45
50
|
|
46
51
|
def series_color=(v)
|
47
52
|
@series_color = v
|
@@ -56,19 +61,19 @@ module Axlsx
|
|
56
61
|
# Serializes the object
|
57
62
|
# @param [String] str
|
58
63
|
# @return [String]
|
59
|
-
def to_xml_string(str = '')
|
64
|
+
def to_xml_string(str = +'')
|
60
65
|
super(str) do
|
61
66
|
colors.each_with_index do |c, index|
|
62
67
|
str << '<c:dPt>'
|
63
|
-
str <<
|
68
|
+
str << '<c:idx val="' << index.to_s << '"/>'
|
64
69
|
str << '<c:spPr><a:solidFill>'
|
65
|
-
str <<
|
70
|
+
str << '<a:srgbClr val="' << c << '"/>'
|
66
71
|
str << '</a:solidFill></c:spPr></c:dPt>'
|
67
72
|
end
|
68
73
|
|
69
74
|
if series_color
|
70
75
|
str << '<c:spPr><a:solidFill>'
|
71
|
-
str <<
|
76
|
+
str << '<a:srgbClr val="' << series_color << '"/>'
|
72
77
|
str << '</a:solidFill>'
|
73
78
|
str << '</c:spPr>'
|
74
79
|
end
|
@@ -76,16 +81,22 @@ module Axlsx
|
|
76
81
|
@labels.to_xml_string(str) unless @labels.nil?
|
77
82
|
@data.to_xml_string(str) unless @data.nil?
|
78
83
|
# this is actually only required for shapes other than box
|
79
|
-
str <<
|
84
|
+
str << '<c:shape val="' << shape.to_s << '"></c:shape>'
|
80
85
|
end
|
81
86
|
end
|
82
87
|
|
83
88
|
private
|
84
89
|
|
85
90
|
# assigns the data for this series
|
86
|
-
def data=(v)
|
91
|
+
def data=(v)
|
92
|
+
DataTypeValidator.validate "Series.data", [NumDataSource], v
|
93
|
+
@data = v
|
94
|
+
end
|
87
95
|
|
88
96
|
# assigns the labels for this series
|
89
|
-
def labels=(v)
|
97
|
+
def labels=(v)
|
98
|
+
DataTypeValidator.validate "Series.labels", [AxDataSource], v
|
99
|
+
@labels = v
|
100
|
+
end
|
90
101
|
end
|
91
102
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# The BubbleChart allows you to insert a bubble chart into your worksheet
|
3
5
|
# @see Worksheet#add_chart
|
@@ -33,13 +35,13 @@ module Axlsx
|
|
33
35
|
# Serializes the object
|
34
36
|
# @param [String] str
|
35
37
|
# @return [String]
|
36
|
-
def to_xml_string(str = '')
|
38
|
+
def to_xml_string(str = +'')
|
37
39
|
super(str) do
|
38
40
|
str << '<c:bubbleChart>'
|
39
|
-
str <<
|
41
|
+
str << '<c:varyColors val="' << vary_colors.to_s << '"/>'
|
40
42
|
@series.each { |ser| ser.to_xml_string(str) }
|
41
43
|
d_lbls.to_xml_string(str) if @d_lbls
|
42
|
-
axes.to_xml_string(str, :
|
44
|
+
axes.to_xml_string(str, ids: true)
|
43
45
|
str << '</c:bubbleChart>'
|
44
46
|
axes.to_xml_string(str)
|
45
47
|
end
|
@@ -50,7 +52,7 @@ module Axlsx
|
|
50
52
|
# a y_val_axis
|
51
53
|
# @return [Axes]
|
52
54
|
def axes
|
53
|
-
@axes ||= Axes.new(:
|
55
|
+
@axes ||= Axes.new(x_val_axis: ValAxis, y_val_axis: ValAxis)
|
54
56
|
end
|
55
57
|
end
|
56
58
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# A BubbleSeries defines the x/y position and bubble size of data in the chart
|
3
5
|
# @note The recommended way to manage series is to use Chart#add_series
|
@@ -26,9 +28,9 @@ module Axlsx
|
|
26
28
|
def initialize(chart, options = {})
|
27
29
|
@xData, @yData, @bubbleSize = nil
|
28
30
|
super(chart, options)
|
29
|
-
@xData = AxDataSource.new(:
|
30
|
-
@yData = NumDataSource.new({ :
|
31
|
-
@bubbleSize = NumDataSource.new({ :
|
31
|
+
@xData = AxDataSource.new(tag_name: :xVal, data: options[:xData]) unless options[:xData].nil?
|
32
|
+
@yData = NumDataSource.new({ tag_name: :yVal, data: options[:yData] }) unless options[:yData].nil?
|
33
|
+
@bubbleSize = NumDataSource.new({ tag_name: :bubbleSize, data: options[:bubbleSize] }) unless options[:bubbleSize].nil?
|
32
34
|
end
|
33
35
|
|
34
36
|
# @see color
|
@@ -39,15 +41,15 @@ module Axlsx
|
|
39
41
|
# Serializes the object
|
40
42
|
# @param [String] str
|
41
43
|
# @return [String]
|
42
|
-
def to_xml_string(str = '')
|
44
|
+
def to_xml_string(str = +'')
|
43
45
|
super(str) do
|
44
46
|
# needs to override the super color here to push in ln/and something else!
|
45
47
|
if color
|
46
48
|
str << '<c:spPr><a:solidFill>'
|
47
|
-
str <<
|
49
|
+
str << '<a:srgbClr val="' << color << '"/>'
|
48
50
|
str << '</a:solidFill>'
|
49
51
|
str << '<a:ln><a:solidFill>'
|
50
|
-
str <<
|
52
|
+
str << '<a:srgbClr val="' << color << '"/></a:solidFill></a:ln>'
|
51
53
|
str << '</c:spPr>'
|
52
54
|
end
|
53
55
|
@xData.to_xml_string(str) unless @xData.nil?
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# A CatAxis object defines a chart category axis
|
3
5
|
class CatAxis < Axis
|
@@ -40,40 +42,55 @@ module Axlsx
|
|
40
42
|
alias :tickMarkSkip :tick_mark_skip
|
41
43
|
|
42
44
|
# regex for validating label offset
|
43
|
-
LBL_OFFSET_REGEX = /0*(([0-9])|([1-9][0-9])|([1-9][0-9][0-9])|1000)
|
45
|
+
LBL_OFFSET_REGEX = /0*(([0-9])|([1-9][0-9])|([1-9][0-9][0-9])|1000)/.freeze
|
44
46
|
|
45
47
|
# @see tick_lbl_skip
|
46
|
-
def tick_lbl_skip=(v)
|
48
|
+
def tick_lbl_skip=(v)
|
49
|
+
Axlsx.validate_unsigned_int(v)
|
50
|
+
@tick_lbl_skip = v
|
51
|
+
end
|
47
52
|
alias :tickLblSkip= :tick_lbl_skip=
|
48
53
|
|
49
54
|
# @see tick_mark_skip
|
50
|
-
def tick_mark_skip=(v)
|
55
|
+
def tick_mark_skip=(v)
|
56
|
+
Axlsx.validate_unsigned_int(v)
|
57
|
+
@tick_mark_skip = v
|
58
|
+
end
|
51
59
|
alias :tickMarkSkip= :tick_mark_skip=
|
52
60
|
|
53
61
|
# From the docs: This element specifies that this axis is a date or text axis based on the data that is used for the axis labels, not a specific choice.
|
54
|
-
def auto=(v)
|
62
|
+
def auto=(v)
|
63
|
+
Axlsx.validate_boolean(v)
|
64
|
+
@auto = v
|
65
|
+
end
|
55
66
|
|
56
67
|
# specifies how the perpendicular axis is crossed
|
57
68
|
# must be one of [:ctr, :l, :r]
|
58
|
-
def lbl_algn=(v)
|
69
|
+
def lbl_algn=(v)
|
70
|
+
RestrictionValidator.validate "#{self.class}.lbl_algn", [:ctr, :l, :r], v
|
71
|
+
@lbl_algn = v
|
72
|
+
end
|
59
73
|
alias :lblAlgn= :lbl_algn=
|
60
74
|
|
61
75
|
# The offset of the labels
|
62
76
|
# must be between a string between 0 and 1000
|
63
|
-
def lbl_offset=(v)
|
77
|
+
def lbl_offset=(v)
|
78
|
+
RegexValidator.validate "#{self.class}.lbl_offset", LBL_OFFSET_REGEX, v
|
79
|
+
@lbl_offset = v
|
80
|
+
end
|
64
81
|
alias :lblOffset= :lbl_offset=
|
65
82
|
|
66
83
|
# Serializes the object
|
67
84
|
# @param [String] str
|
68
85
|
# @return [String]
|
69
|
-
def to_xml_string(str = '')
|
86
|
+
def to_xml_string(str = +'')
|
70
87
|
str << '<c:catAx>'
|
71
88
|
super(str)
|
72
|
-
str <<
|
73
|
-
str <<
|
74
|
-
str <<
|
75
|
-
str <<
|
76
|
-
str <<
|
89
|
+
str << '<c:auto val="' << @auto.to_s << '"/>'
|
90
|
+
str << '<c:lblAlgn val="' << @lbl_algn.to_s << '"/>'
|
91
|
+
str << '<c:lblOffset val="' << @lbl_offset.to_i.to_s << '"/>'
|
92
|
+
str << '<c:tickLblSkip val="' << @tick_lbl_skip.to_s << '"/>'
|
93
|
+
str << '<c:tickMarkSkip val="' << @tick_mark_skip.to_s << '"/>'
|
77
94
|
str << '</c:catAx>'
|
78
95
|
end
|
79
96
|
end
|
data/lib/axlsx/drawing/chart.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# A Chart is the superclass for specific charts
|
3
5
|
# @note Worksheet#add_chart is the recommended way to create charts for your worksheets.
|
@@ -49,7 +51,7 @@ module Axlsx
|
|
49
51
|
# @return [Series]
|
50
52
|
attr_reader :series_type
|
51
53
|
|
52
|
-
# TODO data labels!
|
54
|
+
# TODO: data labels!
|
53
55
|
def d_lbls
|
54
56
|
@d_lbls ||= DLbls.new(self.class)
|
55
57
|
end
|
@@ -60,7 +62,10 @@ module Axlsx
|
|
60
62
|
|
61
63
|
# Configures the vary_colors options for this chart
|
62
64
|
# @param [Boolean] v The value to set
|
63
|
-
def vary_colors=(v)
|
65
|
+
def vary_colors=(v)
|
66
|
+
Axlsx.validate_boolean(v)
|
67
|
+
@vary_colors = v
|
68
|
+
end
|
64
69
|
|
65
70
|
# The title object for the chart.
|
66
71
|
# @return [Title]
|
@@ -122,7 +127,7 @@ module Axlsx
|
|
122
127
|
# The part name for this chart
|
123
128
|
# @return [String]
|
124
129
|
def pn
|
125
|
-
|
130
|
+
format(CHART_PN, index + 1)
|
126
131
|
end
|
127
132
|
|
128
133
|
# The title object for the chart.
|
@@ -147,21 +152,33 @@ module Axlsx
|
|
147
152
|
# Show the legend in the chart
|
148
153
|
# @param [Boolean] v
|
149
154
|
# @return [Boolean]
|
150
|
-
def show_legend=(v)
|
155
|
+
def show_legend=(v)
|
156
|
+
Axlsx.validate_boolean(v)
|
157
|
+
@show_legend = v
|
158
|
+
end
|
151
159
|
|
152
160
|
# How to display blank values
|
153
161
|
# @see display_blanks_as
|
154
162
|
# @param [Symbol] v
|
155
163
|
# @return [Symbol]
|
156
|
-
def display_blanks_as=(v)
|
164
|
+
def display_blanks_as=(v)
|
165
|
+
Axlsx.validate_display_blanks_as(v)
|
166
|
+
@display_blanks_as = v
|
167
|
+
end
|
157
168
|
|
158
169
|
# The style for the chart.
|
159
170
|
# see ECMA Part 1 §21.2.2.196
|
160
171
|
# @param [Integer] v must be between 1 and 48
|
161
|
-
def style=(v)
|
172
|
+
def style=(v)
|
173
|
+
DataTypeValidator.validate "Chart.style", Integer, v, ->(arg) { arg >= 1 && arg <= 48 }
|
174
|
+
@style = v
|
175
|
+
end
|
162
176
|
|
163
177
|
# @see legend_position
|
164
|
-
def legend_position=(v)
|
178
|
+
def legend_position=(v)
|
179
|
+
RestrictionValidator.validate "Chart.legend_position", [:b, :l, :r, :t, :tr], v
|
180
|
+
@legend_position = v
|
181
|
+
end
|
165
182
|
|
166
183
|
# backwards compatibility to allow chart.to and chart.from access to anchor markers
|
167
184
|
# @note This will be disconinued in version 2.0.0. Please use the end_at method
|
@@ -185,32 +202,38 @@ module Axlsx
|
|
185
202
|
|
186
203
|
# Assigns a background color to chart area
|
187
204
|
def bg_color=(v)
|
188
|
-
DataTypeValidator.validate(:color, Color, Color.new(:
|
205
|
+
DataTypeValidator.validate(:color, Color, Color.new(rgb: v))
|
189
206
|
@bg_color = v
|
190
207
|
end
|
191
208
|
|
192
209
|
# Whether only data from visible cells should be plotted.
|
193
210
|
# @param [Boolean] v
|
194
211
|
# @return [Boolean]
|
195
|
-
def plot_visible_only=(v)
|
212
|
+
def plot_visible_only=(v)
|
213
|
+
Axlsx.validate_boolean(v)
|
214
|
+
@plot_visible_only = v
|
215
|
+
end
|
196
216
|
|
197
217
|
# Whether the chart area shall have rounded corners.
|
198
218
|
# @param [Boolean] v
|
199
219
|
# @return [Boolean]
|
200
|
-
def rounded_corners=(v)
|
220
|
+
def rounded_corners=(v)
|
221
|
+
Axlsx.validate_boolean(v)
|
222
|
+
@rounded_corners = v
|
223
|
+
end
|
201
224
|
|
202
225
|
# Serializes the object
|
203
226
|
# @param [String] str
|
204
227
|
# @return [String]
|
205
|
-
def to_xml_string(str = '')
|
228
|
+
def to_xml_string(str = +'')
|
206
229
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
207
|
-
str <<
|
208
|
-
str <<
|
209
|
-
str <<
|
210
|
-
str <<
|
230
|
+
str << '<c:chartSpace xmlns:c="' << XML_NS_C << '" xmlns:a="' << XML_NS_A << '" xmlns:r="' << XML_NS_R << '">'
|
231
|
+
str << '<c:date1904 val="' << Axlsx::Workbook.date1904.to_s << '"/>'
|
232
|
+
str << '<c:roundedCorners val="' << rounded_corners.to_s << '"/>'
|
233
|
+
str << '<c:style val="' << style.to_s << '"/>'
|
211
234
|
str << '<c:chart>'
|
212
235
|
@title.to_xml_string(str) unless @title.empty?
|
213
|
-
str <<
|
236
|
+
str << '<c:autoTitleDeleted val="' << @title.nil?.to_s << '"/>'
|
214
237
|
@view_3D.to_xml_string(str) if @view_3D
|
215
238
|
str << '<c:floor><c:thickness val="0"/></c:floor>'
|
216
239
|
str << '<c:sideWall><c:thickness val="0"/></c:sideWall>'
|
@@ -221,13 +244,13 @@ module Axlsx
|
|
221
244
|
str << '</c:plotArea>'
|
222
245
|
if @show_legend
|
223
246
|
str << '<c:legend>'
|
224
|
-
str <<
|
247
|
+
str << '<c:legendPos val="' << @legend_position.to_s << '"/>'
|
225
248
|
str << '<c:layout/>'
|
226
249
|
str << '<c:overlay val="0"/>'
|
227
250
|
str << '</c:legend>'
|
228
251
|
end
|
229
|
-
str <<
|
230
|
-
str <<
|
252
|
+
str << '<c:plotVisOnly val="' << @plot_visible_only.to_s << '"/>'
|
253
|
+
str << '<c:dispBlanksAs val="' << display_blanks_as.to_s << '"/>'
|
231
254
|
str << '<c:showDLblsOverMax val="1"/>'
|
232
255
|
str << '</c:chart>'
|
233
256
|
if bg_color
|
@@ -288,7 +311,10 @@ module Axlsx
|
|
288
311
|
end
|
289
312
|
|
290
313
|
# sets the view_3D object for the chart
|
291
|
-
def view_3D=(v)
|
314
|
+
def view_3D=(v)
|
315
|
+
DataTypeValidator.validate "#{self.class}.view_3D", View3D, v
|
316
|
+
@view_3D = v
|
317
|
+
end
|
292
318
|
alias :view3D= :view_3D=
|
293
319
|
end
|
294
320
|
end
|