axlsx 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/LICENSE +22 -0
  2. data/README.md +70 -0
  3. data/lib/axlsx.rb~ +67 -0
  4. data/lib/axlsx/content_type/content_type.rb~ +20 -0
  5. data/lib/axlsx/content_type/default.rb~ +32 -0
  6. data/lib/axlsx/content_type/override.rb~ +30 -0
  7. data/lib/axlsx/doc_props/app.rb~ +127 -0
  8. data/lib/axlsx/doc_props/core.rb~ +25 -0
  9. data/lib/axlsx/drawing/axis.rb~ +0 -0
  10. data/lib/axlsx/drawing/bar_3D_chart.rb~ +64 -0
  11. data/lib/axlsx/drawing/bar_series.rb~ +92 -0
  12. data/lib/axlsx/drawing/cat_axis.rb~ +32 -0
  13. data/lib/axlsx/drawing/chart.rb~ +0 -0
  14. data/lib/axlsx/drawing/drawing.rb~ +102 -0
  15. data/lib/axlsx/drawing/graphic_frame.rb~ +40 -0
  16. data/lib/axlsx/drawing/marker.rb~ +50 -0
  17. data/lib/axlsx/drawing/pie_3D_chart.rb~ +132 -0
  18. data/lib/axlsx/drawing/pie_series.rb~ +0 -0
  19. data/lib/axlsx/drawing/scaling.rb~ +0 -0
  20. data/lib/axlsx/drawing/series.rb~ +114 -0
  21. data/lib/axlsx/drawing/title.rb~ +69 -0
  22. data/lib/axlsx/drawing/two_cell_anchor.rb~ +70 -0
  23. data/lib/axlsx/drawing/val_axis.rb~ +34 -0
  24. data/lib/axlsx/drawing/view_3D.rb~ +21 -0
  25. data/lib/axlsx/package.rb +3 -3
  26. data/lib/axlsx/package.rb~ +181 -0
  27. data/lib/axlsx/rels/relationship.rb~ +18 -0
  28. data/lib/axlsx/rels/relationships.rb~ +23 -0
  29. data/lib/axlsx/stylesheet/border.rb~ +24 -0
  30. data/lib/axlsx/stylesheet/border_pr.rb~ +64 -0
  31. data/lib/axlsx/stylesheet/cell_alignment.rb~ +93 -0
  32. data/lib/axlsx/stylesheet/cell_protection.rb~ +16 -0
  33. data/lib/axlsx/stylesheet/cell_style.rb~ +61 -0
  34. data/lib/axlsx/stylesheet/color.rb~ +56 -0
  35. data/lib/axlsx/stylesheet/fill.rb~ +31 -0
  36. data/lib/axlsx/stylesheet/font.rb~ +33 -0
  37. data/lib/axlsx/stylesheet/gradient_fill.rb~ +70 -0
  38. data/lib/axlsx/stylesheet/gradient_stop.rb~ +15 -0
  39. data/lib/axlsx/stylesheet/num_fmt.rb~ +60 -0
  40. data/lib/axlsx/stylesheet/pattern_fill.rb~ +63 -0
  41. data/lib/axlsx/stylesheet/styles.rb~ +279 -0
  42. data/lib/axlsx/stylesheet/table_style.rb~ +43 -0
  43. data/lib/axlsx/stylesheet/table_style_element.rb~ +66 -0
  44. data/lib/axlsx/stylesheet/table_styles.rb~ +36 -0
  45. data/lib/axlsx/stylesheet/xf.rb~ +37 -0
  46. data/lib/axlsx/util/constants.rb +1 -1
  47. data/lib/axlsx/util/constants.rb~ +187 -0
  48. data/lib/axlsx/util/monkey_patches_for_true_zip_stream.rb~ +61 -0
  49. data/lib/axlsx/util/simple_typed_list.rb~ +79 -0
  50. data/lib/axlsx/util/validators.rb +3 -3
  51. data/lib/axlsx/util/validators.rb~ +132 -0
  52. data/lib/axlsx/util/xml_escape.rb~ +6 -0
  53. data/lib/axlsx/workbook/workbook.rb +1 -0
  54. data/lib/axlsx/workbook/workbook.rb~ +130 -0
  55. data/lib/axlsx/workbook/worksheet/cell.rb~ +185 -0
  56. data/lib/axlsx/workbook/worksheet/row.rb +4 -4
  57. data/lib/axlsx/workbook/worksheet/row.rb~ +92 -0
  58. data/lib/axlsx/workbook/worksheet/worksheet.rb +3 -4
  59. data/lib/axlsx/workbook/worksheet/worksheet.rb~ +194 -0
  60. data/lib/schema/dc.xsd~ +118 -0
  61. data/lib/schema/dcterms.xsd~ +331 -0
  62. data/lib/schema/opc-coreProperties.xsd~ +50 -0
  63. data/test/drawing/tc_bar_3D_chart.rb +1 -1
  64. data/test/drawing/tc_bar_3D_chart.rb~ +62 -0
  65. data/test/drawing/tc_chart.rb +1 -1
  66. data/test/drawing/tc_chart.rb~ +1 -0
  67. data/test/drawing/tc_pie_3D_chart.rb +1 -1
  68. data/test/drawing/tc_pie_3D_chart.rb~ +3 -28
  69. data/test/drawing/tc_title.rb +1 -1
  70. data/test/drawing/tc_title.rb~ +16 -19
  71. data/test/drawing/tc_two_cell_anchor.rb +1 -1
  72. data/test/drawing/tc_two_cell_anchor.rb~ +16 -14
  73. data/test/tc_package.rb +1 -1
  74. data/test/workbook/worksheet/tc_row.rb +1 -1
  75. data/test/workbook/worksheet/tc_row.rb~ +30 -0
  76. data/test/workbook/worksheet/tc_worksheet.rb +3 -3
  77. data/test/workbook/worksheet/tc_worksheet.rb~ +85 -0
  78. metadata +84 -102
@@ -0,0 +1,92 @@
1
+ module Axlsx
2
+ # A BarSeries defines the title, data and labels for bar 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 BarSeries < Series
7
+
8
+ # The series title.
9
+ # @return [String]
10
+ attr_accessor :title
11
+
12
+ # The data for this series.
13
+ # @return [Array, SimpleTypedList]
14
+ attr_reader :data
15
+
16
+
17
+ # The labels for this series.
18
+ # @return [Array, SimpleTypedList]
19
+ attr_reader :labels
20
+
21
+
22
+ # Creates a new series
23
+ # @option options [Array, SimpleTypedList] data
24
+ # @option options [Array, SimpleTypedList] labels
25
+ # @option options [String] title
26
+ # @param [Chart] chart
27
+ def initialize(chart, options={})
28
+ super(chart, options)
29
+ self.data = options[:data] || []
30
+ self.labels = options[:labels] || []
31
+ @title = options[:title] || ''
32
+ end
33
+
34
+ # Serializes the series
35
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
36
+ # @return [String]
37
+ def to_xml(xml)
38
+ xml.send('c:ser') {
39
+ xml.send('c:idx', :val=>index)
40
+ xml.send('c:order', :val=>index)
41
+ xml.send('c:tx') {
42
+ xml.send('c:v', self.title)
43
+ }
44
+
45
+ if !labels.empty?
46
+ xml.send('c:cat') {
47
+ xml.send('c:strRef') {
48
+ xml.send('c:f', range(labels))
49
+ xml.send('c:strCache') {
50
+ xml.send('c:ptCount', :val=>labels.size)
51
+ labels.each_with_index do |cell, index|
52
+ v = cell.is_a?(Cell) ? cell.value : cell
53
+ xml.send('c:pt', :idx=>index) {
54
+ xml.send('c:v', v)
55
+ }
56
+ end
57
+ }
58
+ }
59
+ }
60
+ end
61
+ xml.send('c:val') {
62
+ xml.send('c:numRef') {
63
+ xml.send('c:f', range(data))
64
+ xml.send('c:numCache') {
65
+ xml.send('c:formatCode', 'General')
66
+ xml.send('c:ptCount', :val=>data.size)
67
+ data.each_with_index do |cell, index|
68
+ v = cell.is_a?(Cell) ? cell.value : cell
69
+ xml.send('c:pt', :idx=>index) {
70
+ xml.send('c:v', v)
71
+ }
72
+ end
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ end
79
+
80
+
81
+ private
82
+
83
+
84
+ # assigns the data for this series
85
+ def data=(v) DataTypeValidator.validate "Series.data", [Array, SimpleTypedList], v; @data = v; end
86
+
87
+ # assigns the labels for this series
88
+ def labels=(v) DataTypeValidator.validate "Series.labels", [Array, SimpleTypedList], v; @labels = v; end
89
+
90
+ end
91
+
92
+ end
@@ -0,0 +1,32 @@
1
+ module Axlsx
2
+
3
+ #A CatAxis object defines a chart category axis
4
+ class CatAxis
5
+ # <c:catAx>
6
+ # <c:axId val="545184360"/>
7
+ # <c:scaling>
8
+ # <c:orientation val="minMax"/>
9
+ # </c:scaling>
10
+ # <c:axPos val="l"/>
11
+ # <c:tickLblPos val="nextTo"/>
12
+ # <c:crossAx val="545218840"/>
13
+ # <c:crosses val="autoZero"/>
14
+ # <c:auto val="1"/>
15
+ # <c:lblAlgn val="ctr"/>
16
+ # <c:lblOffset val="100"/>
17
+ # </c:catAx>
18
+
19
+ attr_reader :axId
20
+
21
+ att_reader :scaling
22
+
23
+ # The position of the axis
24
+ # must be one of [:l, :r, :t, :b]
25
+ # @return [String]
26
+ attr_accessor :axPos
27
+
28
+ def axPos=(v) RestrictionValidator.validate "CatAxis.axPos", [:l, :r, :b, :t], v; @axPos = v; end
29
+
30
+
31
+ end
32
+ end
File without changes
@@ -0,0 +1,102 @@
1
+ module Axlsx
2
+ # A Drawing is a canvas for charts. Each worksheet has a single drawing that can specify multiple anchors which reference charts.
3
+ # @note The recommended way to manage drawings is to use the Worksheet.add_chart method, specifying the chart class, start and end marker locations.
4
+ # @see Worksheet#add_chart
5
+ # @see TwoCellAnchor
6
+ # @see Chart
7
+ class Drawing
8
+
9
+ # The workbook that owns the drawing
10
+ # @return [Workbook]
11
+ attr_reader :workbook
12
+
13
+ # A collection of anchors for this drawing
14
+ # @return [SimpleTypedList]
15
+ attr_reader :anchors
16
+
17
+ # An array of charts that are associated with this drawing's anchors
18
+ # @return [Array]
19
+ attr_reader :charts
20
+
21
+ # The index of this drawing in the owning workbooks's drawings collection.
22
+ # @return [Integer]
23
+ attr_reader :index
24
+
25
+ # The relation reference id for this drawing
26
+ # @return [String]
27
+ attr_reader :rId
28
+
29
+ # The part name for this drawing
30
+ # @return [String]
31
+ attr_reader :pn
32
+
33
+ # The relational part name for this drawing
34
+ # @return [String]
35
+ attr_reader :rels_pn
36
+
37
+ # The drawing's relationships.
38
+ # @return [Relationships]
39
+ attr_reader :relationships
40
+
41
+ # Creates a new Drawing object
42
+ # @param [Workbook] workbook The workbook that owns the drawing.
43
+ def initialize(workbook)
44
+ DataTypeValidator.validate "Drawing.workbook", Workbook, workbook
45
+ @workbook=workbook
46
+ @workbook.drawings << self
47
+ @anchors = SimpleTypedList.new TwoCellAnchor
48
+ end
49
+
50
+
51
+ # Adds a chart to the drawing.
52
+ # @note The recommended way to manage charts is to use Worksheet.add_chart.
53
+ # @param [Chart] chart_type The class of the chart to be added to the drawing
54
+ # @param [Hash] options
55
+ def add_chart(chart_type, options={})
56
+ DataTypeValidator.validate "Drawing.chart_type", [Chart, Pie3DChart], chart_type
57
+ chart = chart_type.new(@workbook, options)
58
+ TwoCellAnchor.new(self, chart, options)
59
+ @anchors.last.graphic_frame.chart
60
+ end
61
+
62
+ def charts
63
+ @anchors.map { |a| a.graphic_frame.chart }
64
+ end
65
+
66
+ def index
67
+ @workbook.drawings.index(self)
68
+ end
69
+
70
+ def rId
71
+ "rId#{index+1}"
72
+ end
73
+
74
+ def pn
75
+ "#{DRAWING_PN % (index+1)}"
76
+ end
77
+
78
+ def rels_pn
79
+ "#{DRAWING_RELS_PN % (index+1)}"
80
+ end
81
+
82
+ def relationships
83
+ r = Relationships.new
84
+ @anchors.each do |anchor|
85
+ chart = anchor.graphic_frame.chart
86
+ r << Relationship.new(CHART_R, "../#{chart.pn}")
87
+ end
88
+ r
89
+ end
90
+
91
+ # Serializes the pie chart
92
+ # @return [String]
93
+ def to_xml
94
+ builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml|
95
+ xml.send('xdr:wsDr', :'xmlns:xdr'=>XML_NS_XDR, :'xmlns:a'=>XML_NS_A) {
96
+ anchors.each {|anchor| anchor.to_xml(xml) }
97
+ }
98
+ end
99
+ builder.to_xml
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,40 @@
1
+ module Axlsx
2
+ # A graphic frame defines a container for a chart object
3
+ # @note The recommended way to manage charts is Worksheet#add_chart
4
+ # @see Worksheet#add_chart
5
+ class GraphicFrame
6
+ #TODO add in support for other graphical objects, primarily images.
7
+
8
+ # A reference to the chart object associated with this frame
9
+ # @return [Chart]
10
+ attr_reader :chart
11
+
12
+ # Creates a new GraphicFrame object
13
+ # @param [Chart] chart
14
+ def initialize(chart)
15
+ @chart = chart
16
+ end
17
+
18
+ # Serializes the gradientStop
19
+ # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
20
+ # @return [String]
21
+ def to_xml(xml)
22
+ xml.send('xdr:graphicFrame') {
23
+ xml.send('xdr:nvGraphicFramePr') {
24
+ xml.send('xdr:cNvPr', :id=>2, :name=>chart.title)
25
+ xml.send('xdr:cNvGraphicFramePr')
26
+ }
27
+ xml.send('xdr:xfrm') {
28
+ xml.send('a:off', :x=>0, :y=>0)
29
+ xml.send('a:ext', :cx=>0, :cy=>0)
30
+ }
31
+ xml.send('a:graphic') {
32
+ xml.send('a:graphicData', :uri=>XML_NS_C) {
33
+ xml.send('c:chart', :'xmlns:c'=>XML_NS_C, :'xmlns:r'=>XML_NS_R, :'r:id'=>chart.rId)
34
+ }
35
+ }
36
+ }
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,50 @@
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
+ # Serializes the gradientStop
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
+ [:col, :colOff, :row, :rowOff].each do |k|
45
+ xml.send("xdr:#{k.to_s}", self.send(k))
46
+ end
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,132 @@
1
+ module Axlsx
2
+
3
+ # A Chart is the class that real classes (e.g. Pie3DChart) inherit from. When you actually create a chart, you will not be creating a new instance of this class, but an instance of a subclass that defines the behavour and serialization for the chart.
4
+ # @note Worksheet#add_chart is the recommended way to create charts for your worksheets.
5
+ class Chart
6
+
7
+ # The title object for the chart.
8
+ # @return [Title]
9
+ attr_reader :title
10
+
11
+ # A reference to the workbook that owns this chart
12
+ # @return [Workbook]
13
+ attr_reader :workbook
14
+
15
+ # A collection of series objects that are applied to the chart
16
+ # @return [SimpleTypedList]
17
+ attr_reader :series
18
+
19
+ # The relation referece id for this object.
20
+ # @return [String]
21
+ attr_reader :rId
22
+
23
+ # The index of this chart in the workbooks charts collection
24
+ # @return [Integer]
25
+ attr_reader :index
26
+
27
+ # The part name for this chart
28
+ # @return [String]
29
+ attr_reader :pn
30
+
31
+
32
+ # Creates a new chart object
33
+ # @param [Workbook] workbook The workbook that owns this chart.
34
+ # @option options [Cell, String] title
35
+ def initialize(workbook, options={})
36
+ @workbook=workbook
37
+ @workbook.charts << self
38
+ @title = Title.new options[:title]
39
+ @series = SimpleTypedList.new Series
40
+ end
41
+
42
+
43
+ def rId
44
+ "rId#{index+1}"
45
+ end
46
+
47
+ def index
48
+ @workbook.charts.index(self)
49
+ end
50
+
51
+ def pn
52
+ "#{CHART_PN % (index+1)}"
53
+ end
54
+
55
+ # Adds a new series to the chart's series collection.
56
+ #
57
+ # @return [Series]
58
+ # @see Series
59
+ def add_series(options={})
60
+ Series.new(self, options)
61
+ @series.last
62
+ end
63
+
64
+ # @raise [StandardError] This method must be overridden in subclasses.
65
+ def to_xml
66
+ raise "This method must be overriden in subclasses."
67
+ end
68
+ end
69
+
70
+ # The Pie3DChart is a three dimentional piechart (who would have guessed?) that you can add to your worksheet.
71
+ # @example Creating a chart
72
+ # # This example creates two charts in a single sheet.
73
+ # # The first uses data directly fed to the sheet, while the second references cells withing the worksheet for data.
74
+ #
75
+ # require "rubygems" # if that is your preferred way to manage gems!
76
+ # require "axlsx"
77
+ #
78
+ # p = Axlsx::Package.new
79
+ # ws = p.workbook.add_worksheet
80
+ # ws.add_row :values => ["This is a chart with no data in the sheet"]
81
+ #
82
+ # chart = ws.add_chart(Axlsx::Pie3DChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
83
+ # chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
84
+ #
85
+ # ws.add_row :values => ["This chart uses the data below"]
86
+ # title_row = ws.add_row :values => ["Least Popular Pets"]
87
+ # label_row = ws.add_row :values => ["", "Dry Skinned Reptiles", "Bald Cats", "Violent Parrots"]
88
+ # data_row = ws.add_row :values => ["Votes", 6, 4, 1]
89
+ #
90
+ # chart = ws.add_chart(Axlsx::Pie3DChart, :start_at => [0,11], :end_at =>[0,16], :title => title_row.cells.last)
91
+ # chart.add_series :data => data_row.cells[(1..-1)], :labels => label_row.cells
92
+ #
93
+ # f = File.open('example_pie_3d_chart.xlsx', 'w')
94
+ # p.serialize(f)
95
+ #
96
+ # @see Worksheet#add_chart
97
+ # @see Worksheet#add_row
98
+ # @see Chart#add_series
99
+ # @see Series
100
+ # @see Package#serialize
101
+ class Pie3DChart < Chart
102
+
103
+ # Serializes the pie chart
104
+ # @return [String]
105
+ def to_xml
106
+ builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml|
107
+ xml.send('c:chartSpace',:'xmlns:c' => XML_NS_C,
108
+ :'xmlns:a' => XML_NS_A) {
109
+ xml.send('c:chart') {
110
+ @title.to_xml(xml)
111
+ xml.send('c:view3D') {
112
+ xml.send('c:rotX', :val=>30)
113
+ xml.send('c:perspective', :val=>30)
114
+ }
115
+ xml.send('c:plotArea') {
116
+ xml.send('c:layout')
117
+ xml.send('c:pie3DChart') {
118
+ xml.send('c:varyColors', :val=>1)
119
+ @series.each { |ser| ser.to_xml(xml) }
120
+ }
121
+ }
122
+ xml.send('c:legend') {
123
+ xml.send('c:legendPos', :val => "r")
124
+ xml.send('c:layout')
125
+ }
126
+ }
127
+ }
128
+ end
129
+ builder.to_xml
130
+ end
131
+ end
132
+ end