axlsx 2.0.1 → 3.0.0.pre
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 +5 -0
- data/README.md +23 -23
- data/Rakefile +9 -11
- data/examples/auto_filter.rb +10 -1
- data/examples/conditional_formatting/example_conditional_formatting.rb +18 -3
- data/examples/example.rb +102 -4
- 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/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 +34 -32
- 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/lib/axlsx.rb +34 -15
- 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 +142 -64
@@ -0,0 +1,99 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
|
4
|
+
# The AreaChart is a two dimentional line chart (who would have guessed?) that you can add to your worksheet.
|
5
|
+
# @example Creating a chart
|
6
|
+
# # This example creates a line in a single sheet.
|
7
|
+
# require "rubygems" # if that is your preferred way to manage gems!
|
8
|
+
# require "axlsx"
|
9
|
+
#
|
10
|
+
# p = Axlsx::Package.new
|
11
|
+
# ws = p.workbook.add_worksheet
|
12
|
+
# ws.add_row ["This is a chart with no data in the sheet"]
|
13
|
+
#
|
14
|
+
# chart = ws.add_chart(Axlsx::AreaChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
|
15
|
+
# chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
|
16
|
+
#
|
17
|
+
# @see Worksheet#add_chart
|
18
|
+
# @see Worksheet#add_row
|
19
|
+
# @see Chart#add_series
|
20
|
+
# @see Series
|
21
|
+
# @see Package#serialize
|
22
|
+
class AreaChart < Chart
|
23
|
+
|
24
|
+
# the category axis
|
25
|
+
# @return [CatAxis]
|
26
|
+
def cat_axis
|
27
|
+
axes[:cat_axis]
|
28
|
+
end
|
29
|
+
alias :catAxis :cat_axis
|
30
|
+
|
31
|
+
# the category axis
|
32
|
+
# @return [ValAxis]
|
33
|
+
def val_axis
|
34
|
+
axes[:val_axis]
|
35
|
+
end
|
36
|
+
alias :valAxis :val_axis
|
37
|
+
|
38
|
+
# must be one of [:percentStacked, :clustered, :standard, :stacked]
|
39
|
+
# @return [Symbol]
|
40
|
+
attr_reader :grouping
|
41
|
+
|
42
|
+
# Creates a new line chart object
|
43
|
+
# @param [GraphicFrame] frame The workbook that owns this chart.
|
44
|
+
# @option options [Cell, String] title
|
45
|
+
# @option options [Boolean] show_legend
|
46
|
+
# @option options [Symbol] grouping
|
47
|
+
# @see Chart
|
48
|
+
def initialize(frame, options={})
|
49
|
+
@vary_colors = false
|
50
|
+
@grouping = :standard
|
51
|
+
super(frame, options)
|
52
|
+
@series_type = AreaSeries
|
53
|
+
@d_lbls = nil
|
54
|
+
end
|
55
|
+
|
56
|
+
# @see grouping
|
57
|
+
def grouping=(v)
|
58
|
+
RestrictionValidator.validate "AreaChart.grouping", [:percentStacked, :standard, :stacked], v
|
59
|
+
@grouping = v
|
60
|
+
end
|
61
|
+
|
62
|
+
# The node name to use in serialization. As AreaChart is used as the
|
63
|
+
# base class for Liine3DChart we need to be sure to serialize the
|
64
|
+
# chart based on the actual class type and not a fixed node name.
|
65
|
+
# @return [String]
|
66
|
+
def node_name
|
67
|
+
path = self.class.to_s
|
68
|
+
if i = path.rindex('::')
|
69
|
+
path = path[(i+2)..-1]
|
70
|
+
end
|
71
|
+
path[0] = path[0].chr.downcase
|
72
|
+
path
|
73
|
+
end
|
74
|
+
|
75
|
+
# Serializes the object
|
76
|
+
# @param [String] str
|
77
|
+
# @return [String]
|
78
|
+
def to_xml_string(str = '')
|
79
|
+
super(str) do
|
80
|
+
str << ("<c:" << node_name << ">")
|
81
|
+
str << ('<c:grouping val="' << grouping.to_s << '"/>')
|
82
|
+
str << ('<c:varyColors val="' << vary_colors.to_s << '"/>')
|
83
|
+
@series.each { |ser| ser.to_xml_string(str) }
|
84
|
+
@d_lbls.to_xml_string(str) if @d_lbls
|
85
|
+
yield if block_given?
|
86
|
+
axes.to_xml_string(str, :ids => true)
|
87
|
+
str << ("</c:" << node_name << ">")
|
88
|
+
axes.to_xml_string(str)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# The axes for this chart. AreaCharts have a category and value
|
93
|
+
# axis.
|
94
|
+
# @return [Axes]
|
95
|
+
def axes
|
96
|
+
@axes ||= Axes.new(:cat_axis => CatAxis, :val_axis => ValAxis)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
# A AreaSeries defines the title, data and labels for line charts
|
4
|
+
# @note The recommended way to manage series is to use Chart#add_series
|
5
|
+
# @see Worksheet#add_chart
|
6
|
+
# @see Chart#add_series
|
7
|
+
class AreaSeries < Series
|
8
|
+
|
9
|
+
# The data for this series.
|
10
|
+
# @return [ValAxisData]
|
11
|
+
attr_reader :data
|
12
|
+
|
13
|
+
# The labels for this series.
|
14
|
+
# @return [CatAxisData]
|
15
|
+
attr_reader :labels
|
16
|
+
|
17
|
+
# The fill color for this series.
|
18
|
+
# Red, green, and blue is expressed as sequence of hex digits, RRGGBB. A perceptual gamma of 2.2 is used.
|
19
|
+
# @return [String]
|
20
|
+
attr_reader :color
|
21
|
+
|
22
|
+
# show markers on values
|
23
|
+
# @return [Boolean]
|
24
|
+
attr_reader :show_marker
|
25
|
+
|
26
|
+
# custom marker symbol
|
27
|
+
# @return [String]
|
28
|
+
attr_reader :marker_symbol
|
29
|
+
|
30
|
+
# line smoothing on values
|
31
|
+
# @return [Boolean]
|
32
|
+
attr_reader :smooth
|
33
|
+
|
34
|
+
# Creates a new series
|
35
|
+
# @option options [Array, SimpleTypedList] data
|
36
|
+
# @option options [Array, SimpleTypedList] labels
|
37
|
+
# @param [Chart] chart
|
38
|
+
def initialize(chart, options={})
|
39
|
+
@show_marker = false
|
40
|
+
@marker_symbol = options[:marker_symbol] ? options[:marker_symbol] : :default
|
41
|
+
@smooth = false
|
42
|
+
@labels, @data = nil, nil
|
43
|
+
super(chart, options)
|
44
|
+
@labels = AxDataSource.new(:data => options[:labels]) unless options[:labels].nil?
|
45
|
+
@data = NumDataSource.new(options) unless options[:data].nil?
|
46
|
+
end
|
47
|
+
|
48
|
+
# @see color
|
49
|
+
def color=(v)
|
50
|
+
@color = v
|
51
|
+
end
|
52
|
+
|
53
|
+
# @see show_marker
|
54
|
+
def show_marker=(v)
|
55
|
+
Axlsx::validate_boolean(v)
|
56
|
+
@show_marker = v
|
57
|
+
end
|
58
|
+
|
59
|
+
# @see marker_symbol
|
60
|
+
def marker_symbol=(v)
|
61
|
+
Axlsx::validate_marker_symbol(v)
|
62
|
+
@marker_symbol = v
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see smooth
|
66
|
+
def smooth=(v)
|
67
|
+
Axlsx::validate_boolean(v)
|
68
|
+
@smooth = v
|
69
|
+
end
|
70
|
+
|
71
|
+
# Serializes the object
|
72
|
+
# @param [String] str
|
73
|
+
# @return [String]
|
74
|
+
def to_xml_string(str = '')
|
75
|
+
super(str) do
|
76
|
+
if color
|
77
|
+
str << '<c:spPr><a:solidFill>'
|
78
|
+
str << ('<a:srgbClr val="' << color << '"/>')
|
79
|
+
str << '</a:solidFill>'
|
80
|
+
str << '<a:ln w="28800">'
|
81
|
+
str << '<a:solidFill>'
|
82
|
+
str << ('<a:srgbClr val="' << color << '"/>')
|
83
|
+
str << '</a:solidFill>'
|
84
|
+
str << '</a:ln>'
|
85
|
+
str << '<a:round/>'
|
86
|
+
str << '</c:spPr>'
|
87
|
+
end
|
88
|
+
|
89
|
+
if !@show_marker
|
90
|
+
str << '<c:marker><c:symbol val="none"/></c:marker>'
|
91
|
+
elsif @marker_symbol != :default
|
92
|
+
str << '<c:marker><c:symbol val="' + @marker_symbol.to_s + '"/></c:marker>'
|
93
|
+
end
|
94
|
+
|
95
|
+
@labels.to_xml_string(str) unless @labels.nil?
|
96
|
+
@data.to_xml_string(str) unless @data.nil?
|
97
|
+
str << ('<c:smooth val="' << ((smooth) ? '1' : '0') << '"/>')
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
# assigns the data for this series
|
104
|
+
def data=(v) DataTypeValidator.validate "Series.data", [NumDataSource], v; @data = v; end
|
105
|
+
|
106
|
+
# assigns the labels for this series
|
107
|
+
def labels=(v) DataTypeValidator.validate "Series.labels", [AxDataSource], v; @labels = v; end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
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
|
|