axlsx 1.0.0

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.
Files changed (179) hide show
  1. data/Rakefile +13 -0
  2. data/lib/axlsx.rb +38 -0
  3. data/lib/axlsx/content_type/content_type.rb +23 -0
  4. data/lib/axlsx/content_type/default.rb +32 -0
  5. data/lib/axlsx/content_type/override.rb +30 -0
  6. data/lib/axlsx/doc_props/app.rb +148 -0
  7. data/lib/axlsx/doc_props/core.rb +34 -0
  8. data/lib/axlsx/drawing/axis.rb +78 -0
  9. data/lib/axlsx/drawing/bar_3D_chart.rb +138 -0
  10. data/lib/axlsx/drawing/bar_series.rb +91 -0
  11. data/lib/axlsx/drawing/cat_axis.rb +58 -0
  12. data/lib/axlsx/drawing/chart.rb +120 -0
  13. data/lib/axlsx/drawing/drawing.rb +121 -0
  14. data/lib/axlsx/drawing/graphic_frame.rb +55 -0
  15. data/lib/axlsx/drawing/marker.rb +57 -0
  16. data/lib/axlsx/drawing/pie_3D_chart.rb +59 -0
  17. data/lib/axlsx/drawing/pie_series.rb +88 -0
  18. data/lib/axlsx/drawing/scaling.rb +53 -0
  19. data/lib/axlsx/drawing/series.rb +70 -0
  20. data/lib/axlsx/drawing/title.rb +69 -0
  21. data/lib/axlsx/drawing/two_cell_anchor.rb +88 -0
  22. data/lib/axlsx/drawing/val_axis.rb +34 -0
  23. data/lib/axlsx/drawing/view_3D.rb +72 -0
  24. data/lib/axlsx/package.rb +181 -0
  25. data/lib/axlsx/rels/relationship.rb +43 -0
  26. data/lib/axlsx/rels/relationships.rb +25 -0
  27. data/lib/axlsx/stylesheet/border.rb +52 -0
  28. data/lib/axlsx/stylesheet/border_pr.rb +65 -0
  29. data/lib/axlsx/stylesheet/cell_alignment.rb +96 -0
  30. data/lib/axlsx/stylesheet/cell_protection.rb +33 -0
  31. data/lib/axlsx/stylesheet/cell_style.rb +60 -0
  32. data/lib/axlsx/stylesheet/color.rb +57 -0
  33. data/lib/axlsx/stylesheet/fill.rb +31 -0
  34. data/lib/axlsx/stylesheet/font.rb +128 -0
  35. data/lib/axlsx/stylesheet/gradient_fill.rb +70 -0
  36. data/lib/axlsx/stylesheet/gradient_stop.rb +31 -0
  37. data/lib/axlsx/stylesheet/num_fmt.rb +61 -0
  38. data/lib/axlsx/stylesheet/pattern_fill.rb +64 -0
  39. data/lib/axlsx/stylesheet/styles.rb +296 -0
  40. data/lib/axlsx/stylesheet/table_style.rb +44 -0
  41. data/lib/axlsx/stylesheet/table_style_element.rb +66 -0
  42. data/lib/axlsx/stylesheet/table_styles.rb +39 -0
  43. data/lib/axlsx/stylesheet/xf.rb +117 -0
  44. data/lib/axlsx/util/constants.rb +189 -0
  45. data/lib/axlsx/util/simple_typed_list.rb +150 -0
  46. data/lib/axlsx/util/validators.rb +132 -0
  47. data/lib/axlsx/workbook/workbook.rb +130 -0
  48. data/lib/axlsx/workbook/worksheet/cell.rb +184 -0
  49. data/lib/axlsx/workbook/worksheet/row.rb +92 -0
  50. data/lib/axlsx/workbook/worksheet/worksheet.rb +194 -0
  51. data/lib/schema/dc.xsd +118 -0
  52. data/lib/schema/dcmitype.xsd +50 -0
  53. data/lib/schema/dcterms.xsd +331 -0
  54. data/lib/schema/dml-chart.xsd +1499 -0
  55. data/lib/schema/dml-chartDrawing.xsd +146 -0
  56. data/lib/schema/dml-compatibility.xsd +14 -0
  57. data/lib/schema/dml-diagram.xsd +1091 -0
  58. data/lib/schema/dml-lockedCanvas.xsd +11 -0
  59. data/lib/schema/dml-main.xsd +3048 -0
  60. data/lib/schema/dml-picture.xsd +23 -0
  61. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -0
  62. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -0
  63. data/lib/schema/opc-contentTypes.xsd +42 -0
  64. data/lib/schema/opc-coreProperties.xsd +50 -0
  65. data/lib/schema/opc-digSig.xsd +49 -0
  66. data/lib/schema/opc-relationships.xsd +33 -0
  67. data/lib/schema/pml.xsd +1676 -0
  68. data/lib/schema/shared-additionalCharacteristics.xsd +28 -0
  69. data/lib/schema/shared-bibliography.xsd +144 -0
  70. data/lib/schema/shared-commonSimpleTypes.xsd +166 -0
  71. data/lib/schema/shared-customXmlDataProperties.xsd +25 -0
  72. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -0
  73. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -0
  74. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -0
  75. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -0
  76. data/lib/schema/shared-math.xsd +582 -0
  77. data/lib/schema/shared-relationshipReference.xsd +25 -0
  78. data/lib/schema/sml.xsd +4430 -0
  79. data/lib/schema/vml-main.xsd +569 -0
  80. data/lib/schema/vml-officeDrawing.xsd +509 -0
  81. data/lib/schema/vml-presentationDrawing.xsd +12 -0
  82. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -0
  83. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -0
  84. data/lib/schema/wml.xsd +3644 -0
  85. data/lib/schema/xml.xsd +117 -0
  86. data/test/content_type/tc_content_type.rb +81 -0
  87. data/test/content_type/tc_content_type.rb~ +81 -0
  88. data/test/content_type/tc_default.rb +40 -0
  89. data/test/content_type/tc_default.rb~ +40 -0
  90. data/test/content_type/tc_override.rb +40 -0
  91. data/test/content_type/tc_override.rb~ +40 -0
  92. data/test/doc_props/tc_app.rb +19 -0
  93. data/test/doc_props/tc_app.rb~ +19 -0
  94. data/test/doc_props/tc_core.rb +34 -0
  95. data/test/drawing/tc_axis.rb +39 -0
  96. data/test/drawing/tc_axis.rb~ +0 -0
  97. data/test/drawing/tc_bar_3D_chart.rb +66 -0
  98. data/test/drawing/tc_bar_3D_chart.rb~ +4 -0
  99. data/test/drawing/tc_bar_series.rb +34 -0
  100. data/test/drawing/tc_bar_series.rb~ +31 -0
  101. data/test/drawing/tc_cat_axis.rb +32 -0
  102. data/test/drawing/tc_cat_axis.rb~ +39 -0
  103. data/test/drawing/tc_chart.rb +59 -0
  104. data/test/drawing/tc_chart.rb~ +58 -0
  105. data/test/drawing/tc_drawing.rb +71 -0
  106. data/test/drawing/tc_graphic_frame.rb +26 -0
  107. data/test/drawing/tc_graphic_frame.rb~ +21 -0
  108. data/test/drawing/tc_marker.rb +45 -0
  109. data/test/drawing/tc_marker.rb~ +26 -0
  110. data/test/drawing/tc_pie_3D_chart.rb +33 -0
  111. data/test/drawing/tc_pie_3D_chart.rb~ +58 -0
  112. data/test/drawing/tc_pie_series.rb +35 -0
  113. data/test/drawing/tc_pie_series.rb~ +26 -0
  114. data/test/drawing/tc_scaling.rb +37 -0
  115. data/test/drawing/tc_scaling.rb~ +45 -0
  116. data/test/drawing/tc_series.rb +24 -0
  117. data/test/drawing/tc_series.rb~ +31 -0
  118. data/test/drawing/tc_title.rb +34 -0
  119. data/test/drawing/tc_title.rb~ +37 -0
  120. data/test/drawing/tc_two_cell_anchor.rb +37 -0
  121. data/test/drawing/tc_two_cell_anchor.rb~ +35 -0
  122. data/test/drawing/tc_val_axis.rb +20 -0
  123. data/test/drawing/tc_val_axis.rb~ +32 -0
  124. data/test/drawing/tc_view_3D.rb +46 -0
  125. data/test/drawing/tc_view_3D.rb~ +37 -0
  126. data/test/rels/tc_relationship.rb +16 -0
  127. data/test/rels/tc_relationship.rb~ +39 -0
  128. data/test/rels/tc_relationships.rb +32 -0
  129. data/test/rels/tc_relationships.rb~ +37 -0
  130. data/test/stylesheet/tc_border.rb +38 -0
  131. data/test/stylesheet/tc_border.rb~ +31 -0
  132. data/test/stylesheet/tc_border_pr.rb +33 -0
  133. data/test/stylesheet/tc_border_pr.rb~ +31 -0
  134. data/test/stylesheet/tc_cell_alignment.rb +77 -0
  135. data/test/stylesheet/tc_cell_alignment.rb~ +38 -0
  136. data/test/stylesheet/tc_cell_protection.rb +30 -0
  137. data/test/stylesheet/tc_cell_protection.rb~ +77 -0
  138. data/test/stylesheet/tc_cell_style.rb +58 -0
  139. data/test/stylesheet/tc_cell_style.rb~ +30 -0
  140. data/test/stylesheet/tc_color.rb +38 -0
  141. data/test/stylesheet/tc_color.rb~ +38 -0
  142. data/test/stylesheet/tc_fill.rb +19 -0
  143. data/test/stylesheet/tc_fill.rb~ +19 -0
  144. data/test/stylesheet/tc_font.rb +114 -0
  145. data/test/stylesheet/tc_font.rb~ +19 -0
  146. data/test/stylesheet/tc_gradient_fill.rb +65 -0
  147. data/test/stylesheet/tc_gradient_fill.rb~ +114 -0
  148. data/test/stylesheet/tc_gradient_stop.rb +32 -0
  149. data/test/stylesheet/tc_gradient_stop.rb~ +65 -0
  150. data/test/stylesheet/tc_num_fmt.rb +31 -0
  151. data/test/stylesheet/tc_num_fmt.rb~ +32 -0
  152. data/test/stylesheet/tc_pattern_fill.rb +38 -0
  153. data/test/stylesheet/tc_pattern_fill.rb~ +31 -0
  154. data/test/stylesheet/tc_styles.rb +64 -0
  155. data/test/stylesheet/tc_table_style.rb +37 -0
  156. data/test/stylesheet/tc_table_style.rb~ +38 -0
  157. data/test/stylesheet/tc_table_style_element.rb +37 -0
  158. data/test/stylesheet/tc_table_style_element.rb~ +37 -0
  159. data/test/stylesheet/tc_table_styles.rb +30 -0
  160. data/test/stylesheet/tc_table_styles.rb~ +37 -0
  161. data/test/stylesheet/tc_xf.rb +121 -0
  162. data/test/stylesheet/tc_xf.rb~ +30 -0
  163. data/test/tc_app.rb~ +19 -0
  164. data/test/tc_border_pr.rb~ +21 -0
  165. data/test/tc_package.rb +70 -0
  166. data/test/tc_package.rb~ +64 -0
  167. data/test/tc_pie_3D_chart.rb~ +66 -0
  168. data/test/tc_relationships.rb~ +37 -0
  169. data/test/tc_series.rb~ +31 -0
  170. data/test/tc_styles.rb~ +64 -0
  171. data/test/tc_validators.rb~ +77 -0
  172. data/test/tc_worksheet.rb~ +85 -0
  173. data/test/util/tc_simple_typed_list.rb +66 -0
  174. data/test/util/tc_validators.rb +76 -0
  175. data/test/workbook/tc_workbook.rb +53 -0
  176. data/test/workbook/worksheet/tc_cell.rb +78 -0
  177. data/test/workbook/worksheet/tc_row.rb +30 -0
  178. data/test/workbook/worksheet/tc_worksheet.rb +85 -0
  179. metadata +378 -0
@@ -0,0 +1,57 @@
1
+ module Axlsx
2
+ # The Marker class defines a point in the worksheet that drawing anchors attach to.
3
+ # @note The recommended way to manage markers is Worksheet#add_chart Markers are created for a two cell anchor based on the :start and :end options.
4
+ # @see Worksheet#add_chart
5
+ class Marker
6
+
7
+ # The column this marker anchors to
8
+ # @return [Integer]
9
+ attr_accessor :col
10
+
11
+ # The offset distance from this marker's column
12
+ # @return [Integer]
13
+ attr_accessor :colOff
14
+
15
+ # The row this marker anchors to
16
+ # @return [Integer]
17
+ attr_accessor :row
18
+
19
+ # The offset distance from this marker's row
20
+ # @return [Integer]
21
+ attr_accessor :rowOff
22
+
23
+ # Creates a new Marker object
24
+ # @option options [Integer] col
25
+ # @option options [Integer] colOff
26
+ # @option options [Integer] row
27
+ # @option options [Integer] rowOff
28
+ def initialize(options={})
29
+ @col, @colOff, @row, @rowOff = 0, 0, 0, 0
30
+ options.each do |o|
31
+ self.send("#{o[0]}=", o[1]) if self.respond_to? o[0]
32
+ end
33
+ end
34
+
35
+ def col=(v) Axlsx::validate_unsigned_int v; @col = v end
36
+ def colOff=(v) Axlsx::validate_int v; @colOff = v end
37
+ def row=(v) Axlsx::validate_unsigned_int v; @row = v end
38
+ def rowOff=(v) Axlsx::validate_int v; @rowOff = v end
39
+
40
+ # shortcut to set the column, row position for this marker
41
+ # @param col the column for the marker
42
+ # @param row the row of the marker
43
+ def coord(col, row)
44
+ self.col = col
45
+ self.row = row
46
+ end
47
+ # Serializes the marker
48
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
49
+ # @return [String]
50
+ def to_xml(xml)
51
+ [:col, :colOff, :row, :rowOff].each do |k|
52
+ xml.send("xdr:#{k.to_s}", self.send(k))
53
+ end
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,59 @@
1
+ module Axlsx
2
+
3
+
4
+ # The Pie3DChart is a three dimentional piechart (who would have guessed?) that you can add to your worksheet.
5
+ # @example Creating a chart
6
+ # # This example creates two charts in a single sheet.
7
+ # # The first uses data directly fed to the sheet, while the second references cells withing the worksheet for data.
8
+ #
9
+ # require "rubygems" # if that is your preferred way to manage gems!
10
+ # require "axlsx"
11
+ #
12
+ # p = Axlsx::Package.new
13
+ # ws = p.workbook.add_worksheet
14
+ # ws.add_row :values => ["This is a chart with no data in the sheet"]
15
+ #
16
+ # chart = ws.add_chart(Axlsx::Pie3DChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
17
+ # chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
18
+ #
19
+ # ws.add_row :values => ["This chart uses the data below"]
20
+ # title_row = ws.add_row :values => ["Least Popular Pets"]
21
+ # label_row = ws.add_row :values => ["", "Dry Skinned Reptiles", "Bald Cats", "Violent Parrots"]
22
+ # data_row = ws.add_row :values => ["Votes", 6, 4, 1]
23
+ #
24
+ # chart = ws.add_chart(Axlsx::Pie3DChart, :start_at => [0,11], :end_at =>[0,16], :title => title_row.cells.last)
25
+ # chart.add_series :data => data_row.cells[(1..-1)], :labels => label_row.cells
26
+ #
27
+ # f = File.open('example_pie_3d_chart.xlsx', 'w')
28
+ # p.serialize(f)
29
+ #
30
+ # @see Worksheet#add_chart
31
+ # @see Worksheet#add_row
32
+ # @see Chart#add_series
33
+ # @see Series
34
+ # @see Package#serialize
35
+ class Pie3DChart < Chart
36
+
37
+
38
+ # Creates a new pie chart object
39
+ # @param [Workbook] workbook The workbook that owns this chart.
40
+ # @option options [Cell, String] title
41
+ def initialize(workbook, options={})
42
+ super(workbook, options)
43
+ # this charts series type
44
+ @series_type = PieSeries
45
+ @view3D = View3D.new(:rotX => 30, :perspective => 30)
46
+ end
47
+
48
+ # Serializes the pie chart
49
+ # @return [String]
50
+ def to_xml
51
+ super() do |xml|
52
+ xml.send('c:pie3DChart') {
53
+ xml.send('c:varyColors', :val=>1)
54
+ @series.each { |ser| ser.to_xml(xml) }
55
+ }
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,88 @@
1
+ module Axlsx
2
+ # A PieSeries defines the title, data and labels for pie charts
3
+ # @note The recommended way to manage series is to use Chart#add_series
4
+ # @see Worksheet#add_chart
5
+ # @see Chart#add_series
6
+ class PieSeries < Series
7
+
8
+ # The data for this series.
9
+ # @return [Array, SimpleTypedList]
10
+ attr_reader :data
11
+
12
+
13
+ # The labels for this series.
14
+ # @return [Array, SimpleTypedList]
15
+ attr_reader :labels
16
+
17
+
18
+ # The explosion for this series
19
+ # @return [Array, SimpleTypedList]
20
+ attr_accessor :explosion
21
+
22
+ # Creates a new series
23
+ # @option options [Array, SimpleTypedList] data
24
+ # @option options [Array, SimpleTypedList] labels
25
+ # @option options [String] title
26
+ # @option options [Integer] explosion
27
+ # @param [Chart] chart
28
+ def initialize(chart, options={})
29
+ super(chart, options)
30
+ self.data = options[:data] || []
31
+ self.labels = options[:labels] || []
32
+ end
33
+
34
+ def explosion=(v) Axlsx::validate_unsigned_int(v); @explosion = v; end
35
+ # Serializes the series
36
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
37
+ # @return [String]
38
+ def to_xml(xml)
39
+ super(xml) do |xml|
40
+ xml.send('c:explosion', :val=>@explosion) unless @explosion.nil?
41
+ if !labels.empty?
42
+ xml.send('c:cat') {
43
+ xml.send('c:strRef') {
44
+ xml.send('c:f', Axlsx::cell_range(labels))
45
+ xml.send('c:strCache') {
46
+ xml.send('c:ptCount', :val=>labels.size)
47
+ labels.each_with_index do |cell, index|
48
+ v = cell.is_a?(Cell) ? cell.value : cell
49
+ xml.send('c:pt', :idx=>index) {
50
+ xml.send('c:v', v)
51
+ }
52
+ end
53
+ }
54
+ }
55
+ }
56
+ end
57
+ xml.send('c:val') {
58
+ xml.send('c:numRef') {
59
+ xml.send('c:f', Axlsx::cell_range(data))
60
+ xml.send('c:numCache') {
61
+ xml.send('c:formatCode', 'General')
62
+ xml.send('c:ptCount', :val=>data.size)
63
+ data.each_with_index do |cell, index|
64
+ v = cell.is_a?(Cell) ? cell.value : cell
65
+ xml.send('c:pt', :idx=>index) {
66
+ xml.send('c:v', v)
67
+ }
68
+ end
69
+ }
70
+ }
71
+ }
72
+
73
+ end
74
+ end
75
+
76
+
77
+ private
78
+
79
+
80
+ # assigns the data for this series
81
+ def data=(v) DataTypeValidator.validate "Series.data", [Array, SimpleTypedList], v; @data = v; end
82
+
83
+ # assigns the labels for this series
84
+ def labels=(v) DataTypeValidator.validate "Series.labels", [Array, SimpleTypedList], v; @labels = v; end
85
+
86
+ end
87
+
88
+ end
@@ -0,0 +1,53 @@
1
+ module Axlsx
2
+ # The Scaling class defines axis scaling
3
+ class Scaling
4
+
5
+ # logarithmic base for a logarithmic axis.
6
+ # must be between 2 and 1000
7
+ # @return [Integer]
8
+ attr_accessor :logBase
9
+
10
+ # the orientation of the axis
11
+ # must be one of [:minMax, :maxMin]
12
+ # @return [Symbol]
13
+ attr_accessor :orientation
14
+
15
+ # the maximum scaling
16
+ # @return [Float]
17
+ attr_accessor :max
18
+
19
+ # the minimu scaling
20
+ # @return [Float]
21
+ attr_accessor :min
22
+
23
+ # creates a new Scaling object
24
+ # @option options [Integer, Fixnum] logBase
25
+ # @option options [Symbol] orientation
26
+ # @option options [Float] max
27
+ # @option options [Float] min
28
+ def initialize(options={})
29
+ @orientation = :minMax
30
+ options.each do |o|
31
+ self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
32
+ end
33
+ end
34
+
35
+ def logBase=(v) DataTypeValidator.validate "Scaling.logBase", [Integer, Fixnum], v, lambda { |v| v >= 2 && v <= 1000}; @logBase = v; end
36
+ def orientation=(v) RestrictionValidator.validate "Scaling.orientation", [:minMax, :maxMin], v; @orientation = v; end
37
+ def max=(v) DataTypeValidator.validate "Scaling.max", Float, v; @max = v; end
38
+ def min=(v) DataTypeValidator.validate "Scaling.min", Float, v; @min = v; end
39
+
40
+ # Serializes the axId
41
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
42
+ # @return [String]
43
+ def to_xml(xml)
44
+ xml.send('c:scaling') {
45
+ xml.send('c:logBase', :val=> @logBase) unless @logBase.nil?
46
+ xml.send('c:orientation', :val=> @orientation) unless @orientation.nil?
47
+ xml.send('c:min', :val => @min) unless @min.nil?
48
+ xml.send('c:max', :val => @max) unless @max.nil?
49
+ }
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,70 @@
1
+ module Axlsx
2
+ # A Series defines the title, data and labels for chart data.
3
+ # @note The recommended way to manage series is to use Chart#add_series
4
+ # @see Worksheet#add_chart
5
+ # @see Chart#add_series
6
+ class Series
7
+
8
+ # The chart that owns this series
9
+ # @return [Chart]
10
+ attr_reader :chart
11
+
12
+ # The index of this series in the chart's series.
13
+ # @return [Integer]
14
+ attr_reader :index
15
+
16
+ # The order of this series in the chart's series.
17
+ # @return [Integer]
18
+ attr_accessor :order
19
+
20
+ # The title of the series
21
+ # @return [String]
22
+ attr_accessor :title
23
+
24
+ # Creates a new series
25
+ # @param [Chart] chart
26
+ # @option options [Integer] order
27
+ # @option options [String] title
28
+ def initialize(chart, options={})
29
+ self.chart = chart
30
+ @chart.series << self
31
+ options.each do |o|
32
+ self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
33
+ end
34
+ end
35
+
36
+ # retrieves the series index in the chart's series collection
37
+ def index
38
+ @chart.series.index(self)
39
+ end
40
+
41
+ def order=(v) Axlsx::validate_unsigned_int(v); @order = v; end
42
+
43
+ def order
44
+ @order || index
45
+ end
46
+
47
+ def title=(v) Axlsx::validate_string(v); @title = v; end
48
+
49
+ private
50
+
51
+ # assigns the chart for this series
52
+ def chart=(v) DataTypeValidator.validate "Series.chart", Chart, v; @chart = v; end
53
+
54
+ # Serializes the series
55
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
56
+ # @return [String]
57
+ def to_xml(xml)
58
+ xml.send('c:ser') {
59
+ xml.send('c:idx', :val=>index)
60
+ xml.send('c:order', :val=>order || index)
61
+ xml.send('c:tx') {
62
+ xml.send('c:v', self.title)
63
+ }
64
+ yield xml if block_given?
65
+ }
66
+ end
67
+
68
+ end
69
+
70
+ end
@@ -0,0 +1,69 @@
1
+ module Axlsx
2
+ # A Title stores information about the title of a chart
3
+ class Title
4
+
5
+ # The text to be shown. Setting this property directly with a string will remove the cell reference.
6
+ # @return [String]
7
+ attr_accessor :text
8
+
9
+ # The cell that holds the text for the title. Setting this property will automatically update the text attribute.
10
+ # @return [Cell]
11
+ attr_accessor :cell
12
+
13
+ # Creates a new Title object
14
+ # @param [String, Cell] title The cell or string to be used for the chart's title
15
+ def initialize(title="")
16
+ self.cell = title if title.is_a?(Cell)
17
+ self.text = title.to_s unless title.is_a?(Cell)
18
+ end
19
+
20
+ def text=(v)
21
+ DataTypeValidator.validate 'Title.text', String, v
22
+ @text = v
23
+ @cell = nil
24
+ v
25
+ end
26
+
27
+ def cell=(v)
28
+ DataTypeValidator.validate 'Title.text', Cell, v
29
+ @cell = v
30
+ @text = v.value.to_s
31
+ v
32
+ end
33
+
34
+ # Not implemented at this time.
35
+ #def tx=(v) DataTypeValidator.validate 'Title.tx', Tx, v; @tx=v; end
36
+ #def layout=(v) DataTypeValidator.validate 'Title.layout', Layout, v; @layout = v; end
37
+ #def overlay=(v) Axlsx::validate_boolean v; @overlay=v; end
38
+ #def spPr=(v) DataTypeValidator.validate 'Title.spPr', SpPr, v; @spPr = v; end
39
+
40
+ # Serializes the chart title
41
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
42
+ # @return [String]
43
+ def to_xml(xml)
44
+ xml.send('c:title') {
45
+ xml.send('c:tx') {
46
+ xml.send('c:strRef') {
47
+ xml.send('c:f', range)
48
+ xml.send('c:strCache') {
49
+ xml.send('c:ptCount', :val=>1)
50
+ xml.send('c:pt', :idx=>0) {
51
+ xml.send('c:v', @text)
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ end
58
+
59
+ private
60
+
61
+ # returns the excel style abslute reference for the title when title is a Cell object
62
+ # @return [String]
63
+ def range
64
+ return "" unless @data.is_a?(Cell)
65
+ "#{@data.row.worksheet.name}!#{data.row.r_abs}"
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,88 @@
1
+ module Axlsx
2
+ # This class details the anchor points for drawings.
3
+ # @note The recommended way to manage drawings and charts is Worksheet#add_chart. Anchors are specified by the :start_at and :end_at options to that method.
4
+ # @see Worksheet#add_chart
5
+ class TwoCellAnchor
6
+
7
+ # A marker that defines the from cell anchor. The default from column and row are 0 and 0 respectively
8
+ # @return [Marker]
9
+ attr_reader :from
10
+ # A marker that returns the to cell anchor. The default to column and row are 5 and 10 respectively
11
+ # @return [Marker]
12
+ attr_reader :to
13
+
14
+ # The frame for your chart
15
+ # @return [GraphicFrame]
16
+ attr_reader :graphic_frame
17
+
18
+ # The drawing that holds this anchor
19
+ # @return [Drawing]
20
+ attr_reader :drawing
21
+
22
+ # The index of this anchor in the drawing
23
+ # @return [Integer]
24
+ attr_reader :index
25
+
26
+ # Creates a new TwoCellAnchor object
27
+ # @param [Drawing] drawing
28
+ # @param [Chart] chart
29
+ # @option options [Array] start_at
30
+ # @option options [Array] end_at
31
+ def initialize(drawing, chart_type, options)
32
+ @drawing = drawing
33
+ drawing.anchors << self
34
+
35
+ @from, @to = Marker.new, Marker.new(:col => 5, :row=>10)
36
+ @graphic_frame = GraphicFrame.new(self, chart_type, options)
37
+
38
+ self.start_at(options[:start_at][0], options[:start_at][1]) if options[:start_at].is_a?(Array)
39
+ self.end_at(options[:end_at][0], options[:end_at][1]) if options[:end_at].is_a?(Array)
40
+ # passing a reference to our start and end markers for convenience
41
+ # this lets us access the markers directly from the chart.
42
+ @graphic_frame.chart.send(:start_at=, @from)
43
+ @graphic_frame.chart.send(:end_at=, @to)
44
+ end
45
+
46
+ def index
47
+ @drawing.anchors.index(self)
48
+ end
49
+
50
+
51
+ # This is a short cut method to set the start anchor position
52
+ # @param [Integer] x The column
53
+ # @param [Integer] y The row
54
+ # @return [Marker]
55
+ def start_at(x, y)
56
+ @from.col = x
57
+ @from.row = y
58
+ @from
59
+ end
60
+
61
+ # This is a short cut method to set the end anchor position
62
+ # @param [Integer] x The column
63
+ # @param [Integer] y The row
64
+ # @return [Marker]
65
+ def end_at(x, y)
66
+ @to.col = x
67
+ @to.row = y
68
+ @to
69
+ end
70
+
71
+ # Serializes the two cell anchor
72
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
73
+ # @return [String]
74
+ def to_xml(xml)
75
+ #build it for now, break it down later!
76
+ xml.send('xdr:twoCellAnchor') {
77
+ xml.send('xdr:from') {
78
+ from.to_xml(xml)
79
+ }
80
+ xml.send('xdr:to') {
81
+ to.to_xml(xml)
82
+ }
83
+ @graphic_frame.to_xml(xml)
84
+ xml.send('xdr:clientData')
85
+ }
86
+ end
87
+ end
88
+ end