axlsx 1.0.15 → 1.1.1
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.
- data/.yardopts +1 -0
- data/CHANGELOG.md +58 -2
- data/README.md +425 -207
- data/Rakefile +6 -2
- data/examples/axlsx.xlsx +0 -0
- data/examples/example.csv +1000 -0
- data/examples/example.rb +266 -132
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/real_example.rb +63 -0
- data/examples/sample.png +0 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/lib/axlsx/content_type/content_type.rb +13 -12
- data/lib/axlsx/content_type/default.rb +10 -6
- data/lib/axlsx/content_type/override.rb +13 -8
- data/lib/axlsx/doc_props/app.rb +38 -41
- data/lib/axlsx/doc_props/core.rb +13 -17
- data/lib/axlsx/drawing/axis.rb +39 -19
- data/lib/axlsx/drawing/bar_3D_chart.rb +34 -32
- data/lib/axlsx/drawing/bar_series.rb +14 -14
- data/lib/axlsx/drawing/cat_axis.rb +16 -14
- data/lib/axlsx/drawing/cat_axis_data.rb +17 -18
- data/lib/axlsx/drawing/chart.rb +40 -41
- data/lib/axlsx/drawing/drawing.rb +27 -12
- data/lib/axlsx/drawing/graphic_frame.rb +22 -21
- data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
- data/lib/axlsx/drawing/hyperlink.rb +96 -0
- data/lib/axlsx/drawing/hyperlink.rb~ +64 -0
- data/lib/axlsx/drawing/line_3D_chart.rb +31 -28
- data/lib/axlsx/drawing/line_series.rb +12 -11
- data/lib/axlsx/drawing/marker.rb +11 -8
- data/lib/axlsx/drawing/named_axis_data.rb +36 -0
- data/lib/axlsx/drawing/one_cell_anchor.rb +18 -16
- data/lib/axlsx/drawing/pic.rb +47 -33
- data/lib/axlsx/drawing/picture_locking.rb +22 -18
- data/lib/axlsx/drawing/pie_3D_chart.rb +11 -8
- data/lib/axlsx/drawing/pie_series.rb +16 -12
- data/lib/axlsx/drawing/scaling.rb +11 -10
- data/lib/axlsx/drawing/scatter_chart.rb +69 -0
- data/lib/axlsx/drawing/scatter_series.rb +39 -0
- data/lib/axlsx/drawing/ser_axis.rb +11 -10
- data/lib/axlsx/drawing/series.rb +16 -15
- data/lib/axlsx/drawing/series_title.rb +15 -14
- data/lib/axlsx/drawing/title.rb +27 -26
- data/lib/axlsx/drawing/two_cell_anchor.rb +19 -20
- data/lib/axlsx/drawing/val_axis.rb +9 -7
- data/lib/axlsx/drawing/val_axis_data.rb +18 -17
- data/lib/axlsx/drawing/view_3D.rb +23 -20
- data/lib/axlsx/package.rb +117 -52
- data/lib/axlsx/rels/relationship.rb +27 -8
- data/lib/axlsx/rels/relationships.rb +9 -2
- data/lib/axlsx/stylesheet/border.rb +28 -23
- data/lib/axlsx/stylesheet/border_pr.rb +17 -15
- data/lib/axlsx/stylesheet/cell_alignment.rb +24 -21
- data/lib/axlsx/stylesheet/cell_protection.rb +11 -7
- data/lib/axlsx/stylesheet/cell_style.rb +9 -5
- data/lib/axlsx/stylesheet/color.rb +20 -14
- data/lib/axlsx/stylesheet/fill.rb +8 -5
- data/lib/axlsx/stylesheet/font.rb +22 -14
- data/lib/axlsx/stylesheet/gradient_fill.rb +20 -17
- data/lib/axlsx/stylesheet/gradient_stop.rb +10 -6
- data/lib/axlsx/stylesheet/num_fmt.rb +13 -6
- data/lib/axlsx/stylesheet/pattern_fill.rb +26 -10
- data/lib/axlsx/stylesheet/styles.rb +55 -41
- data/lib/axlsx/stylesheet/table_style.rb +10 -4
- data/lib/axlsx/stylesheet/table_style_element.rb +11 -7
- data/lib/axlsx/stylesheet/table_styles.rb +12 -8
- data/lib/axlsx/stylesheet/xf.rb +30 -25
- data/lib/axlsx/util/cbf.rb +69 -33
- data/lib/axlsx/util/constants.rb +39 -20
- data/lib/axlsx/util/doc/_index.html +84 -0
- data/lib/axlsx/util/doc/class_list.html +47 -0
- data/lib/axlsx/util/doc/css/common.css +1 -0
- data/lib/axlsx/util/doc/css/full_list.css +55 -0
- data/lib/axlsx/util/doc/css/style.css +322 -0
- data/lib/axlsx/util/doc/file_list.html +46 -0
- data/lib/axlsx/util/doc/frames.html +13 -0
- data/lib/axlsx/util/doc/index.html +84 -0
- data/lib/axlsx/util/doc/js/app.js +205 -0
- data/lib/axlsx/util/doc/js/full_list.js +173 -0
- data/lib/axlsx/util/doc/js/jquery.js +16 -0
- data/lib/axlsx/util/doc/method_list.html +46 -0
- data/lib/axlsx/util/doc/top-level-namespace.html +95 -0
- data/lib/axlsx/util/font_tables.rb~ +0 -0
- data/lib/axlsx/util/ms_off_crypto.rb +10 -10
- data/lib/axlsx/util/parser.rb +1 -0
- data/lib/axlsx/util/simple_typed_list.rb +20 -10
- data/lib/axlsx/util/storage.rb +1 -1
- data/lib/axlsx/util/validators.rb +23 -7
- data/lib/axlsx/version.rb +5 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +68 -0
- data/lib/axlsx/workbook/shared_strings_table.rb~ +69 -0
- data/lib/axlsx/workbook/workbook.rb +82 -26
- data/lib/axlsx/workbook/worksheet/cell.rb +166 -130
- data/lib/axlsx/workbook/worksheet/col.rb +114 -0
- data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +29 -0
- data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -0
- data/lib/axlsx/workbook/worksheet/row.rb +53 -21
- data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/table.rb +96 -0
- data/lib/axlsx/workbook/worksheet/table.rb~ +97 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +275 -124
- data/lib/axlsx.rb +41 -14
- data/lib/schema/dc.xsd +5 -5
- data/lib/schema/dcmitype.xsd +5 -3
- data/lib/schema/dcterms.xsd +15 -15
- data/lib/schema/opc-coreProperties.xsd +6 -2
- data/lib/schema/xml.xsd +7 -8
- data/test/benchmark.rb +73 -0
- data/test/content_type/tc_content_type.rb +31 -31
- data/test/content_type/tc_default.rb +9 -22
- data/test/content_type/tc_override.rb +8 -21
- data/test/doc_props/tc_app.rb +2 -8
- data/test/doc_props/tc_core.rb +6 -7
- data/test/drawing/tc_axis.rb +7 -3
- data/test/drawing/tc_bar_3D_chart.rb +6 -7
- data/test/drawing/tc_bar_series.rb +4 -5
- data/test/drawing/tc_cat_axis.rb +2 -3
- data/test/drawing/tc_cat_axis_data.rb +2 -3
- data/test/drawing/tc_chart.rb +13 -14
- data/test/drawing/tc_drawing.rb +7 -8
- data/test/drawing/tc_graphic_frame.rb +3 -4
- data/test/drawing/tc_hyperlink.rb +69 -0
- data/test/drawing/tc_line_3d_chart.rb +5 -6
- data/test/drawing/tc_line_series.rb +3 -4
- data/test/drawing/tc_marker.rb +3 -4
- data/test/drawing/tc_one_cell_anchor.rb +6 -7
- data/test/drawing/tc_pic.rb +13 -8
- data/test/drawing/tc_picture_locking.rb +2 -3
- data/test/drawing/tc_pie_3D_chart.rb +5 -6
- data/test/drawing/tc_pie_series.rb +4 -5
- data/test/drawing/tc_scaling.rb +3 -4
- data/test/drawing/tc_scatter_chart.rb +43 -0
- data/test/drawing/tc_scatter_series.rb +20 -0
- data/test/drawing/tc_ser_axis.rb +2 -3
- data/test/drawing/tc_series.rb +4 -5
- data/test/drawing/tc_series_title.rb +4 -5
- data/test/drawing/tc_title.rb +4 -5
- data/test/drawing/tc_two_cell_anchor.rb +4 -5
- data/test/drawing/tc_val_axis.rb +2 -3
- data/test/drawing/tc_val_axis_data.rb +2 -3
- data/test/drawing/tc_view_3D.rb +6 -7
- data/test/profile.rb +34 -0
- data/test/rels/tc_relationship.rb +10 -6
- data/test/rels/tc_relationships.rb +4 -5
- data/test/stylesheet/tc_border.rb +3 -4
- data/test/stylesheet/tc_border_pr.rb +3 -4
- data/test/stylesheet/tc_cell_alignment.rb +10 -6
- data/test/stylesheet/tc_cell_protection.rb +2 -3
- data/test/stylesheet/tc_cell_style.rb +2 -3
- data/test/stylesheet/tc_color.rb +2 -3
- data/test/stylesheet/tc_fill.rb +1 -2
- data/test/stylesheet/tc_font.rb +12 -5
- data/test/stylesheet/tc_gradient_fill.rb +1 -2
- data/test/stylesheet/tc_gradient_stop.rb +1 -2
- data/test/stylesheet/tc_num_fmt.rb +1 -2
- data/test/stylesheet/tc_pattern_fill.rb +3 -4
- data/test/stylesheet/tc_styles.rb +31 -6
- data/test/stylesheet/tc_table_style.rb +2 -3
- data/test/stylesheet/tc_table_style_element.rb +2 -3
- data/test/stylesheet/tc_table_styles.rb +3 -4
- data/test/stylesheet/tc_xf.rb +16 -17
- data/test/tc_axlsx.rb +39 -0
- data/test/tc_helper.rb +3 -0
- data/test/tc_package.rb +43 -9
- data/test/util/tc_simple_typed_list.rb +8 -9
- data/test/util/tc_validators.rb +7 -8
- data/test/workbook/tc_shared_strings_table.rb +38 -0
- data/test/workbook/tc_workbook.rb +32 -6
- data/test/workbook/worksheet/table/tc_table.rb +71 -0
- data/test/workbook/worksheet/table/tc_table.rb~ +72 -0
- data/test/workbook/worksheet/tc_cell.rb +80 -13
- data/test/workbook/worksheet/tc_col.rb +59 -0
- data/test/workbook/worksheet/tc_col.rb~ +10 -0
- data/test/workbook/worksheet/tc_date_time_converter.rb +132 -0
- data/test/workbook/worksheet/tc_page_margins.rb +97 -0
- data/test/workbook/worksheet/tc_row.rb +54 -4
- data/test/workbook/worksheet/tc_worksheet.rb +205 -31
- metadata +78 -84
- data/examples/example.rb~ +0 -112
- data/test/drawing/tc_line_series.tc~ +0 -34
- data/test/drawing/tc_picture_locking.rb~ +0 -77
data/examples/example.rb
CHANGED
|
@@ -1,184 +1,318 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
|
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
|
4
|
+
require 'axlsx'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
p = Axlsx::Package.new
|
|
7
|
+
wb = p.workbook
|
|
7
8
|
|
|
8
9
|
#A Simple Workbook
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
wb.add_worksheet(:name => "Basic Worksheet") do |sheet|
|
|
12
|
+
sheet.add_row ["First Column", "Second", "Third"]
|
|
13
|
+
sheet.add_row [1, 2, 3]
|
|
14
|
+
end
|
|
14
15
|
|
|
15
16
|
#Using Custom Styles
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
wb.styles do |s|
|
|
19
|
+
black_cell = s.add_style :bg_color => "00", :fg_color => "FF", :sz => 14, :alignment => { :horizontal=> :center }
|
|
20
|
+
blue_cell = s.add_style :bg_color => "0000FF", :fg_color => "FF", :sz => 20, :alignment => { :horizontal=> :center }
|
|
21
|
+
wb.add_worksheet(:name => "Custom Styles") do |sheet|
|
|
22
|
+
sheet.add_row ["Text Autowidth", "Second", "Third"], :style => [black_cell, blue_cell, black_cell]
|
|
23
|
+
sheet.add_row [1, 2, 3], :style => Axlsx::STYLE_THIN_BORDER
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
#Using Custom Border Styles
|
|
28
|
+
|
|
29
|
+
wb.styles do |s|
|
|
30
|
+
red_border = s.add_style :border => {:style=>:thin, :color =>"FFFF0000"}
|
|
31
|
+
blue_border = s.add_style :border => {:style=>:thin, :color =>"FF0000FF"}
|
|
32
|
+
|
|
33
|
+
wb.add_worksheet(:name => "Custom Borders") do |sheet|
|
|
34
|
+
sheet.add_row ["wrap", "me", "Up in Red"], :style => red_border
|
|
35
|
+
sheet.add_row [1, 2, 3], :style => blue_border
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
25
39
|
|
|
26
40
|
##Using Custom Formatting and date1904
|
|
41
|
+
require 'date'
|
|
42
|
+
wb.styles do |s|
|
|
43
|
+
date = s.add_style(:format_code => "yyyy-mm-dd", :border => Axlsx::STYLE_THIN_BORDER)
|
|
44
|
+
padded = s.add_style(:format_code => "00#", :border => Axlsx::STYLE_THIN_BORDER)
|
|
45
|
+
percent = s.add_style(:format_code => "0000%", :border => Axlsx::STYLE_THIN_BORDER)
|
|
46
|
+
# wb.date1904 = true # Use the 1904 date system (Used by Excel for Mac < 2011)
|
|
47
|
+
wb.add_worksheet(:name => "Formatting Data") do |sheet|
|
|
48
|
+
sheet.add_row ["Custom Formatted Date", "Percent Formatted Float", "Padded Numbers"], :style => Axlsx::STYLE_THIN_BORDER
|
|
49
|
+
sheet.add_row [Date::strptime('2012-01-19','%Y-%m-%d'), 0.2, 32], :style => [date, percent, padded]
|
|
50
|
+
end
|
|
51
|
+
end
|
|
27
52
|
|
|
28
|
-
wb.styles do |s|
|
|
29
|
-
date = s.add_style(:format_code => "yyyy-mm-dd", :border => Axlsx::STYLE_THIN_BORDER)
|
|
30
|
-
padded = s.add_style(:format_code => "00#", :border => Axlsx::STYLE_THIN_BORDER)
|
|
31
|
-
percent = s.add_style(:format_code => "0000%", :border => Axlsx::STYLE_THIN_BORDER)
|
|
32
|
-
wb.date1904 = true # required for generation on mac
|
|
33
|
-
wb.add_worksheet(:name => "Formatting Data") do |sheet|
|
|
34
|
-
sheet.add_row ["Custom Formatted Date", "Percent Formatted Float", "Padded Numbers"], :style => Axlsx::STYLE_THIN_BORDER
|
|
35
|
-
sheet.add_row [Time.now, 0.2, 32], :style => [date, percent, padded]
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
53
|
|
|
39
54
|
##Add an Image
|
|
40
55
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
56
|
+
wb.add_worksheet(:name => "Images") do |sheet|
|
|
57
|
+
img = File.expand_path('../image1.jpeg', __FILE__)
|
|
58
|
+
sheet.add_image(:image_src => img, :noSelect => true, :noMove => true) do |image|
|
|
59
|
+
image.width=720
|
|
60
|
+
image.height=666
|
|
61
|
+
image.start_at 2, 2
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
##Add an Image with a hyperlink
|
|
66
|
+
|
|
67
|
+
wb.add_worksheet(:name => "Image with Hyperlink") do |sheet|
|
|
68
|
+
img = File.expand_path('../image1.jpeg', __FILE__)
|
|
69
|
+
sheet.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
|
|
70
|
+
image.width=720
|
|
71
|
+
image.height=666
|
|
72
|
+
image.hyperlink.tooltip = "Labeled Link"
|
|
73
|
+
image.start_at 2, 2
|
|
74
|
+
end
|
|
75
|
+
end
|
|
49
76
|
|
|
50
77
|
##Asian Language Support
|
|
51
78
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
79
|
+
wb.add_worksheet(:name => "日本語でのシート名") do |sheet|
|
|
80
|
+
sheet.add_row ["日本語"]
|
|
81
|
+
sheet.add_row ["华语/華語"]
|
|
82
|
+
sheet.add_row ["한국어/조선말"]
|
|
83
|
+
end
|
|
57
84
|
|
|
58
85
|
##Styling Columns
|
|
59
86
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
87
|
+
wb.styles do |s|
|
|
88
|
+
percent = s.add_style :num_fmt => 9
|
|
89
|
+
wb.add_worksheet(:name => "Styling Columns") do |sheet|
|
|
90
|
+
sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4']
|
|
91
|
+
sheet.add_row [1, 2, 0.3, 4]
|
|
92
|
+
sheet.add_row [1, 2, 0.2, 4]
|
|
93
|
+
sheet.add_row [1, 2, 0.1, 4]
|
|
94
|
+
sheet.col_style 2, percent, :row_offset => 1
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
##Hiding Columns
|
|
99
|
+
|
|
100
|
+
wb.styles do |s|
|
|
101
|
+
percent = s.add_style :num_fmt => 9
|
|
102
|
+
wb.add_worksheet(:name => "Hidden Column") do |sheet|
|
|
103
|
+
sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4']
|
|
104
|
+
sheet.add_row [1, 2, 0.3, 4]
|
|
105
|
+
sheet.add_row [1, 2, 0.2, 4]
|
|
106
|
+
sheet.add_row [1, 2, 0.1, 4]
|
|
107
|
+
sheet.col_style 2, percent, :row_offset => 1
|
|
108
|
+
sheet.column_info[1].hidden = true
|
|
109
|
+
end
|
|
110
|
+
end
|
|
70
111
|
|
|
71
112
|
##Styling Rows
|
|
72
113
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
114
|
+
wb.styles do |s|
|
|
115
|
+
head = s.add_style :bg_color => "00", :fg_color => "FF"
|
|
116
|
+
percent = s.add_style :num_fmt => 9
|
|
117
|
+
wb.add_worksheet(:name => "Styling Rows") do |sheet|
|
|
118
|
+
sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4']
|
|
119
|
+
sheet.add_row [1, 2, 0.3, 4]
|
|
120
|
+
sheet.add_row [1, 2, 0.2, 4]
|
|
121
|
+
sheet.add_row [1, 2, 0.1, 4]
|
|
122
|
+
sheet.col_style 2, percent, :row_offset => 1
|
|
123
|
+
sheet.row_style 0, head
|
|
124
|
+
end
|
|
125
|
+
end
|
|
85
126
|
|
|
86
127
|
##Styling Cell Overrides
|
|
87
128
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
129
|
+
wb.add_worksheet(:name => "Cell Level Style Overrides") do |sheet|
|
|
130
|
+
# cell level style overides when adding cells
|
|
131
|
+
sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4'], :sz => 16
|
|
132
|
+
sheet.add_row [1, 2, 3, "=SUM(A2:C2)"]
|
|
133
|
+
# cell level style overrides via sheet range
|
|
134
|
+
sheet["A1:D1"].each { |c| c.color = "FF0000"}
|
|
135
|
+
sheet['A1:D2'].each { |c| c.style = Axlsx::STYLE_THIN_BORDER }
|
|
136
|
+
end
|
|
96
137
|
|
|
97
138
|
##Using formula
|
|
98
139
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
140
|
+
wb.add_worksheet(:name => "Using Formulas") do |sheet|
|
|
141
|
+
sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4']
|
|
142
|
+
sheet.add_row [1, 2, 3, "=SUM(A2:C2)"]
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
##Automatic cell types
|
|
146
|
+
|
|
147
|
+
wb.add_worksheet(:name => "Automatic cell types") do |sheet|
|
|
148
|
+
sheet.add_row ["Date", "Time", "String", "Boolean", "Float", "Integer"]
|
|
149
|
+
sheet.add_row [Date.today, Time.now, "value", true, 0.1, 1]
|
|
150
|
+
end
|
|
103
151
|
|
|
104
152
|
##Merging Cells.
|
|
105
153
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
154
|
+
wb.add_worksheet(:name => 'Merging Cells') do |sheet|
|
|
155
|
+
# cell level style overides when adding cells
|
|
156
|
+
sheet.add_row ["col 1", "col 2", "col 3", "col 4"], :sz => 16
|
|
157
|
+
sheet.add_row [1, 2, 3, "=SUM(A2:C2)"]
|
|
158
|
+
sheet.add_row [2, 3, 4, "=SUM(A3:C3)"]
|
|
159
|
+
sheet.add_row ["total", "", "", "=SUM(D2:D3)"]
|
|
160
|
+
sheet.merge_cells("A4:C4")
|
|
161
|
+
sheet["A1:D1"].each { |c| c.color = "FF0000"}
|
|
162
|
+
sheet["A1:D4"].each { |c| c.style = Axlsx::STYLE_THIN_BORDER }
|
|
163
|
+
end
|
|
116
164
|
|
|
117
165
|
##Generating A Bar Chart
|
|
118
166
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
167
|
+
wb.add_worksheet(:name => "Bar Chart") do |sheet|
|
|
168
|
+
sheet.add_row ["A Simple Bar Chart"]
|
|
169
|
+
sheet.add_row ["First", "Second", "Third"]
|
|
170
|
+
sheet.add_row [1, 2, 3]
|
|
171
|
+
sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A4", :end_at => "F17") do |chart|
|
|
172
|
+
chart.add_series :data => sheet["A3:C3"], :labels => sheet["A2:C2"], :title => sheet["A1"]
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
##Hide Gridlines in chart
|
|
177
|
+
wb.add_worksheet(:name => "Chart With No Gridlines") do |sheet|
|
|
178
|
+
sheet.add_row ["A Simple Bar Chart"]
|
|
179
|
+
sheet.add_row ["First", "Second", "Third"]
|
|
180
|
+
sheet.add_row [1, 2, 3]
|
|
181
|
+
sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A4", :end_at => "F17") do |chart|
|
|
182
|
+
chart.add_series :data => sheet["A3:C3"], :labels => sheet["A2:C2"], :title => sheet["A1"]
|
|
183
|
+
chart.valAxis.gridlines = false
|
|
184
|
+
chart.catAxis.gridlines = false
|
|
185
|
+
end
|
|
186
|
+
end
|
|
127
187
|
|
|
128
188
|
##Generating A Pie Chart
|
|
129
189
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
190
|
+
wb.add_worksheet(:name => "Pie Chart") do |sheet|
|
|
191
|
+
sheet.add_row ["First", "Second", "Third", "Fourth"]
|
|
192
|
+
sheet.add_row [1, 2, 3, "=PRODUCT(A2:C2)"]
|
|
193
|
+
sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,2], :end_at => [5, 15], :title => "example 3: Pie Chart") do |chart|
|
|
194
|
+
chart.add_series :data => sheet["A2:D2"], :labels => sheet["A1:D1"]
|
|
195
|
+
end
|
|
196
|
+
end
|
|
137
197
|
|
|
138
198
|
##Data over time
|
|
139
199
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
200
|
+
wb.add_worksheet(:name=>'Charting Dates') do |sheet|
|
|
201
|
+
# cell level style overides when adding cells
|
|
202
|
+
sheet.add_row ['Date', 'Value'], :sz => 16
|
|
203
|
+
sheet.add_row [Time.now - (7*60*60*24), 3]
|
|
204
|
+
sheet.add_row [Time.now - (6*60*60*24), 7]
|
|
205
|
+
sheet.add_row [Time.now - (5*60*60*24), 18]
|
|
206
|
+
sheet.add_row [Time.now - (4*60*60*24), 1]
|
|
207
|
+
sheet.add_chart(Axlsx::Bar3DChart) do |chart|
|
|
208
|
+
chart.start_at "B7"
|
|
209
|
+
chart.end_at "H27"
|
|
210
|
+
chart.add_series(:data => sheet["B2:B5"], :labels => sheet["A2:A5"], :title => sheet["B1"])
|
|
211
|
+
end
|
|
212
|
+
end
|
|
153
213
|
|
|
154
214
|
##Generating A Line Chart
|
|
155
215
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
216
|
+
wb.add_worksheet(:name => "Line Chart") do |sheet|
|
|
217
|
+
sheet.add_row ["First", 1, 5, 7, 9]
|
|
218
|
+
sheet.add_row ["Second", 5, 2, 14, 9]
|
|
219
|
+
sheet.add_chart(Axlsx::Line3DChart, :title => "example 6: Line Chart", :rotX => 30, :rotY => 20) do |chart|
|
|
220
|
+
chart.start_at 0, 2
|
|
221
|
+
chart.end_at 10, 15
|
|
222
|
+
chart.add_series :data => sheet["B1:E1"], :title => sheet["A1"]
|
|
223
|
+
chart.add_series :data => sheet["B2:E2"], :title => sheet["A2"]
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
##Generating A Scatter Chart
|
|
228
|
+
|
|
229
|
+
wb.add_worksheet(:name => "Scatter Chart") do |sheet|
|
|
230
|
+
sheet.add_row ["First", 1, 5, 7, 9]
|
|
231
|
+
sheet.add_row ["", 1, 25, 49, 81]
|
|
232
|
+
sheet.add_row ["Second", 5, 2, 14, 9]
|
|
233
|
+
sheet.add_row ["", 5, 10, 15, 20]
|
|
234
|
+
sheet.add_chart(Axlsx::ScatterChart, :title => "example 7: Scatter Chart") do |chart|
|
|
235
|
+
chart.start_at 0, 4
|
|
236
|
+
chart.end_at 10, 19
|
|
237
|
+
chart.add_series :xData => sheet["B1:E1"], :yData => sheet["B2:E2"], :title => sheet["A1"]
|
|
238
|
+
chart.add_series :xData => sheet["B3:E3"], :yData => sheet["B4:E4"], :title => sheet["A3"]
|
|
239
|
+
end
|
|
240
|
+
end
|
|
166
241
|
|
|
167
242
|
##Auto Filter
|
|
168
243
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
244
|
+
wb.add_worksheet(:name => "Auto Filter") do |sheet|
|
|
245
|
+
sheet.add_row ["Build Matrix"]
|
|
246
|
+
sheet.add_row ["Build", "Duration", "Finished", "Rvm"]
|
|
247
|
+
sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
|
|
248
|
+
sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
|
|
249
|
+
sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
|
|
250
|
+
sheet.auto_filter = "A2:D5"
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
##Tables
|
|
254
|
+
|
|
255
|
+
wb.add_worksheet(:name => "Table") do |sheet|
|
|
256
|
+
sheet.add_row ["Build Matrix"]
|
|
257
|
+
sheet.add_row ["Build", "Duration", "Finished", "Rvm"]
|
|
258
|
+
sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
|
|
259
|
+
sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
|
|
260
|
+
sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
|
|
261
|
+
sheet.add_table "A2:D5", :name => 'Build Matrix'
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
##Specifying Column Widths
|
|
266
|
+
|
|
267
|
+
wb.add_worksheet(:name => "custom column widths") do |sheet|
|
|
268
|
+
sheet.add_row ["I use autowidth and am very wide", "I use a custom width and am narrow"]
|
|
269
|
+
sheet.add_row ['abcdefg', 'This is a very long text and should flow into the right cell', nil, 'xxx' ]
|
|
270
|
+
sheet.column_widths nil, 3, 5, nil
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
##Fit to page printing
|
|
274
|
+
|
|
275
|
+
wb.add_worksheet(:name => "fit to page") do |sheet|
|
|
276
|
+
sheet.add_row ['this all goes on one page']
|
|
277
|
+
sheet.fit_to_page = true
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
##Hide Gridlines in worksheet
|
|
282
|
+
wb.add_worksheet(:name => "No Gridlines") do |sheet|
|
|
283
|
+
sheet.add_row ["This", "Sheet", "Hides", "Gridlines"]
|
|
284
|
+
sheet.show_gridlines = false
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
##Specify Page Margins for printing
|
|
288
|
+
margins = {:left => 3, :right => 3, :top => 1.2, :bottom => 1.2, :header => 0.7, :footer => 0.7}
|
|
289
|
+
wb.add_worksheet(:name => "print margins", :page_margins => margins) do |sheet|
|
|
290
|
+
sheet.add_row ["this sheet uses customized page margins for printing"]
|
|
291
|
+
end
|
|
177
292
|
|
|
178
293
|
##Validate and Serialize
|
|
179
294
|
|
|
180
|
-
|
|
181
|
-
|
|
295
|
+
#p.validate.each { |e| puts e.message }
|
|
296
|
+
p.serialize("example.xlsx")
|
|
297
|
+
|
|
298
|
+
s = p.to_stream()
|
|
299
|
+
File.open('example_streamed.xlsx', 'w') { |f| f.write(s.read) }
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
##Using Shared Strings
|
|
303
|
+
p.use_shared_strings = true
|
|
304
|
+
p.serialize("shared_strings_example.xlsx")
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
##Disabling Autowidth
|
|
308
|
+
p = Axlsx::Package.new
|
|
309
|
+
p.use_autowidth = false
|
|
310
|
+
wb = p.workbook
|
|
311
|
+
wb.add_worksheet(:name => "No Magick") do | sheet |
|
|
312
|
+
sheet.add_row ['oh look! no autowidth - and no magick loaded in your process']
|
|
313
|
+
end
|
|
314
|
+
p.validate.each { |e| puts e.message }
|
|
315
|
+
p.serialize("no-use_autowidth.xlsx")
|
|
316
|
+
|
|
182
317
|
|
|
183
|
-
|
|
184
318
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
|
2
|
+
|
|
3
|
+
require 'axlsx'
|
|
4
|
+
|
|
5
|
+
Axlsx::Package.new do |p|
|
|
6
|
+
p.workbook do |wb|
|
|
7
|
+
styles = wb.styles
|
|
8
|
+
header = styles.add_style :bg_color => "DD", :sz => 16, :b => true, :alignment => {:horizontal => :center}
|
|
9
|
+
tbl_header = styles.add_style :b => true, :alignment => { :horizontal => :center }
|
|
10
|
+
ind_header = styles.add_style :bg_color => "FFDFDEDF", :b => true, :alignment => {:indent => 1}
|
|
11
|
+
col_header = styles.add_style :bg_color => "FFDFDEDF", :b => true, :alignment => { :horizontal => :center }
|
|
12
|
+
label = styles.add_style :alignment => { :indent => 1 }
|
|
13
|
+
money = styles.add_style :num_fmt => 5
|
|
14
|
+
t_label = styles.add_style :b => true, :bg_color => "FFDFDEDF"
|
|
15
|
+
t_money = styles.add_style :b => true, :num_fmt => 5, :bg_color => "FFDFDEDF"
|
|
16
|
+
|
|
17
|
+
wb.add_worksheet do |sheet|
|
|
18
|
+
sheet.add_row
|
|
19
|
+
sheet.add_row [nil, "College Budget"], :style => [nil, header]
|
|
20
|
+
sheet.add_row
|
|
21
|
+
sheet.add_row [nil, "What's coming in this month.", nil, nil, "How am I doing"], :style => tbl_header
|
|
22
|
+
sheet.add_row [nil, "Item", "Amount", nil, "Item", "Amount"], :style => [nil, ind_header, col_header, nil, ind_header, col_header]
|
|
23
|
+
sheet.add_row [nil, "Estimated monthly net income", 500, nil, "Monthly income", "=C9"], :style => [nil, label, money, nil, label, money]
|
|
24
|
+
sheet.add_row [nil, "Financial aid", 100, nil, "Monthly expenses", "=C27"], :style => [nil, label, money, nil, label, money]
|
|
25
|
+
sheet.add_row [nil, "Allowance from mom & dad", 20000, nil, "Semester expenses", "=F19"], :style => [nil, label, money, nil, label, money]
|
|
26
|
+
sheet.add_row [nil, "Total", "=SUM(C6:C8)", nil, "Difference", "=F6 - SUM(F7:F8)"], :style => [nil, t_label, t_money, nil, t_label, t_money]
|
|
27
|
+
sheet.add_row
|
|
28
|
+
sheet.add_row [nil, "What's going out this month.", nil, nil, "Semester Costs"], :style => tbl_header
|
|
29
|
+
sheet.add_row [nil, "Item", "Amount", nil, "Item", "Amount"], :style => [nil, ind_header, col_header, nil, ind_header, col_header]
|
|
30
|
+
sheet.add_row [nil, "Rent", 650, nil, "Tuition", 200], :style => [nil, label, money, nil, label, money]
|
|
31
|
+
sheet.add_row [nil, "Utilities", 120, nil, "Lab fees", 50], :style => [nil, label, money, nil, label, money]
|
|
32
|
+
sheet.add_row [nil, "Cell phone", 100, nil, "Other fees", 10], :style => [nil, label, money, nil, label, money]
|
|
33
|
+
sheet.add_row [nil, "Groceries", 75, nil, "Books", 150], :style => [nil, label, money, nil, label, money]
|
|
34
|
+
sheet.add_row [nil, "Auto expenses", 0, nil, "Deposits", 0], :style => [nil, label, money, nil, label, money]
|
|
35
|
+
sheet.add_row [nil, "Student loans", 0, nil, "Transportation", 30], :style => [nil, label, money, nil, label, money]
|
|
36
|
+
sheet.add_row [nil, "Other loans", 350, nil, "Total", "=SUM(F13:F18)"], :style => [nil, label, money, nil, t_label, t_money]
|
|
37
|
+
sheet.add_row [nil, "Credit cards", 450], :style => [nil, label, money]
|
|
38
|
+
sheet.add_row [nil, "Insurance", 0], :style => [nil, label, money]
|
|
39
|
+
sheet.add_row [nil, "Laundry", 10], :style => [nil, label, money]
|
|
40
|
+
sheet.add_row [nil, "Haircuts", 0], :style => [nil, label, money]
|
|
41
|
+
sheet.add_row [nil, "Medical expenses", 0], :style => [nil, label, money]
|
|
42
|
+
sheet.add_row [nil, "Entertainment", 500], :style => [nil, label, money]
|
|
43
|
+
sheet.add_row [nil, "Miscellaneous", 0], :style => [nil, label, money]
|
|
44
|
+
sheet.add_row [nil, "Total", "=SUM(C13:C26)"], :style => [nil, t_label, t_money]
|
|
45
|
+
sheet.add_chart(Axlsx::Pie3DChart) do |chart|
|
|
46
|
+
chart.title = sheet["B11"]
|
|
47
|
+
chart.add_series :data => sheet["C13:C26"], :labels => sheet["B13:B26"]
|
|
48
|
+
chart.start_at 7, 2
|
|
49
|
+
chart.end_at 12, 15
|
|
50
|
+
end
|
|
51
|
+
sheet.add_chart(Axlsx::Bar3DChart, :barDir => :col) do |chart|
|
|
52
|
+
chart.title = sheet["E11"]
|
|
53
|
+
chart.add_series :labels => sheet["E13:E18"], :data => sheet["F13:F18"]
|
|
54
|
+
chart.start_at 7, 16
|
|
55
|
+
chart.end_at 12, 31
|
|
56
|
+
end
|
|
57
|
+
sheet.merged_cells.concat ["B4:C4","E4:F4","B11:C11","E11:F11","B2:F2"]
|
|
58
|
+
sheet.column_widths 2, nil, nil, 2, nil, nil, 2
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
p.use_shared_strings = true
|
|
62
|
+
p.serialize 'axlsx.xlsx'
|
|
63
|
+
end
|
data/examples/sample.png
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
1
2
|
module Axlsx
|
|
2
3
|
require 'axlsx/content_type/default.rb'
|
|
3
4
|
require 'axlsx/content_type/override.rb'
|
|
4
5
|
|
|
5
|
-
# ContentTypes used in the package. This is
|
|
6
|
+
# ContentTypes used in the package. This is automatically managed by the package package.
|
|
6
7
|
class ContentType < SimpleTypedList
|
|
7
|
-
|
|
8
|
+
|
|
8
9
|
def initialize
|
|
9
10
|
super [Override, Default]
|
|
10
11
|
end
|
|
11
|
-
|
|
12
|
-
#
|
|
13
|
-
# @
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
builder.to_xml
|
|
12
|
+
|
|
13
|
+
# Serializes the object
|
|
14
|
+
# @param [String] str
|
|
15
|
+
# @return [String]
|
|
16
|
+
def to_xml_string(str = '')
|
|
17
|
+
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
18
|
+
str << '<Types xmlns="' << XML_NS_T << '">'
|
|
19
|
+
each { |type| type.to_xml_string(str) }
|
|
20
|
+
str << '</Types>'
|
|
21
21
|
end
|
|
22
|
+
|
|
22
23
|
end
|
|
23
24
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
1
2
|
module Axlsx
|
|
2
3
|
# An default content part. These parts are automatically created by for you based on the content of your package.
|
|
3
4
|
class Default
|
|
@@ -7,7 +8,7 @@ module Axlsx
|
|
|
7
8
|
attr_reader :Extension
|
|
8
9
|
|
|
9
10
|
# The type of content.
|
|
10
|
-
# @return [String]
|
|
11
|
+
# @return [String]
|
|
11
12
|
attr_reader :ContentType
|
|
12
13
|
|
|
13
14
|
#Creates a new Default object
|
|
@@ -18,7 +19,7 @@ module Axlsx
|
|
|
18
19
|
raise ArgumentError, "Extension and ContentType are required" unless options[:Extension] && options[:ContentType]
|
|
19
20
|
options.each do |o|
|
|
20
21
|
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
21
|
-
end
|
|
22
|
+
end
|
|
22
23
|
end
|
|
23
24
|
# Sets the file extension for this content type.
|
|
24
25
|
def Extension=(v) Axlsx::validate_string v; @Extension = v end
|
|
@@ -27,11 +28,14 @@ module Axlsx
|
|
|
27
28
|
# @see Axlsx#validate_content_type
|
|
28
29
|
def ContentType=(v) Axlsx::validate_content_type v; @ContentType = v end
|
|
29
30
|
|
|
30
|
-
# Serializes the object
|
|
31
|
-
# @param [
|
|
31
|
+
# Serializes the object
|
|
32
|
+
# @param [String] str
|
|
32
33
|
# @return [String]
|
|
33
|
-
def
|
|
34
|
-
|
|
34
|
+
def to_xml_string(str = '')
|
|
35
|
+
str << '<Default '
|
|
36
|
+
str << instance_values.map { |key, value| '' << key.to_s << '="' << value.to_s << '"' }.join(' ')
|
|
37
|
+
str << '/>'
|
|
35
38
|
end
|
|
39
|
+
|
|
36
40
|
end
|
|
37
41
|
end
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
1
2
|
module Axlsx
|
|
2
3
|
# An override content part. These parts are automatically created by for you based on the content of your package.
|
|
3
4
|
class Override
|
|
4
5
|
|
|
5
6
|
# The type of content.
|
|
6
|
-
# @return [String]
|
|
7
|
+
# @return [String]
|
|
7
8
|
attr_reader :ContentType
|
|
8
9
|
|
|
9
10
|
# The name and location of the part.
|
|
10
|
-
# @return [String]
|
|
11
|
+
# @return [String]
|
|
11
12
|
attr_reader :PartName
|
|
12
13
|
|
|
13
14
|
#Creates a new Override object
|
|
@@ -18,20 +19,24 @@ module Axlsx
|
|
|
18
19
|
raise ArgumentError, "PartName and ContentType are required" unless options[:PartName] && options[:ContentType]
|
|
19
20
|
options.each do |o|
|
|
20
21
|
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
21
|
-
end
|
|
22
|
+
end
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
# The name and location of the part.
|
|
25
26
|
def PartName=(v) Axlsx::validate_string v; @PartName = v end
|
|
26
27
|
|
|
27
|
-
# The content type.
|
|
28
|
+
# The content type.
|
|
28
29
|
# @see Axlsx#validate_content_type
|
|
29
30
|
def ContentType=(v) Axlsx::validate_content_type v; @ContentType = v end
|
|
30
31
|
|
|
31
|
-
# Serializes the
|
|
32
|
-
# @param [
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
# Serializes the object
|
|
33
|
+
# @param [String] str
|
|
34
|
+
# @return [String]
|
|
35
|
+
def to_xml_string(str = '')
|
|
36
|
+
str << '<Override '
|
|
37
|
+
str << instance_values.map { |key, value| '' << key.to_s << '="' << value.to_s << '"' }.join(' ')
|
|
38
|
+
str << '/>'
|
|
35
39
|
end
|
|
40
|
+
|
|
36
41
|
end
|
|
37
42
|
end
|