caxlsx 2.0.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +41 -33
  4. data/Rakefile +9 -11
  5. data/examples/auto_filter.rb +10 -1
  6. data/examples/conditional_formatting/example_conditional_formatting.rb +18 -3
  7. data/examples/data_validation.rb +57 -40
  8. data/examples/example.rb +115 -7
  9. data/examples/merge_cells.rb +17 -0
  10. data/examples/no_grid_with_borders.rb +18 -0
  11. data/examples/pivot_test.rb +63 -0
  12. data/examples/split.rb +16 -0
  13. data/lib/axlsx.rb +34 -15
  14. data/lib/axlsx/content_type/abstract_content_type.rb +1 -1
  15. data/lib/axlsx/content_type/content_type.rb +1 -1
  16. data/lib/axlsx/doc_props/app.rb +1 -1
  17. data/lib/axlsx/doc_props/core.rb +5 -5
  18. data/lib/axlsx/drawing/area_chart.rb +99 -0
  19. data/lib/axlsx/drawing/area_series.rb +110 -0
  20. data/lib/axlsx/drawing/axes.rb +1 -1
  21. data/lib/axlsx/drawing/axis.rb +12 -9
  22. data/lib/axlsx/drawing/bar_3D_chart.rb +13 -13
  23. data/lib/axlsx/drawing/bar_chart.rb +143 -0
  24. data/lib/axlsx/drawing/bar_series.rb +9 -9
  25. data/lib/axlsx/drawing/bubble_chart.rb +59 -0
  26. data/lib/axlsx/drawing/bubble_series.rb +63 -0
  27. data/lib/axlsx/drawing/cat_axis.rb +5 -5
  28. data/lib/axlsx/drawing/chart.rb +52 -8
  29. data/lib/axlsx/drawing/d_lbls.rb +3 -3
  30. data/lib/axlsx/drawing/drawing.rb +6 -1
  31. data/lib/axlsx/drawing/graphic_frame.rb +3 -3
  32. data/lib/axlsx/drawing/hyperlink.rb +1 -3
  33. data/lib/axlsx/drawing/line_3D_chart.rb +2 -2
  34. data/lib/axlsx/drawing/line_chart.rb +10 -10
  35. data/lib/axlsx/drawing/line_series.rb +32 -3
  36. data/lib/axlsx/drawing/marker.rb +1 -1
  37. data/lib/axlsx/drawing/num_data.rb +4 -4
  38. data/lib/axlsx/drawing/num_data_source.rb +6 -6
  39. data/lib/axlsx/drawing/num_val.rb +3 -1
  40. data/lib/axlsx/drawing/one_cell_anchor.rb +3 -2
  41. data/lib/axlsx/drawing/pic.rb +25 -19
  42. data/lib/axlsx/drawing/picture_locking.rb +1 -3
  43. data/lib/axlsx/drawing/pie_3D_chart.rb +5 -6
  44. data/lib/axlsx/drawing/pie_series.rb +6 -6
  45. data/lib/axlsx/drawing/scaling.rb +6 -6
  46. data/lib/axlsx/drawing/scatter_chart.rb +10 -10
  47. data/lib/axlsx/drawing/scatter_series.rb +40 -7
  48. data/lib/axlsx/drawing/ser_axis.rb +2 -2
  49. data/lib/axlsx/drawing/series.rb +3 -3
  50. data/lib/axlsx/drawing/series_title.rb +2 -2
  51. data/lib/axlsx/drawing/str_data.rb +3 -3
  52. data/lib/axlsx/drawing/str_val.rb +3 -1
  53. data/lib/axlsx/drawing/title.rb +22 -4
  54. data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
  55. data/lib/axlsx/drawing/val_axis.rb +1 -1
  56. data/lib/axlsx/drawing/view_3D.rb +2 -2
  57. data/lib/axlsx/drawing/vml_drawing.rb +1 -1
  58. data/lib/axlsx/package.rb +33 -31
  59. data/lib/axlsx/rels/relationship.rb +1 -1
  60. data/lib/axlsx/rels/relationships.rb +7 -4
  61. data/lib/axlsx/stylesheet/border_pr.rb +2 -2
  62. data/lib/axlsx/stylesheet/cell_alignment.rb +1 -3
  63. data/lib/axlsx/stylesheet/cell_protection.rb +1 -3
  64. data/lib/axlsx/stylesheet/cell_style.rb +1 -3
  65. data/lib/axlsx/stylesheet/color.rb +1 -3
  66. data/lib/axlsx/stylesheet/font.rb +1 -1
  67. data/lib/axlsx/stylesheet/gradient_stop.rb +1 -1
  68. data/lib/axlsx/stylesheet/num_fmt.rb +10 -3
  69. data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
  70. data/lib/axlsx/stylesheet/styles.rb +7 -7
  71. data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
  72. data/lib/axlsx/util/accessors.rb +6 -6
  73. data/lib/axlsx/util/constants.rb +107 -99
  74. data/lib/axlsx/util/mime_type_utils.rb +11 -0
  75. data/lib/axlsx/util/options_parser.rb +2 -1
  76. data/lib/axlsx/util/parser.rb +4 -4
  77. data/lib/axlsx/util/serialized_attributes.rb +16 -6
  78. data/lib/axlsx/util/simple_typed_list.rb +28 -52
  79. data/lib/axlsx/util/storage.rb +4 -4
  80. data/lib/axlsx/util/validators.rb +29 -17
  81. data/lib/axlsx/version.rb +1 -1
  82. data/lib/axlsx/workbook/defined_name.rb +11 -12
  83. data/lib/axlsx/workbook/defined_names.rb +2 -2
  84. data/lib/axlsx/workbook/shared_strings_table.rb +5 -5
  85. data/lib/axlsx/workbook/workbook.rb +36 -11
  86. data/lib/axlsx/workbook/workbook_view.rb +80 -0
  87. data/lib/axlsx/workbook/workbook_views.rb +22 -0
  88. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +2 -2
  89. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +1 -3
  90. data/lib/axlsx/workbook/worksheet/break.rb +1 -3
  91. data/lib/axlsx/workbook/worksheet/cell.rb +136 -74
  92. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +63 -43
  93. data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
  94. data/lib/axlsx/workbook/worksheet/cfvos.rb +4 -1
  95. data/lib/axlsx/workbook/worksheet/col.rb +7 -10
  96. data/lib/axlsx/workbook/worksheet/col_breaks.rb +2 -2
  97. data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
  98. data/lib/axlsx/workbook/worksheet/comment.rb +5 -6
  99. data/lib/axlsx/workbook/worksheet/comments.rb +9 -12
  100. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +1 -1
  101. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +1 -1
  102. data/lib/axlsx/workbook/worksheet/data_bar.rb +4 -6
  103. data/lib/axlsx/workbook/worksheet/data_validation.rb +6 -4
  104. data/lib/axlsx/workbook/worksheet/dimension.rb +2 -2
  105. data/lib/axlsx/workbook/worksheet/header_footer.rb +6 -8
  106. data/lib/axlsx/workbook/worksheet/icon_set.rb +3 -5
  107. data/lib/axlsx/workbook/worksheet/merged_cells.rb +4 -2
  108. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
  109. data/lib/axlsx/workbook/worksheet/page_margins.rb +1 -3
  110. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -1
  111. data/lib/axlsx/workbook/worksheet/page_setup.rb +21 -23
  112. data/lib/axlsx/workbook/worksheet/pane.rb +1 -3
  113. data/lib/axlsx/workbook/worksheet/pivot_table.rb +44 -28
  114. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +4 -4
  115. data/lib/axlsx/workbook/worksheet/print_options.rb +1 -3
  116. data/lib/axlsx/workbook/worksheet/protected_range.rb +1 -3
  117. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -2
  118. data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
  119. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
  120. data/lib/axlsx/workbook/worksheet/row.rb +40 -51
  121. data/lib/axlsx/workbook/worksheet/row_breaks.rb +2 -2
  122. data/lib/axlsx/workbook/worksheet/selection.rb +1 -3
  123. data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
  124. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
  125. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +1 -3
  126. data/lib/axlsx/workbook/worksheet/table.rb +6 -6
  127. data/lib/axlsx/workbook/worksheet/table_style_info.rb +1 -3
  128. data/lib/axlsx/workbook/worksheet/tables.rb +4 -1
  129. data/lib/axlsx/workbook/worksheet/worksheet.rb +64 -78
  130. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
  131. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
  132. data/test/drawing/tc_area_chart.rb +39 -0
  133. data/test/drawing/tc_area_series.rb +71 -0
  134. data/test/drawing/tc_axis.rb +27 -0
  135. data/test/drawing/tc_bar_chart.rb +71 -0
  136. data/test/drawing/tc_bubble_chart.rb +44 -0
  137. data/test/drawing/tc_bubble_series.rb +21 -0
  138. data/test/drawing/tc_chart.rb +23 -10
  139. data/test/drawing/tc_data_source.rb +6 -0
  140. data/test/drawing/tc_drawing.rb +2 -2
  141. data/test/drawing/tc_line_chart.rb +5 -5
  142. data/test/drawing/tc_line_series.rb +47 -6
  143. data/test/drawing/tc_pic.rb +11 -15
  144. data/test/drawing/tc_scatter_series.rb +36 -1
  145. data/test/drawing/tc_str_val.rb +9 -0
  146. data/test/drawing/tc_title.rb +5 -0
  147. data/test/stylesheet/tc_styles.rb +2 -2
  148. data/test/tc_axlsx.rb +31 -0
  149. data/test/tc_helper.rb +2 -0
  150. data/test/tc_package.rb +19 -1
  151. data/test/util/tc_mime_type_utils.rb +13 -0
  152. data/test/util/tc_simple_typed_list.rb +2 -3
  153. data/test/util/tc_validators.rb +34 -10
  154. data/test/workbook/tc_defined_name.rb +12 -4
  155. data/test/workbook/tc_shared_strings_table.rb +16 -1
  156. data/test/workbook/tc_workbook.rb +38 -3
  157. data/test/workbook/tc_workbook_view.rb +50 -0
  158. data/test/workbook/worksheet/auto_filter/tc_filters.rb +1 -1
  159. data/test/workbook/worksheet/tc_break.rb +1 -1
  160. data/test/workbook/worksheet/tc_cell.rb +76 -8
  161. data/test/workbook/worksheet/tc_col.rb +2 -2
  162. data/test/workbook/worksheet/tc_conditional_formatting.rb +2 -2
  163. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  164. data/test/workbook/worksheet/tc_data_validation.rb +11 -11
  165. data/test/workbook/worksheet/tc_header_footer.rb +2 -2
  166. data/test/workbook/worksheet/tc_icon_set.rb +1 -1
  167. data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
  168. data/test/workbook/worksheet/tc_page_setup.rb +3 -3
  169. data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
  170. data/test/workbook/worksheet/tc_print_options.rb +1 -1
  171. data/test/workbook/worksheet/tc_rich_text.rb +44 -0
  172. data/test/workbook/worksheet/tc_rich_text_run.rb +172 -0
  173. data/test/workbook/worksheet/tc_row.rb +7 -2
  174. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +1 -1
  175. data/test/workbook/worksheet/tc_sheet_format_pr.rb +4 -4
  176. data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
  177. data/test/workbook/worksheet/tc_sheet_protection.rb +5 -5
  178. data/test/workbook/worksheet/tc_sheet_view.rb +4 -4
  179. data/test/workbook/worksheet/tc_table.rb +2 -3
  180. data/test/workbook/worksheet/tc_worksheet.rb +99 -45
  181. metadata +89 -16
@@ -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.inject(str) { |string, axis| string << '<c:axId val="' << axis[1].id.to_s << '"/>' }
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
@@ -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
- str << '<c:numFmt formatCode="' << @format_code << '" sourceLinked="1"/>'
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 |str_inner|
129
- str_inner << '<c:bar3DChart>'
130
- str_inner << '<c:barDir val="' << bar_dir.to_s << '"/>'
131
- str_inner << '<c:grouping val="' << grouping.to_s << '"/>'
132
- str_inner << '<c:varyColors val="' << vary_colors.to_s << '"/>'
133
- @series.each { |ser| ser.to_xml_string(str_inner) }
134
- @d_lbls.to_xml_string(str_inner) if @d_lbls
135
- str_inner << '<c:gapWidth val="' << @gap_width.to_s << '"/>' unless @gap_width.nil?
136
- str_inner << '<c:gapDepth val="' << @gap_depth.to_s << '"/>' unless @gap_depth.nil?
137
- str_inner << '<c:shape val="' << @shape.to_s << '"/>' unless @shape.nil?
138
- axes.to_xml_string(str_inner, :ids => true)
139
- str_inner << '</c:bar3DChart>'
140
- axes.to_xml_string(str_inner)
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 |str_inner|
55
+ super(str) do
56
56
 
57
57
  colors.each_with_index do |c, index|
58
- str_inner << '<c:dPt>'
59
- str_inner << '<c:idx val="' << index.to_s << '"/>'
60
- str_inner << '<c:spPr><a:solidFill>'
61
- str_inner << '<a:srgbClr val="' << c << '"/>'
62
- str_inner << '</a:solidFill></c:spPr></c:dPt>'
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(str_inner) unless @labels.nil?
66
- @data.to_xml_string(str_inner) unless @data.nil?
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
- str_inner << '<c:shape val="' << shape.to_s << '"></c:shape>'
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
 
@@ -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 str if block_given?
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="r"/>'
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"/>'