axlsx 1.0.6 → 1.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +32 -0
- data/README.md +34 -35
- data/Rakefile +19 -8
- data/doc/Axlsx.html +4 -4
- data/doc/Axlsx/App.html +1 -1
- data/doc/Axlsx/Axis.html +45 -19
- data/doc/Axlsx/Bar3DChart.html +134 -107
- data/doc/Axlsx/BarSeries.html +6 -64
- data/doc/Axlsx/Border.html +1 -1
- data/doc/Axlsx/BorderPr.html +1 -1
- data/doc/Axlsx/CatAxis.html +34 -31
- data/doc/Axlsx/CatAxisData.html +400 -0
- data/doc/Axlsx/Cell.html +1 -1
- data/doc/Axlsx/CellAlignment.html +1 -1
- data/doc/Axlsx/CellProtection.html +1 -1
- data/doc/Axlsx/CellStyle.html +1 -1
- data/doc/Axlsx/Chart.html +449 -212
- data/doc/Axlsx/Color.html +1 -1
- data/doc/Axlsx/ContentType.html +2 -2
- data/doc/Axlsx/Core.html +1 -1
- data/doc/Axlsx/DataTypeValidator.html +1 -1
- data/doc/Axlsx/Default.html +1 -1
- data/doc/Axlsx/Drawing.html +65 -91
- data/doc/Axlsx/Fill.html +1 -1
- data/doc/Axlsx/Font.html +1 -1
- data/doc/Axlsx/GradientFill.html +1 -1
- data/doc/Axlsx/GradientStop.html +1 -1
- data/doc/Axlsx/GraphicFrame.html +7 -5
- data/doc/Axlsx/Line3DChart.html +109 -28
- data/doc/Axlsx/LineSeries.html +17 -73
- data/doc/Axlsx/Marker.html +1 -1
- data/doc/Axlsx/NumFmt.html +1 -1
- data/doc/Axlsx/Override.html +1 -1
- data/doc/Axlsx/Package.html +1 -1
- data/doc/Axlsx/PatternFill.html +1 -1
- data/doc/Axlsx/Pie3DChart.html +118 -66
- data/doc/Axlsx/PieSeries.html +30 -89
- data/doc/Axlsx/RegexValidator.html +1 -1
- data/doc/Axlsx/Relationship.html +1 -1
- data/doc/Axlsx/Relationships.html +2 -2
- data/doc/Axlsx/RestrictionValidator.html +1 -1
- data/doc/Axlsx/Row.html +1 -1
- data/doc/Axlsx/Scaling.html +1 -1
- data/doc/Axlsx/SerAxis.html +52 -37
- data/doc/Axlsx/Series.html +25 -10
- data/doc/Axlsx/SeriesTitle.html +3 -2
- data/doc/Axlsx/SimpleTypedList.html +86 -17
- data/doc/Axlsx/Styles.html +1 -1
- data/doc/Axlsx/TableStyle.html +2 -2
- data/doc/Axlsx/TableStyleElement.html +1 -1
- data/doc/Axlsx/TableStyles.html +2 -2
- data/doc/Axlsx/Title.html +1 -1
- data/doc/Axlsx/TwoCellAnchor.html +40 -280
- data/doc/Axlsx/ValAxis.html +7 -8
- data/doc/Axlsx/ValAxisData.html +326 -0
- data/doc/Axlsx/View3D.html +39 -39
- data/doc/Axlsx/Workbook.html +1 -1
- data/doc/Axlsx/Worksheet.html +84 -39
- data/doc/Axlsx/Xf.html +1 -1
- data/doc/_index.html +15 -1
- data/doc/class_list.html +1 -1
- data/doc/file.README.html +30 -49
- data/doc/index.html +30 -49
- data/doc/method_list.html +448 -416
- data/doc/top-level-namespace.html +1 -1
- data/examples/#example.rb# +87 -0
- data/examples/example.rb +4 -1
- data/examples/multi_chart.xlsx +0 -0
- data/lib/axlsx/drawing/#bar_series.rb# +62 -0
- data/lib/axlsx/drawing/axis.rb +7 -6
- data/lib/axlsx/drawing/bar_3D_chart.rb +12 -30
- data/lib/axlsx/drawing/bar_series.rb +6 -35
- data/lib/axlsx/drawing/cat_axis.rb +8 -10
- data/lib/axlsx/drawing/cat_axis_data.rb +34 -0
- data/lib/axlsx/drawing/cat_axis_data.rb~ +28 -0
- data/lib/axlsx/drawing/chart.rb +48 -21
- data/lib/axlsx/drawing/drawing.rb +14 -12
- data/lib/axlsx/drawing/graphic_frame.rb +1 -0
- data/lib/axlsx/drawing/line_3D_chart.rb +11 -1
- data/lib/axlsx/drawing/line_series.rb +10 -40
- data/lib/axlsx/drawing/pie_3D_chart.rb +17 -34
- data/lib/axlsx/drawing/pie_series.rb +11 -45
- data/lib/axlsx/drawing/ser_axis.rb +13 -14
- data/lib/axlsx/drawing/series.rb +2 -3
- data/lib/axlsx/drawing/series_title.rb +1 -1
- data/lib/axlsx/drawing/two_cell_anchor.rb +10 -34
- data/lib/axlsx/drawing/val_axis.rb +4 -4
- data/lib/axlsx/drawing/val_axis_data.rb +28 -0
- data/lib/axlsx/drawing/val_axis_data.rb~ +29 -0
- data/lib/axlsx/drawing/view_3D.rb +12 -6
- data/lib/axlsx/util/constants.rb +0 -3
- data/lib/axlsx/util/simple_typed_list.rb +7 -2
- data/lib/axlsx/version.rb +4 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +9 -1
- data/test/drawing/tc_axis.rb +1 -0
- data/test/drawing/tc_cat_axis_data.rb +18 -0
- data/test/drawing/tc_cat_axis_data.rb~ +32 -0
- data/test/drawing/tc_chart.rb +12 -0
- data/test/drawing/tc_line_series.rb +27 -0
- data/test/drawing/{tc_line_series.tc → tc_line_series.rb~} +0 -0
- data/test/drawing/tc_ser_axis.rb +13 -5
- data/test/drawing/tc_two_cell_anchor.rb +18 -17
- data/test/drawing/tc_val_axis.rb +5 -0
- data/test/drawing/tc_val_axis_data.rb +18 -0
- data/test/drawing/tc_val_axis_data.rb~ +18 -0
- data/test/drawing/tc_view_3D.rb +10 -1
- data/test/tc_package.rb +13 -13
- metadata +21 -6
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'axlsx'
|
3
|
+
|
4
|
+
#A Simple Workbook
|
5
|
+
p = Axlsx::Package.new
|
6
|
+
p.workbook.add_worksheet do |sheet|
|
7
|
+
sheet.add_row ["First", "Second", "Third"]
|
8
|
+
sheet.add_row [1, 2, 3]
|
9
|
+
end
|
10
|
+
p.serialize("example1.xlsx")
|
11
|
+
|
12
|
+
#Generating A Bar Chart
|
13
|
+
p = Axlsx::Package.new
|
14
|
+
p.workbook.add_worksheet do |sheet|
|
15
|
+
sheet.add_row ["First", "Second", "Third"]
|
16
|
+
sheet.add_row [1, 2, 3]
|
17
|
+
sheet.add_chart(Axlsx::Bar3DChart, :start_at => [0,2], :end_at => [5, 15], :title=>"example 2: Chart") do |chart|
|
18
|
+
chart.add_series :data=>sheet.rows.last.cells, :labels=> sheet.rows.first.cells
|
19
|
+
end
|
20
|
+
end
|
21
|
+
p.serialize("example2.xlsx")
|
22
|
+
|
23
|
+
#Generating A Pie Chart
|
24
|
+
p = Axlsx::Package.new
|
25
|
+
p.workbook.add_worksheet do |sheet|
|
26
|
+
sheet.add_row ["First", "Second", "Third"]
|
27
|
+
sheet.add_row [1, 2, 3]
|
28
|
+
sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,2], :end_at => [5, 15], :title=>"example 3: Pie Chart") do |chart|
|
29
|
+
chart.add_series :data=>sheet.rows.last.cells, :labels=> sheet.rows.first.cells
|
30
|
+
end
|
31
|
+
end
|
32
|
+
p.serialize("example3.xlsx")
|
33
|
+
|
34
|
+
|
35
|
+
#Using Custom Styles
|
36
|
+
|
37
|
+
p = Axlsx::Package.new
|
38
|
+
wb = p.workbook
|
39
|
+
black_cell = wb.styles.add_style :bg_color => "FF000000", :fg_color => "FFFFFFFF", :sz=>14, :alignment => { :horizontal=> :center }
|
40
|
+
blue_cell = wb.styles.add_style :bg_color => "FF0000FF", :fg_color => "FFFFFFFF", :sz=>14, :alignment => { :horizontal=> :center }
|
41
|
+
wb.add_worksheet do |sheet|
|
42
|
+
sheet.add_row ["Text Autowidth", "Second", "Third"], :style => [black_cell, blue_cell, black_cell]
|
43
|
+
sheet.add_row [1, 2, 3], :style => Axlsx::STYLE_THIN_BORDER
|
44
|
+
end
|
45
|
+
p.serialize("example4.xlsx")
|
46
|
+
|
47
|
+
#Using Custom Formatting and date1904
|
48
|
+
|
49
|
+
p = Axlsx::Package.new
|
50
|
+
wb = p.workbook
|
51
|
+
date = wb.styles.add_style :format_code=>"yyyy-mm-dd", :border => Axlsx::STYLE_THIN_BORDER
|
52
|
+
padded = wb.styles.add_style :format_code=>"00#", :border => Axlsx::STYLE_THIN_BORDER
|
53
|
+
percent = wb.styles.add_style :format_code=>"0%", :border => Axlsx::STYLE_THIN_BORDER
|
54
|
+
wb.date1904 = true # required for generation on mac
|
55
|
+
wb.add_worksheet do |sheet|
|
56
|
+
sheet.add_row ["Custom Formatted Date", "Percent Formatted Float", "Padded Numbers"], :style => Axlsx::STYLE_THIN_BORDER
|
57
|
+
sheet.add_row [Time.now, 0.2, 32], :style => [date, percent, padded]
|
58
|
+
end
|
59
|
+
p.serialize("example5.xlsx")
|
60
|
+
|
61
|
+
#Validation
|
62
|
+
|
63
|
+
p = Axlsx::Package.new
|
64
|
+
p.workbook.add_worksheet do |sheet|
|
65
|
+
sheet.add_row ["First", "Second", "Third"]
|
66
|
+
sheet.add_row [1, 2, 3]
|
67
|
+
end
|
68
|
+
|
69
|
+
p.validate.each do |error|
|
70
|
+
puts error.inspect
|
71
|
+
end
|
72
|
+
|
73
|
+
#Generating A Line Chart
|
74
|
+
|
75
|
+
p = Axlsx::Package.new
|
76
|
+
p.workbook.add_worksheet do |sheet|
|
77
|
+
sheet.add_row ["First", 1, 5, 7, 9]
|
78
|
+
sheet.add_row ["Second", 5, 2, 14, 9]
|
79
|
+
sheet.add_chart(Axlsx::Line3DChart, :title=>"example 6: Line Chart") do |chart|
|
80
|
+
chart.start_at 0, 2
|
81
|
+
chart.end_at 10, 15
|
82
|
+
chart.add_series :data=>sheet.rows.first.cells[(1..-1)], :title=> sheet.rows.first.cells.first
|
83
|
+
chart.add_series :data=>sheet.rows.last.cells[(1..-1)], :title=> sheet.rows.last.cells.first
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
p.serialize("example6.xlsx")
|
data/examples/example.rb
CHANGED
@@ -59,6 +59,7 @@
|
|
59
59
|
p.serialize("example5.xlsx")
|
60
60
|
|
61
61
|
#Validation
|
62
|
+
|
62
63
|
p = Axlsx::Package.new
|
63
64
|
p.workbook.add_worksheet do |sheet|
|
64
65
|
sheet.add_row ["First", "Second", "Third"]
|
@@ -75,7 +76,9 @@
|
|
75
76
|
p.workbook.add_worksheet do |sheet|
|
76
77
|
sheet.add_row ["First", 1, 5, 7, 9]
|
77
78
|
sheet.add_row ["Second", 5, 2, 14, 9]
|
78
|
-
sheet.add_chart(Axlsx::Line3DChart, :
|
79
|
+
sheet.add_chart(Axlsx::Line3DChart, :title=>"example 6: Line Chart") do |chart|
|
80
|
+
chart.start_at 0, 2
|
81
|
+
chart.end_at 10, 15
|
79
82
|
chart.add_series :data=>sheet.rows.first.cells[(1..-1)], :title=> sheet.rows.first.cells.first
|
80
83
|
chart.add_series :data=>sheet.rows.last.cells[(1..-1)], :title=> sheet.rows.last.cells.first
|
81
84
|
end
|
data/examples/multi_chart.xlsx
CHANGED
Binary file
|
@@ -0,0 +1,62 @@
|
|
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
|
+
|
9
|
+
# The data for this series.
|
10
|
+
# @return [Array, SimpleTypedList]
|
11
|
+
attr_reader :data
|
12
|
+
|
13
|
+
# The labels for this series.
|
14
|
+
# @return [Array, SimpleTypedList]
|
15
|
+
attr_reader :labels
|
16
|
+
|
17
|
+
# The shabe of the bars or columns
|
18
|
+
# must be one of [:percentStacked, :clustered, :standard, :stacked]
|
19
|
+
# @return [Symbol]
|
20
|
+
attr_accessor :shape
|
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 [String] shape
|
27
|
+
# @param [Chart] chart
|
28
|
+
def initialize(chart, options={})
|
29
|
+
@shape = :box
|
30
|
+
super(chart, options)
|
31
|
+
self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil?
|
32
|
+
self.data = ValAxisData.new(options[:data]) unless options[:data].nil?
|
33
|
+
end
|
34
|
+
|
35
|
+
def shape=(v)
|
36
|
+
RestrictionValidator.validate "BarSeries.shape", [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax], v
|
37
|
+
@shape = v
|
38
|
+
end
|
39
|
+
|
40
|
+
# Serializes the series
|
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
|
+
super(xml) do |xml|
|
45
|
+
@labels.to_xml(xml) unless @labels.nil?
|
46
|
+
@data.to_xml(xml) unless @data.nil?
|
47
|
+
xml.send('c:shape', :val=>@shape)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# assigns the data for this series
|
55
|
+
def data=(v) DataTypeValidator.validate "Series.data", [SimpleTypedList], v; @data = v; end
|
56
|
+
|
57
|
+
# assigns the labels for this series
|
58
|
+
def labels=(v) DataTypeValidator.validate "Series.labels", [SimpleTypedList], v; @labels = v; end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/lib/axlsx/drawing/axis.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
module Axlsx
|
2
|
-
# the access class defines common properties and values for chart axis
|
2
|
+
# the access class defines common properties and values for a chart axis.
|
3
3
|
class Axis
|
4
4
|
|
5
|
-
|
6
|
-
# the id of the axis
|
5
|
+
# the id of the axis.
|
7
6
|
# @return [Integer]
|
8
7
|
attr_reader :axId
|
9
8
|
|
@@ -12,6 +11,7 @@ module Axlsx
|
|
12
11
|
attr_reader :crossAx
|
13
12
|
|
14
13
|
# The scaling of the axis
|
14
|
+
# @see Scaling
|
15
15
|
# @return [Scaling]
|
16
16
|
attr_reader :scaling
|
17
17
|
|
@@ -25,8 +25,8 @@ module Axlsx
|
|
25
25
|
# @return [Symbol]
|
26
26
|
attr_accessor :tickLblPos
|
27
27
|
|
28
|
-
|
29
28
|
# The number format format code for this axis
|
29
|
+
# default :General
|
30
30
|
# @return [String]
|
31
31
|
attr_accessor :format_code
|
32
32
|
|
@@ -41,15 +41,16 @@ module Axlsx
|
|
41
41
|
# @option options [Symbol] axPos
|
42
42
|
# @option options [Symbol] crosses
|
43
43
|
# @option options [Symbol] tickLblPos
|
44
|
+
# @raise [ArgumentError] If axId or crossAx are not unsigned integers
|
44
45
|
def initialize(axId, crossAx, options={})
|
45
46
|
Axlsx::validate_unsigned_int(axId)
|
46
47
|
Axlsx::validate_unsigned_int(crossAx)
|
47
48
|
@axId = axId
|
48
49
|
@crossAx = crossAx
|
50
|
+
@scaling = Scaling.new(:orientation=>:minMax)
|
49
51
|
self.axPos = :l
|
50
52
|
self.tickLblPos = :nextTo
|
51
|
-
|
52
|
-
@formatCode = ""
|
53
|
+
self.format_code = "General"
|
53
54
|
self.crosses = :autoZero
|
54
55
|
options.each do |o|
|
55
56
|
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
@@ -1,43 +1,17 @@
|
|
1
1
|
module Axlsx
|
2
2
|
|
3
3
|
# The Bar3DChart is a three dimentional barchart (who would have guessed?) that you can add to your worksheet.
|
4
|
-
# @example Creating a chart
|
5
|
-
# # This example creates two charts in a single sheet.
|
6
|
-
# # The first uses data directly fed to the sheet, while the second references cells withing the worksheet for data.
|
7
|
-
#
|
8
|
-
# require "rubygems" # if that is your preferred way to manage gems!
|
9
|
-
# require "axlsx"
|
10
|
-
#
|
11
|
-
# p = Axlsx::Package.new
|
12
|
-
# ws = p.workbook.add_worksheet
|
13
|
-
# ws.add_row :values => ["This is a chart with no data in the sheet"]
|
14
|
-
#
|
15
|
-
# chart = ws.add_chart(Axlsx::Bar3DChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
|
16
|
-
# chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
|
17
|
-
#
|
18
|
-
# ws.add_row :values => ["This chart uses the data below"]
|
19
|
-
# title_row = ws.add_row :values => ["Least Popular Pets"]
|
20
|
-
# label_row = ws.add_row :values => ["", "Dry Skinned Reptiles", "Bald Cats", "Violent Parrots"]
|
21
|
-
# data_row = ws.add_row :values => ["Votes", 6, 4, 1]
|
22
|
-
#
|
23
|
-
# chart = ws.add_chart(Axlsx::Pie3DChart, :start_at => [0,11], :end_at =>[0,16], :title => title_row.cells.last)
|
24
|
-
# chart.add_series :data => data_row.cells[(1..-1)], :labels => label_row.cells
|
25
|
-
#
|
26
|
-
# f = File.open('example_pie_3d_chart.xlsx', 'w')
|
27
|
-
# p.serialize(f)
|
28
|
-
#
|
29
4
|
# @see Worksheet#add_chart
|
30
|
-
# @see Worksheet#add_row
|
31
5
|
# @see Chart#add_series
|
32
|
-
# @see Series
|
33
6
|
# @see Package#serialize
|
7
|
+
# @see README for an example
|
34
8
|
class Bar3DChart < Chart
|
35
9
|
|
36
10
|
# the category axis
|
37
11
|
# @return [CatAxis]
|
38
12
|
attr_reader :catAxis
|
39
13
|
|
40
|
-
# the
|
14
|
+
# the valueaxis
|
41
15
|
# @return [ValAxis]
|
42
16
|
attr_reader :valAxis
|
43
17
|
|
@@ -60,7 +34,7 @@ module Axlsx
|
|
60
34
|
attr_accessor :grouping
|
61
35
|
|
62
36
|
# The shabe of the bars or columns
|
63
|
-
# must be one of [:
|
37
|
+
# must be one of [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax]
|
64
38
|
# @return [Symbol]
|
65
39
|
attr_accessor :shape
|
66
40
|
|
@@ -76,6 +50,14 @@ module Axlsx
|
|
76
50
|
# @option options [String] gapWidth
|
77
51
|
# @option options [String] gapDepth
|
78
52
|
# @option options [Symbol] shape
|
53
|
+
# @option options [Integer] rotX
|
54
|
+
# @option options [String] hPercent
|
55
|
+
# @option options [Integer] rotY
|
56
|
+
# @option options [String] depthPercent
|
57
|
+
# @option options [Boolean] rAngAx
|
58
|
+
# @option options [Integer] perspective
|
59
|
+
# @see Chart
|
60
|
+
# @see View3D
|
79
61
|
def initialize(frame, options={})
|
80
62
|
@barDir = :bar
|
81
63
|
@grouping = :clustered
|
@@ -83,9 +65,9 @@ module Axlsx
|
|
83
65
|
@valAxId = rand(8 ** 8)
|
84
66
|
@catAxis = CatAxis.new(@catAxId, @valAxId)
|
85
67
|
@valAxis = ValAxis.new(@valAxId, @catAxId)
|
86
|
-
@view3D = View3D.new(:rAngAx=>1)
|
87
68
|
super(frame, options)
|
88
69
|
@series_type = BarSeries
|
70
|
+
@view3D = View3D.new({:rAngAx=>1}.merge(options))
|
89
71
|
end
|
90
72
|
|
91
73
|
def barDir=(v)
|
@@ -28,8 +28,8 @@ module Axlsx
|
|
28
28
|
def initialize(chart, options={})
|
29
29
|
@shape = :box
|
30
30
|
super(chart, options)
|
31
|
-
self.
|
32
|
-
self.
|
31
|
+
self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil?
|
32
|
+
self.data = ValAxisData.new(options[:data]) unless options[:data].nil?
|
33
33
|
end
|
34
34
|
|
35
35
|
def shape=(v)
|
@@ -42,37 +42,8 @@ module Axlsx
|
|
42
42
|
# @return [String]
|
43
43
|
def to_xml(xml)
|
44
44
|
super(xml) do |xml|
|
45
|
-
|
46
|
-
|
47
|
-
xml.send('c:strRef') {
|
48
|
-
xml.send('c:f', Axlsx::cell_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', Axlsx::cell_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
|
-
}
|
45
|
+
@labels.to_xml(xml) unless @labels.nil?
|
46
|
+
@data.to_xml(xml) unless @data.nil?
|
76
47
|
xml.send('c:shape', :val=>@shape)
|
77
48
|
end
|
78
49
|
end
|
@@ -82,10 +53,10 @@ module Axlsx
|
|
82
53
|
|
83
54
|
|
84
55
|
# assigns the data for this series
|
85
|
-
def data=(v) DataTypeValidator.validate "Series.data", [
|
56
|
+
def data=(v) DataTypeValidator.validate "Series.data", [SimpleTypedList], v; @data = v; end
|
86
57
|
|
87
58
|
# assigns the labels for this series
|
88
|
-
def labels=(v) DataTypeValidator.validate "Series.labels", [
|
59
|
+
def labels=(v) DataTypeValidator.validate "Series.labels", [SimpleTypedList], v; @labels = v; end
|
89
60
|
|
90
61
|
end
|
91
62
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Axlsx
|
2
2
|
#A CatAxis object defines a chart category axis
|
3
3
|
class CatAxis < Axis
|
4
|
+
|
4
5
|
# From the docs: This element specifies that this axis is a date or text axis based on the data that is used for the axis labels, not a specific choice.
|
5
6
|
# @return [Boolean]
|
6
7
|
attr_accessor :auto
|
@@ -18,23 +19,20 @@ module Axlsx
|
|
18
19
|
# regex for validating label offset
|
19
20
|
LBL_OFFSET_REGEX = /0*(([0-9])|([1-9][0-9])|([1-9][0-9][0-9])|1000)%/
|
20
21
|
|
21
|
-
# Creates a new CatAxis object
|
22
|
-
# @param [Integer] axId the id of this axis
|
23
|
-
# @param [Integer] crossAx the id of the perpendicular axis
|
24
|
-
# @option options [Symbol] axPos
|
25
|
-
# @option options [Symbol] tickLblPos
|
26
|
-
# @option options [Symbol] crosses
|
22
|
+
# Creates a new CatAxis object
|
23
|
+
# @param [Integer] axId the id of this axis. Inherited
|
24
|
+
# @param [Integer] crossAx the id of the perpendicular axis. Inherited
|
25
|
+
# @option options [Symbol] axPos. Inherited
|
26
|
+
# @option options [Symbol] tickLblPos. Inherited
|
27
|
+
# @option options [Symbol] crosses. Inherited
|
27
28
|
# @option options [Boolean] auto
|
28
29
|
# @option options [Symbol] lblAlgn
|
29
30
|
# @option options [Integer] lblOffset
|
30
31
|
def initialize(axId, crossAx, options={})
|
31
|
-
super(axId, crossAx, options)
|
32
32
|
self.auto = true
|
33
33
|
self.lblAlgn = :ctr
|
34
34
|
self.lblOffset = "100%"
|
35
|
-
|
36
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
37
|
-
end
|
35
|
+
super(axId, crossAx, options)
|
38
36
|
end
|
39
37
|
|
40
38
|
def auto=(v) Axlsx::validate_boolean(v); @auto = v; end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Axlsx
|
2
|
+
# The CatAxisData class serializes the category axis data for a chart
|
3
|
+
class CatAxisData < SimpleTypedList
|
4
|
+
|
5
|
+
# Create a new CatAxisData object
|
6
|
+
# @param [Array, SimpleTypedList] data the data for this category axis. This can be a simple array or a simple typed list of cells.
|
7
|
+
def initialize(data=[])
|
8
|
+
super Object
|
9
|
+
@list.concat data if data.is_a?(Array)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Serializes the category axis data
|
13
|
+
# @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
|
14
|
+
# @return [String]
|
15
|
+
def to_xml(xml)
|
16
|
+
xml.send('c:cat') {
|
17
|
+
xml.send('c:strRef') {
|
18
|
+
xml.send('c:f', Axlsx::cell_range(@list))
|
19
|
+
xml.send('c:strCache') {
|
20
|
+
xml.send('c:ptCount', :val=>size)
|
21
|
+
each_with_index do |item, index|
|
22
|
+
v = item.is_a?(Cell) ? item.value : item
|
23
|
+
xml.send('c:pt', :idx=>index) {
|
24
|
+
xml.send('c:v', v)
|
25
|
+
}
|
26
|
+
end
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Axlsx
|
2
|
+
|
3
|
+
class CatAxisData < SimpleTypedList
|
4
|
+
def initialize(data=[])
|
5
|
+
super Object
|
6
|
+
@list.concat data if data.is_a?(Array)
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_xml(xml)
|
10
|
+
xml.send('c:cat') {
|
11
|
+
xml.send('c:strRef') {
|
12
|
+
xml.send('c:f', Axlsx::cell_range(@list))
|
13
|
+
xml.send('c:strCache') {
|
14
|
+
xml.send('c:ptCount', :val=>size)
|
15
|
+
each_with_index do |item, index|
|
16
|
+
v = item.is_a?(Cell) ? item.value : item
|
17
|
+
xml.send('c:pt', :idx=>index) {
|
18
|
+
xml.send('c:v', v)
|
19
|
+
}
|
20
|
+
end
|
21
|
+
}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|