caxlsx 2.0.2 → 3.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +125 -30
- data/README.md +65 -151
- data/Rakefile +9 -11
- data/examples/{image1.jpeg → assets/image1.jpeg} +0 -0
- data/examples/generate.rb +15 -0
- data/lib/axlsx.rb +35 -17
- data/lib/axlsx/content_type/abstract_content_type.rb +1 -1
- data/lib/axlsx/content_type/content_type.rb +1 -1
- data/lib/axlsx/doc_props/app.rb +1 -1
- data/lib/axlsx/doc_props/core.rb +5 -5
- data/lib/axlsx/drawing/area_chart.rb +99 -0
- data/lib/axlsx/drawing/area_series.rb +110 -0
- data/lib/axlsx/drawing/axes.rb +1 -1
- data/lib/axlsx/drawing/axis.rb +12 -9
- data/lib/axlsx/drawing/bar_3D_chart.rb +13 -13
- data/lib/axlsx/drawing/bar_chart.rb +143 -0
- data/lib/axlsx/drawing/bar_series.rb +12 -14
- data/lib/axlsx/drawing/bubble_chart.rb +59 -0
- data/lib/axlsx/drawing/bubble_series.rb +63 -0
- data/lib/axlsx/drawing/cat_axis.rb +5 -5
- data/lib/axlsx/drawing/chart.rb +52 -8
- data/lib/axlsx/drawing/d_lbls.rb +4 -4
- data/lib/axlsx/drawing/drawing.rb +6 -1
- data/lib/axlsx/drawing/graphic_frame.rb +3 -3
- data/lib/axlsx/drawing/hyperlink.rb +1 -3
- data/lib/axlsx/drawing/line_3D_chart.rb +2 -2
- data/lib/axlsx/drawing/line_chart.rb +10 -10
- data/lib/axlsx/drawing/line_series.rb +32 -3
- data/lib/axlsx/drawing/marker.rb +1 -1
- data/lib/axlsx/drawing/num_data.rb +4 -4
- data/lib/axlsx/drawing/num_data_source.rb +6 -6
- data/lib/axlsx/drawing/num_val.rb +3 -1
- data/lib/axlsx/drawing/one_cell_anchor.rb +3 -2
- data/lib/axlsx/drawing/pic.rb +25 -19
- data/lib/axlsx/drawing/picture_locking.rb +1 -3
- data/lib/axlsx/drawing/pie_3D_chart.rb +5 -6
- data/lib/axlsx/drawing/pie_series.rb +6 -6
- data/lib/axlsx/drawing/scaling.rb +6 -6
- data/lib/axlsx/drawing/scatter_chart.rb +10 -10
- data/lib/axlsx/drawing/scatter_series.rb +40 -7
- data/lib/axlsx/drawing/ser_axis.rb +2 -2
- data/lib/axlsx/drawing/series.rb +3 -3
- data/lib/axlsx/drawing/series_title.rb +4 -2
- data/lib/axlsx/drawing/str_data.rb +3 -3
- data/lib/axlsx/drawing/str_val.rb +3 -1
- data/lib/axlsx/drawing/title.rb +23 -4
- data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
- data/lib/axlsx/drawing/val_axis.rb +1 -1
- data/lib/axlsx/drawing/view_3D.rb +2 -2
- data/lib/axlsx/drawing/vml_drawing.rb +1 -1
- data/lib/axlsx/package.rb +58 -47
- data/lib/axlsx/rels/relationship.rb +27 -26
- data/lib/axlsx/rels/relationships.rb +7 -4
- data/lib/axlsx/stylesheet/border_pr.rb +2 -2
- data/lib/axlsx/stylesheet/cell_alignment.rb +1 -3
- data/lib/axlsx/stylesheet/cell_protection.rb +1 -3
- data/lib/axlsx/stylesheet/cell_style.rb +1 -3
- data/lib/axlsx/stylesheet/color.rb +1 -3
- data/lib/axlsx/stylesheet/font.rb +11 -3
- data/lib/axlsx/stylesheet/gradient_stop.rb +1 -1
- data/lib/axlsx/stylesheet/num_fmt.rb +10 -3
- data/lib/axlsx/stylesheet/pattern_fill.rb +1 -1
- data/lib/axlsx/stylesheet/styles.rb +7 -7
- data/lib/axlsx/stylesheet/table_style_element.rb +1 -3
- data/lib/axlsx/util/accessors.rb +6 -6
- data/lib/axlsx/util/constants.rb +108 -99
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/options_parser.rb +2 -1
- data/lib/axlsx/util/serialized_attributes.rb +16 -6
- data/lib/axlsx/util/simple_typed_list.rb +28 -52
- data/lib/axlsx/util/storage.rb +4 -4
- data/lib/axlsx/util/validators.rb +31 -19
- data/lib/axlsx/util/zip_command.rb +73 -0
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/defined_name.rb +11 -12
- data/lib/axlsx/workbook/defined_names.rb +2 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +5 -5
- data/lib/axlsx/workbook/workbook.rb +36 -20
- data/lib/axlsx/workbook/workbook_view.rb +80 -0
- data/lib/axlsx/workbook/workbook_views.rb +22 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +2 -2
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +1 -3
- data/lib/axlsx/workbook/worksheet/break.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cell.rb +164 -75
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +63 -43
- data/lib/axlsx/workbook/worksheet/cfvo.rb +1 -3
- data/lib/axlsx/workbook/worksheet/cfvos.rb +4 -1
- data/lib/axlsx/workbook/worksheet/col.rb +14 -13
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
- data/lib/axlsx/workbook/worksheet/comment.rb +5 -6
- data/lib/axlsx/workbook/worksheet/comments.rb +9 -12
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +1 -1
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +1 -1
- data/lib/axlsx/workbook/worksheet/data_bar.rb +4 -6
- data/lib/axlsx/workbook/worksheet/data_validation.rb +8 -6
- data/lib/axlsx/workbook/worksheet/dimension.rb +2 -2
- data/lib/axlsx/workbook/worksheet/header_footer.rb +6 -8
- data/lib/axlsx/workbook/worksheet/icon_set.rb +3 -5
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +4 -2
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
- data/lib/axlsx/workbook/worksheet/page_margins.rb +1 -3
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -1
- data/lib/axlsx/workbook/worksheet/page_setup.rb +21 -23
- data/lib/axlsx/workbook/worksheet/pane.rb +1 -3
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +44 -28
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +4 -4
- data/lib/axlsx/workbook/worksheet/print_options.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_range.rb +1 -3
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -2
- data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -0
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -0
- data/lib/axlsx/workbook/worksheet/row.rb +42 -52
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +2 -2
- data/lib/axlsx/workbook/worksheet/selection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +1 -3
- data/lib/axlsx/workbook/worksheet/table.rb +6 -6
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +1 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +4 -1
- data/lib/axlsx/workbook/worksheet/worksheet.rb +76 -81
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +3 -3
- data/lib/caxlsx.rb +2 -0
- data/test/drawing/tc_area_chart.rb +39 -0
- data/test/drawing/tc_area_series.rb +71 -0
- data/test/drawing/tc_axis.rb +27 -0
- data/test/drawing/tc_bar_chart.rb +71 -0
- data/test/drawing/tc_bubble_chart.rb +44 -0
- data/test/drawing/tc_bubble_series.rb +21 -0
- data/test/drawing/tc_chart.rb +23 -10
- data/test/drawing/tc_data_source.rb +6 -0
- data/test/drawing/tc_drawing.rb +4 -4
- data/test/drawing/tc_hyperlink.rb +1 -1
- data/test/drawing/tc_line_chart.rb +5 -5
- data/test/drawing/tc_line_series.rb +47 -6
- data/test/drawing/tc_one_cell_anchor.rb +1 -1
- data/test/drawing/tc_pic.rb +11 -15
- data/test/drawing/tc_pie_series.rb +2 -1
- data/test/drawing/tc_scatter_series.rb +36 -1
- data/test/drawing/tc_series_title.rb +21 -0
- data/test/drawing/tc_str_val.rb +9 -0
- data/test/drawing/tc_title.rb +21 -0
- data/test/fixtures/image1.gif +0 -0
- data/test/fixtures/image1.jpeg +0 -0
- data/test/fixtures/image1.jpg +0 -0
- data/test/fixtures/image1.png +0 -0
- data/test/fixtures/image1_fake.jpg +0 -0
- data/test/rels/tc_relationship.rb +8 -0
- data/test/stylesheet/tc_font.rb +14 -2
- data/test/stylesheet/tc_styles.rb +29 -3
- data/test/tc_axlsx.rb +37 -0
- data/test/tc_helper.rb +2 -0
- data/test/tc_package.rb +50 -13
- data/test/util/tc_mime_type_utils.rb +13 -0
- data/test/util/tc_simple_typed_list.rb +2 -3
- data/test/util/tc_validators.rb +35 -11
- data/test/workbook/tc_defined_name.rb +12 -4
- data/test/workbook/tc_shared_strings_table.rb +16 -1
- data/test/workbook/tc_workbook.rb +38 -3
- data/test/workbook/tc_workbook_view.rb +50 -0
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +1 -1
- data/test/workbook/worksheet/tc_break.rb +1 -1
- data/test/workbook/worksheet/tc_cell.rb +143 -9
- data/test/workbook/worksheet/tc_col.rb +18 -3
- data/test/workbook/worksheet/tc_conditional_formatting.rb +2 -2
- data/test/workbook/worksheet/tc_data_bar.rb +1 -1
- data/test/workbook/worksheet/tc_data_validation.rb +11 -11
- data/test/workbook/worksheet/tc_header_footer.rb +2 -2
- data/test/workbook/worksheet/tc_icon_set.rb +1 -1
- data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
- data/test/workbook/worksheet/tc_page_setup.rb +3 -3
- data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
- data/test/workbook/worksheet/tc_print_options.rb +1 -1
- data/test/workbook/worksheet/tc_rich_text.rb +44 -0
- data/test/workbook/worksheet/tc_rich_text_run.rb +173 -0
- data/test/workbook/worksheet/tc_row.rb +24 -2
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +1 -1
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +4 -4
- data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
- data/test/workbook/worksheet/tc_sheet_protection.rb +5 -5
- data/test/workbook/worksheet/tc_sheet_view.rb +4 -4
- data/test/workbook/worksheet/tc_table.rb +2 -3
- data/test/workbook/worksheet/tc_worksheet.rb +123 -60
- metadata +180 -128
- data/examples/2010_comments.rb +0 -17
- data/examples/anchor_swapping.rb +0 -28
- data/examples/auto_filter.rb +0 -16
- data/examples/basic_charts.rb +0 -58
- data/examples/chart_colors.rb +0 -88
- data/examples/colored_links.rb +0 -59
- data/examples/conditional_formatting/example_conditional_formatting.rb +0 -74
- data/examples/conditional_formatting/getting_barred.rb +0 -37
- data/examples/conditional_formatting/hitting_the_high_notes.rb +0 -37
- data/examples/conditional_formatting/scaled_colors.rb +0 -39
- data/examples/conditional_formatting/stop_and_go.rb +0 -37
- data/examples/data_validation.rb +0 -50
- data/examples/example.rb +0 -777
- data/examples/extractive.rb +0 -45
- data/examples/ios_preview.rb +0 -14
- data/examples/page_setup.rb +0 -11
- data/examples/pivot_table.rb +0 -39
- data/examples/sheet_protection.rb +0 -10
- data/examples/skydrive/real_example.rb +0 -63
- data/examples/styles.rb +0 -66
- data/examples/underline.rb +0 -13
- data/examples/wrap_text.rb +0 -21
- data/lib/axlsx/util/parser.rb +0 -44
data/Rakefile
CHANGED
@@ -9,19 +9,17 @@ task :benchmark do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
task :gendoc do
|
12
|
-
|
13
|
-
|
14
|
-
system "yard stats --list-undoc"
|
12
|
+
system "yardoc"
|
13
|
+
system "yard stats --list-undoc"
|
15
14
|
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
16
|
+
|
17
|
+
require 'rake/testtask'
|
18
|
+
Rake::TestTask.new do |t|
|
19
|
+
t.libs << 'test'
|
20
|
+
t.test_files = FileList['test/**/tc_*.rb']
|
21
|
+
t.verbose = false
|
22
|
+
t.warning = true
|
25
23
|
end
|
26
24
|
|
27
25
|
task :release => :build do
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
files = if !ARGV.empty?
|
4
|
+
ARGV.select { |file| File.exist?(file) }
|
5
|
+
else
|
6
|
+
Dir['*_example.md']
|
7
|
+
end
|
8
|
+
|
9
|
+
files.each do |file|
|
10
|
+
puts "Executing #{file.split('.')[0].tr('_', ' ')}"
|
11
|
+
code = File.read(file).match(/```ruby(?<code>.+)```/m)[:code]
|
12
|
+
unless code.nil?
|
13
|
+
eval(['$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"', code].join("\n"))
|
14
|
+
end
|
15
|
+
end
|
data/lib/axlsx.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'htmlentities'
|
3
3
|
require 'axlsx/version.rb'
|
4
|
+
require 'mimemagic'
|
4
5
|
|
5
6
|
require 'axlsx/util/simple_typed_list.rb'
|
6
7
|
require 'axlsx/util/constants.rb'
|
@@ -8,8 +9,8 @@ require 'axlsx/util/validators.rb'
|
|
8
9
|
require 'axlsx/util/accessors.rb'
|
9
10
|
require 'axlsx/util/serialized_attributes'
|
10
11
|
require 'axlsx/util/options_parser'
|
11
|
-
|
12
|
-
|
12
|
+
require 'axlsx/util/mime_type_utils'
|
13
|
+
require 'axlsx/util/zip_command'
|
13
14
|
|
14
15
|
require 'axlsx/stylesheet/styles.rb'
|
15
16
|
|
@@ -53,7 +54,7 @@ module Axlsx
|
|
53
54
|
cells = sort_cells(cells)
|
54
55
|
reference = "#{cells.first.reference(absolute)}:#{cells.last.reference(absolute)}"
|
55
56
|
if absolute
|
56
|
-
escaped_name = cells.first.row.worksheet.name.gsub
|
57
|
+
escaped_name = cells.first.row.worksheet.name.gsub ''', "''"
|
57
58
|
"'#{escaped_name}'!#{reference}"
|
58
59
|
else
|
59
60
|
reference
|
@@ -65,7 +66,7 @@ module Axlsx
|
|
65
66
|
# @param [Array] cells
|
66
67
|
# @return [Array]
|
67
68
|
def self.sort_cells(cells)
|
68
|
-
cells.sort { |x, y| [x.index, x.row.
|
69
|
+
cells.sort { |x, y| [x.index, x.row.row_index] <=> [y.index, y.row.row_index] }
|
69
70
|
end
|
70
71
|
|
71
72
|
#global reference html entity encoding
|
@@ -88,20 +89,21 @@ module Axlsx
|
|
88
89
|
# @note This follows the standard spreadsheet convention of naming columns A to Z, followed by AA to AZ etc.
|
89
90
|
# @return [String]
|
90
91
|
def self.col_ref(index)
|
91
|
-
chars =
|
92
|
+
chars = ''
|
92
93
|
while index >= 26 do
|
93
|
-
|
94
|
-
|
94
|
+
index, char = index.divmod(26)
|
95
|
+
chars.prepend((char + 65).chr)
|
96
|
+
index -= 1
|
95
97
|
end
|
96
|
-
chars
|
97
|
-
chars
|
98
|
+
chars.prepend((index + 65).chr)
|
99
|
+
chars
|
98
100
|
end
|
99
101
|
|
100
102
|
# @return [String] The alpha(column)numeric(row) reference for this sell.
|
101
103
|
# @example Relative Cell Reference
|
102
104
|
# ws.rows.first.cells.first.r #=> "A1"
|
103
105
|
def self.cell_r(c_index, r_index)
|
104
|
-
|
106
|
+
col_ref(c_index) << (r_index+1).to_s
|
105
107
|
end
|
106
108
|
|
107
109
|
# Creates an array of individual cell references based on an excel reference range.
|
@@ -113,7 +115,7 @@ module Axlsx
|
|
113
115
|
end_col, end_row = name_to_indices($2)
|
114
116
|
(start_row..end_row).to_a.map do |row_num|
|
115
117
|
(start_col..end_col).to_a.map do |col_num|
|
116
|
-
|
118
|
+
cell_r(col_num, row_num)
|
117
119
|
end
|
118
120
|
end
|
119
121
|
end
|
@@ -127,14 +129,30 @@ module Axlsx
|
|
127
129
|
s.gsub(/_(.)/){ $1.upcase }
|
128
130
|
end
|
129
131
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
132
|
+
# returns the provided string with all invalid control charaters
|
133
|
+
# removed.
|
134
|
+
# @param [String] str The string to process
|
135
|
+
# @return [String]
|
136
|
+
def self.sanitize(str)
|
137
|
+
if str.frozen?
|
138
|
+
str.delete(CONTROL_CHARS)
|
139
|
+
else
|
140
|
+
str.delete!(CONTROL_CHARS)
|
141
|
+
str
|
136
142
|
end
|
143
|
+
end
|
137
144
|
|
145
|
+
# If value is boolean return 1 or 0
|
146
|
+
# else return the value
|
147
|
+
# @param [Object] value The value to process
|
148
|
+
# @return [Object]
|
149
|
+
def self.booleanize(value)
|
150
|
+
if value == true || value == false
|
151
|
+
value ? 1 : 0
|
152
|
+
else
|
153
|
+
value
|
154
|
+
end
|
155
|
+
end
|
138
156
|
|
139
157
|
# Instructs the serializer to not try to escape cell value input.
|
140
158
|
# This will give you a huge speed bonus, but if you content has <, > or other xml character data
|
@@ -24,7 +24,7 @@ module Axlsx
|
|
24
24
|
# Serialize the contenty type to xml
|
25
25
|
def to_xml_string(node_name = '', str = '')
|
26
26
|
str << "<#{node_name} "
|
27
|
-
str << instance_values.map { |key, value|
|
27
|
+
str << instance_values.map { |key, value| Axlsx::camel(key) << '="' << value.to_s << '"' }.join(' ')
|
28
28
|
str << '/>'
|
29
29
|
end
|
30
30
|
|
@@ -16,7 +16,7 @@ module Axlsx
|
|
16
16
|
# @return [String]
|
17
17
|
def to_xml_string(str = '')
|
18
18
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
19
|
-
str << '<Types xmlns="' << XML_NS_T << '">'
|
19
|
+
str << ('<Types xmlns="' << XML_NS_T << '">')
|
20
20
|
each { |type| type.to_xml_string(str) }
|
21
21
|
str << '</Types>'
|
22
22
|
end
|
data/lib/axlsx/doc_props/app.rb
CHANGED
@@ -222,7 +222,7 @@ module Axlsx
|
|
222
222
|
# @return [String]
|
223
223
|
def to_xml_string(str = '')
|
224
224
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
225
|
-
str << '<Properties xmlns="' << APP_NS << '" xmlns:vt="' << APP_NS_VT << '">'
|
225
|
+
str << ('<Properties xmlns="' << APP_NS << '" xmlns:vt="' << APP_NS_VT << '">')
|
226
226
|
instance_values.each do |key, value|
|
227
227
|
node_name = Axlsx.camel(key)
|
228
228
|
str << "<#{node_name}>#{value}</#{node_name}>"
|
data/lib/axlsx/doc_props/core.rb
CHANGED
@@ -25,11 +25,11 @@ module Axlsx
|
|
25
25
|
# @return [String]
|
26
26
|
def to_xml_string(str = '')
|
27
27
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
28
|
-
str << '<cp:coreProperties xmlns:cp="' << CORE_NS << '" xmlns:dc="' << CORE_NS_DC << '" '
|
29
|
-
str << 'xmlns:dcmitype="' << CORE_NS_DCMIT << '" xmlns:dcterms="' << CORE_NS_DCT << '" '
|
30
|
-
str << 'xmlns:xsi="' << CORE_NS_XSI << '">'
|
31
|
-
str << '<dc:creator>' << self.creator << '</dc:creator>'
|
32
|
-
str << '<dcterms:created xsi:type="dcterms:W3CDTF">' << (created || Time.now).strftime('%Y-%m-%dT%H:%M:%S') << 'Z</dcterms:created>'
|
28
|
+
str << ('<cp:coreProperties xmlns:cp="' << CORE_NS << '" xmlns:dc="' << CORE_NS_DC << '" ')
|
29
|
+
str << ('xmlns:dcmitype="' << CORE_NS_DCMIT << '" xmlns:dcterms="' << CORE_NS_DCT << '" ')
|
30
|
+
str << ('xmlns:xsi="' << CORE_NS_XSI << '">')
|
31
|
+
str << ('<dc:creator>' << self.creator << '</dc:creator>')
|
32
|
+
str << ('<dcterms:created xsi:type="dcterms:W3CDTF">' << (created || Time.now).strftime('%Y-%m-%dT%H:%M:%S') << 'Z</dcterms:created>')
|
33
33
|
str << '<cp:revision>0</cp:revision>'
|
34
34
|
str << '</cp:coreProperties>'
|
35
35
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
|
4
|
+
# The AreaChart is a two dimentional line chart (who would have guessed?) that you can add to your worksheet.
|
5
|
+
# @example Creating a chart
|
6
|
+
# # This example creates a line in a single sheet.
|
7
|
+
# require "rubygems" # if that is your preferred way to manage gems!
|
8
|
+
# require "axlsx"
|
9
|
+
#
|
10
|
+
# p = Axlsx::Package.new
|
11
|
+
# ws = p.workbook.add_worksheet
|
12
|
+
# ws.add_row ["This is a chart with no data in the sheet"]
|
13
|
+
#
|
14
|
+
# chart = ws.add_chart(Axlsx::AreaChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
|
15
|
+
# chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
|
16
|
+
#
|
17
|
+
# @see Worksheet#add_chart
|
18
|
+
# @see Worksheet#add_row
|
19
|
+
# @see Chart#add_series
|
20
|
+
# @see Series
|
21
|
+
# @see Package#serialize
|
22
|
+
class AreaChart < Chart
|
23
|
+
|
24
|
+
# the category axis
|
25
|
+
# @return [CatAxis]
|
26
|
+
def cat_axis
|
27
|
+
axes[:cat_axis]
|
28
|
+
end
|
29
|
+
alias :catAxis :cat_axis
|
30
|
+
|
31
|
+
# the category axis
|
32
|
+
# @return [ValAxis]
|
33
|
+
def val_axis
|
34
|
+
axes[:val_axis]
|
35
|
+
end
|
36
|
+
alias :valAxis :val_axis
|
37
|
+
|
38
|
+
# must be one of [:percentStacked, :clustered, :standard, :stacked]
|
39
|
+
# @return [Symbol]
|
40
|
+
attr_reader :grouping
|
41
|
+
|
42
|
+
# Creates a new line chart object
|
43
|
+
# @param [GraphicFrame] frame The workbook that owns this chart.
|
44
|
+
# @option options [Cell, String] title
|
45
|
+
# @option options [Boolean] show_legend
|
46
|
+
# @option options [Symbol] grouping
|
47
|
+
# @see Chart
|
48
|
+
def initialize(frame, options={})
|
49
|
+
@vary_colors = false
|
50
|
+
@grouping = :standard
|
51
|
+
super(frame, options)
|
52
|
+
@series_type = AreaSeries
|
53
|
+
@d_lbls = nil
|
54
|
+
end
|
55
|
+
|
56
|
+
# @see grouping
|
57
|
+
def grouping=(v)
|
58
|
+
RestrictionValidator.validate "AreaChart.grouping", [:percentStacked, :standard, :stacked], v
|
59
|
+
@grouping = v
|
60
|
+
end
|
61
|
+
|
62
|
+
# The node name to use in serialization. As AreaChart is used as the
|
63
|
+
# base class for Liine3DChart we need to be sure to serialize the
|
64
|
+
# chart based on the actual class type and not a fixed node name.
|
65
|
+
# @return [String]
|
66
|
+
def node_name
|
67
|
+
path = self.class.to_s
|
68
|
+
if i = path.rindex('::')
|
69
|
+
path = path[(i+2)..-1]
|
70
|
+
end
|
71
|
+
path[0] = path[0].chr.downcase
|
72
|
+
path
|
73
|
+
end
|
74
|
+
|
75
|
+
# Serializes the object
|
76
|
+
# @param [String] str
|
77
|
+
# @return [String]
|
78
|
+
def to_xml_string(str = '')
|
79
|
+
super(str) do
|
80
|
+
str << ("<c:" << node_name << ">")
|
81
|
+
str << ('<c:grouping val="' << grouping.to_s << '"/>')
|
82
|
+
str << ('<c:varyColors val="' << vary_colors.to_s << '"/>')
|
83
|
+
@series.each { |ser| ser.to_xml_string(str) }
|
84
|
+
@d_lbls.to_xml_string(str) if @d_lbls
|
85
|
+
yield if block_given?
|
86
|
+
axes.to_xml_string(str, :ids => true)
|
87
|
+
str << ("</c:" << node_name << ">")
|
88
|
+
axes.to_xml_string(str)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# The axes for this chart. AreaCharts have a category and value
|
93
|
+
# axis.
|
94
|
+
# @return [Axes]
|
95
|
+
def axes
|
96
|
+
@axes ||= Axes.new(:cat_axis => CatAxis, :val_axis => ValAxis)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Axlsx
|
3
|
+
# A AreaSeries defines the title, data and labels for line charts
|
4
|
+
# @note The recommended way to manage series is to use Chart#add_series
|
5
|
+
# @see Worksheet#add_chart
|
6
|
+
# @see Chart#add_series
|
7
|
+
class AreaSeries < Series
|
8
|
+
|
9
|
+
# The data for this series.
|
10
|
+
# @return [ValAxisData]
|
11
|
+
attr_reader :data
|
12
|
+
|
13
|
+
# The labels for this series.
|
14
|
+
# @return [CatAxisData]
|
15
|
+
attr_reader :labels
|
16
|
+
|
17
|
+
# The fill color for this series.
|
18
|
+
# Red, green, and blue is expressed as sequence of hex digits, RRGGBB. A perceptual gamma of 2.2 is used.
|
19
|
+
# @return [String]
|
20
|
+
attr_reader :color
|
21
|
+
|
22
|
+
# show markers on values
|
23
|
+
# @return [Boolean]
|
24
|
+
attr_reader :show_marker
|
25
|
+
|
26
|
+
# custom marker symbol
|
27
|
+
# @return [String]
|
28
|
+
attr_reader :marker_symbol
|
29
|
+
|
30
|
+
# line smoothing on values
|
31
|
+
# @return [Boolean]
|
32
|
+
attr_reader :smooth
|
33
|
+
|
34
|
+
# Creates a new series
|
35
|
+
# @option options [Array, SimpleTypedList] data
|
36
|
+
# @option options [Array, SimpleTypedList] labels
|
37
|
+
# @param [Chart] chart
|
38
|
+
def initialize(chart, options={})
|
39
|
+
@show_marker = false
|
40
|
+
@marker_symbol = options[:marker_symbol] ? options[:marker_symbol] : :default
|
41
|
+
@smooth = false
|
42
|
+
@labels, @data = nil, nil
|
43
|
+
super(chart, options)
|
44
|
+
@labels = AxDataSource.new(:data => options[:labels]) unless options[:labels].nil?
|
45
|
+
@data = NumDataSource.new(options) unless options[:data].nil?
|
46
|
+
end
|
47
|
+
|
48
|
+
# @see color
|
49
|
+
def color=(v)
|
50
|
+
@color = v
|
51
|
+
end
|
52
|
+
|
53
|
+
# @see show_marker
|
54
|
+
def show_marker=(v)
|
55
|
+
Axlsx::validate_boolean(v)
|
56
|
+
@show_marker = v
|
57
|
+
end
|
58
|
+
|
59
|
+
# @see marker_symbol
|
60
|
+
def marker_symbol=(v)
|
61
|
+
Axlsx::validate_marker_symbol(v)
|
62
|
+
@marker_symbol = v
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see smooth
|
66
|
+
def smooth=(v)
|
67
|
+
Axlsx::validate_boolean(v)
|
68
|
+
@smooth = v
|
69
|
+
end
|
70
|
+
|
71
|
+
# Serializes the object
|
72
|
+
# @param [String] str
|
73
|
+
# @return [String]
|
74
|
+
def to_xml_string(str = '')
|
75
|
+
super(str) do
|
76
|
+
if color
|
77
|
+
str << '<c:spPr><a:solidFill>'
|
78
|
+
str << ('<a:srgbClr val="' << color << '"/>')
|
79
|
+
str << '</a:solidFill>'
|
80
|
+
str << '<a:ln w="28800">'
|
81
|
+
str << '<a:solidFill>'
|
82
|
+
str << ('<a:srgbClr val="' << color << '"/>')
|
83
|
+
str << '</a:solidFill>'
|
84
|
+
str << '</a:ln>'
|
85
|
+
str << '<a:round/>'
|
86
|
+
str << '</c:spPr>'
|
87
|
+
end
|
88
|
+
|
89
|
+
if !@show_marker
|
90
|
+
str << '<c:marker><c:symbol val="none"/></c:marker>'
|
91
|
+
elsif @marker_symbol != :default
|
92
|
+
str << '<c:marker><c:symbol val="' + @marker_symbol.to_s + '"/></c:marker>'
|
93
|
+
end
|
94
|
+
|
95
|
+
@labels.to_xml_string(str) unless @labels.nil?
|
96
|
+
@data.to_xml_string(str) unless @data.nil?
|
97
|
+
str << ('<c:smooth val="' << ((smooth) ? '1' : '0') << '"/>')
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
# assigns the data for this series
|
104
|
+
def data=(v) DataTypeValidator.validate "Series.data", [NumDataSource], v; @data = v; end
|
105
|
+
|
106
|
+
# assigns the labels for this series
|
107
|
+
def labels=(v) DataTypeValidator.validate "Series.labels", [AxDataSource], v; @labels = v; end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
data/lib/axlsx/drawing/axes.rb
CHANGED
@@ -32,7 +32,7 @@ module Axlsx
|
|
32
32
|
if options[:ids]
|
33
33
|
# CatAxis must come first in the XML (for Microsoft Excel at least)
|
34
34
|
sorted = axes.sort_by { |name, axis| axis.kind_of?(CatAxis) ? 0 : 1 }
|
35
|
-
sorted.
|
35
|
+
sorted.each { |axis| str << ('<c:axId val="' << axis[1].id.to_s << '"/>') }
|
36
36
|
else
|
37
37
|
axes.each { |axis| axis[1].to_xml_string(str) }
|
38
38
|
end
|
data/lib/axlsx/drawing/axis.rb
CHANGED
@@ -150,10 +150,10 @@ module Axlsx
|
|
150
150
|
# @param [String] str
|
151
151
|
# @return [String]
|
152
152
|
def to_xml_string(str = '')
|
153
|
-
str << '<c:axId val="' << @id.to_s << '"/>'
|
153
|
+
str << ('<c:axId val="' << @id.to_s << '"/>')
|
154
154
|
@scaling.to_xml_string str
|
155
|
-
str << '<c:delete val="'<< @delete.to_s << '"/>'
|
156
|
-
str << '<c:axPos val="' << @ax_pos.to_s << '"/>'
|
155
|
+
str << ('<c:delete val="' << @delete.to_s << '"/>')
|
156
|
+
str << ('<c:axPos val="' << @ax_pos.to_s << '"/>')
|
157
157
|
str << '<c:majorGridlines>'
|
158
158
|
# TODO shape properties need to be extracted into a class
|
159
159
|
if gridlines == false
|
@@ -165,21 +165,24 @@ module Axlsx
|
|
165
165
|
end
|
166
166
|
str << '</c:majorGridlines>'
|
167
167
|
@title.to_xml_string(str) unless @title == nil
|
168
|
-
|
168
|
+
# Need to set sourceLinked to 0 if we're setting a format code on this row
|
169
|
+
# otherwise it will never take, as it will always prefer the 'General' formatting
|
170
|
+
# of the cells themselves
|
171
|
+
str << ('<c:numFmt formatCode="' << @format_code << '" sourceLinked="' << (@format_code.eql?('General') ? '1' : '0') << '"/>')
|
169
172
|
str << '<c:majorTickMark val="none"/>'
|
170
173
|
str << '<c:minorTickMark val="none"/>'
|
171
|
-
str << '<c:tickLblPos val="' << @tick_lbl_pos.to_s << '"/>'
|
174
|
+
str << ('<c:tickLblPos val="' << @tick_lbl_pos.to_s << '"/>')
|
172
175
|
# TODO - this is also being used for series colors
|
173
176
|
# time to extract this into a class spPr - Shape Properties
|
174
177
|
if @color
|
175
178
|
str << '<c:spPr><a:ln><a:solidFill>'
|
176
|
-
str << '<a:srgbClr val="' << @color << '"/>'
|
179
|
+
str << ('<a:srgbClr val="' << @color << '"/>')
|
177
180
|
str << '</a:solidFill></a:ln></c:spPr>'
|
178
181
|
end
|
179
182
|
# some potential value in implementing this in full. Very detailed!
|
180
|
-
str << '<c:txPr><a:bodyPr rot="' << @label_rotation.to_s << '"/><a:lstStyle/><a:p><a:pPr><a:defRPr/></a:pPr><a:endParaRPr/></a:p></c:txPr>'
|
181
|
-
str << '<c:crossAx val="' << @cross_axis.id.to_s << '"/>'
|
182
|
-
str << '<c:crosses val="' << @crosses.to_s << '"/>'
|
183
|
+
str << ('<c:txPr><a:bodyPr rot="' << @label_rotation.to_s << '"/><a:lstStyle/><a:p><a:pPr><a:defRPr/></a:pPr><a:endParaRPr/></a:p></c:txPr>')
|
184
|
+
str << ('<c:crossAx val="' << @cross_axis.id.to_s << '"/>')
|
185
|
+
str << ('<c:crosses val="' << @crosses.to_s << '"/>')
|
183
186
|
end
|
184
187
|
|
185
188
|
end
|