axlsx 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.yardopts +5 -2
- data/CHANGELOG.md +78 -0
- data/LICENSE +1 -1
- data/README.md +132 -331
- data/Rakefile +17 -5
- data/examples/basic_charts.rb +54 -0
- data/examples/chart_colors.rb +88 -0
- data/examples/conditional_formatting/example_conditional_formatting.rb +72 -0
- data/examples/conditional_formatting/getting_barred.rb +37 -0
- data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
- data/examples/conditional_formatting/scaled_colors.rb +39 -0
- data/examples/conditional_formatting/stop_and_go.rb +37 -0
- data/examples/data_validation.rb +50 -0
- data/examples/example.rb +300 -152
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/extractive.pdf +0 -0
- data/examples/extractive.rb +45 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/sample.png +0 -0
- data/examples/scraping_html.rb +91 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/examples/sheet_protection.rb +10 -0
- data/examples/sheet_view.rb +34 -0
- data/examples/skydrive/real_example.rb +63 -0
- data/examples/two_cell_anchor_image.rb +11 -0
- data/lib/axlsx/content_type/content_type.rb +2 -0
- data/lib/axlsx/content_type/default.rb +30 -15
- data/lib/axlsx/content_type/override.rb +29 -14
- data/lib/axlsx/doc_props/app.rb +161 -104
- data/lib/axlsx/doc_props/core.rb +9 -5
- data/lib/axlsx/drawing/ax_data_source.rb +26 -0
- data/lib/axlsx/drawing/axis.rb +106 -35
- data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
- data/lib/axlsx/drawing/bar_series.rb +25 -7
- data/lib/axlsx/drawing/cat_axis.rb +50 -22
- data/lib/axlsx/drawing/chart.rb +69 -56
- data/lib/axlsx/drawing/d_lbls.rb +100 -0
- data/lib/axlsx/drawing/drawing.rb +28 -12
- data/lib/axlsx/drawing/graphic_frame.rb +2 -1
- data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
- data/lib/axlsx/drawing/line_series.rb +20 -4
- data/lib/axlsx/drawing/num_data.rb +52 -0
- data/lib/axlsx/drawing/num_data_source.rb +61 -0
- data/lib/axlsx/drawing/num_val.rb +32 -0
- data/lib/axlsx/drawing/pic.rb +44 -4
- data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
- data/lib/axlsx/drawing/pie_series.rb +18 -4
- data/lib/axlsx/drawing/scatter_chart.rb +12 -18
- data/lib/axlsx/drawing/scatter_series.rb +28 -2
- data/lib/axlsx/drawing/ser_axis.rb +1 -1
- data/lib/axlsx/drawing/series.rb +1 -1
- data/lib/axlsx/drawing/str_data.rb +42 -0
- data/lib/axlsx/drawing/str_val.rb +33 -0
- data/lib/axlsx/drawing/title.rb +21 -9
- data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
- data/lib/axlsx/drawing/view_3D.rb +44 -31
- data/lib/axlsx/drawing/vml_drawing.rb +42 -0
- data/lib/axlsx/drawing/vml_shape.rb +125 -0
- data/lib/axlsx/package.rb +44 -16
- data/lib/axlsx/rels/relationship.rb +3 -3
- data/lib/axlsx/rels/relationships.rb +1 -11
- data/lib/axlsx/stylesheet/color.rb +0 -1
- data/lib/axlsx/stylesheet/dxf.rb +79 -0
- data/lib/axlsx/stylesheet/font.rb +2 -1
- data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
- data/lib/axlsx/stylesheet/styles.rb +143 -50
- data/lib/axlsx/stylesheet/table_style.rb +3 -3
- data/lib/axlsx/stylesheet/xf.rb +2 -0
- data/lib/axlsx/util/constants.rb +36 -0
- data/lib/axlsx/util/simple_typed_list.rb +15 -21
- data/lib/axlsx/util/validators.rb +122 -5
- data/lib/axlsx/version.rb +2 -7
- data/lib/axlsx/workbook/defined_name.rb +174 -0
- data/lib/axlsx/workbook/defined_names.rb +21 -0
- data/lib/axlsx/workbook/shared_strings_table.rb +12 -13
- data/lib/axlsx/workbook/workbook.rb +71 -13
- data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
- data/lib/axlsx/workbook/worksheet/cell.rb +45 -36
- data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
- data/lib/axlsx/workbook/worksheet/col.rb +17 -1
- data/lib/axlsx/workbook/worksheet/color_scale.rb +76 -0
- data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
- data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
- data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -0
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
- data/lib/axlsx/workbook/worksheet/data_bar.rb +97 -0
- data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
- data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
- data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
- data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
- data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
- data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
- data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
- data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
- data/lib/axlsx/workbook/worksheet/row.rb +69 -12
- data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
- data/lib/axlsx/workbook/worksheet/table.rb +3 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +379 -233
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
- data/lib/axlsx.rb +31 -16
- data/test/benchmark.rb +30 -38
- data/test/content_type/tc_content_type.rb +1 -6
- data/test/doc_props/tc_app.rb +31 -1
- data/test/doc_props/tc_core.rb +3 -1
- data/test/drawing/tc_axis.rb +46 -3
- data/test/drawing/tc_bar_3D_chart.rb +12 -12
- data/test/drawing/tc_bar_series.rb +17 -13
- data/test/drawing/tc_cat_axis.rb +3 -3
- data/test/drawing/tc_cat_axis_data.rb +23 -13
- data/test/drawing/tc_chart.rb +29 -11
- data/test/drawing/tc_d_lbls.rb +47 -0
- data/test/drawing/tc_data_source.rb +17 -0
- data/test/drawing/tc_drawing.rb +11 -5
- data/test/drawing/tc_hyperlink.rb +4 -5
- data/test/drawing/tc_line_series.rb +9 -11
- data/test/drawing/tc_named_axis_data.rb +27 -0
- data/test/drawing/tc_num_data.rb +31 -0
- data/test/drawing/tc_num_val.rb +29 -0
- data/test/drawing/tc_pic.rb +22 -2
- data/test/drawing/tc_pie_3D_chart.rb +4 -8
- data/test/drawing/tc_pie_series.rb +11 -13
- data/test/drawing/tc_scatter_chart.rb +6 -1
- data/test/drawing/tc_scatter_series.rb +6 -5
- data/test/drawing/tc_series.rb +1 -1
- data/test/drawing/tc_str_data.rb +18 -0
- data/test/drawing/tc_str_val.rb +21 -0
- data/test/drawing/tc_title.rb +16 -0
- data/test/drawing/tc_two_cell_anchor.rb +2 -3
- data/test/drawing/tc_view_3D.rb +18 -18
- data/test/drawing/tc_vml_drawing.rb +25 -0
- data/test/drawing/tc_vml_shape.rb +100 -0
- data/test/profile.rb +2 -1
- data/test/rels/tc_relationship.rb +1 -0
- data/test/stylesheet/tc_dxf.rb +81 -0
- data/test/stylesheet/tc_gradient_fill.rb +8 -0
- data/test/stylesheet/tc_pattern_fill.rb +7 -1
- data/test/stylesheet/tc_styles.rb +163 -3
- data/test/stylesheet/tc_table_style.rb +8 -0
- data/test/stylesheet/tc_table_style_element.rb +10 -1
- data/test/tc_helper.rb +1 -0
- data/test/tc_package.rb +93 -17
- data/test/util/tc_simple_typed_list.rb +13 -0
- data/test/util/tc_validators.rb +95 -9
- data/test/workbook/tc_defined_name.rb +41 -0
- data/test/workbook/tc_workbook.rb +5 -3
- data/test/workbook/worksheet/table/tc_table.rb +3 -11
- data/test/workbook/worksheet/tc_cell.rb +52 -18
- data/test/workbook/worksheet/tc_cfvo.rb +31 -0
- data/test/workbook/worksheet/tc_col.rb +9 -0
- data/test/workbook/worksheet/tc_color_scale.rb +29 -0
- data/test/workbook/worksheet/tc_comment.rb +57 -0
- data/test/workbook/worksheet/tc_comments.rb +57 -0
- data/test/workbook/worksheet/tc_conditional_formatting.rb +217 -0
- data/test/workbook/worksheet/tc_data_bar.rb +39 -0
- data/test/workbook/worksheet/tc_data_validation.rb +265 -0
- data/test/workbook/worksheet/tc_date_time_converter.rb +11 -5
- data/test/workbook/worksheet/tc_icon_set.rb +45 -0
- data/test/workbook/worksheet/tc_page_setup.rb +138 -0
- data/test/workbook/worksheet/tc_pane.rb +94 -0
- data/test/workbook/worksheet/tc_print_options.rb +72 -0
- data/test/workbook/worksheet/tc_protected_range.rb +17 -0
- data/test/workbook/worksheet/tc_row.rb +44 -13
- data/test/workbook/worksheet/tc_selection.rb +94 -0
- data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
- data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
- data/test/workbook/worksheet/tc_worksheet.rb +147 -50
- metadata +216 -148
- data/examples/example.csv +0 -1000
- data/examples/example.rb~ +0 -112
- data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
- data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
- data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
- data/lib/axlsx/drawing/named_axis_data.rb +0 -36
- data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
- data/lib/axlsx/drawing/val_axis_data.rb +0 -27
- data/lib/axlsx/stylesheet/#num_fmt.rb# +0 -69
- data/lib/axlsx/util/cbf.rb +0 -333
- data/lib/axlsx/util/cfb.rb~ +0 -201
- data/lib/axlsx/util/ms_off_crypto.rb +0 -189
- data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
- data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
- data/lib/axlsx/util/parser.rb~ +0 -6
- data/lib/axlsx/util/storage.rb~ +0 -0
- data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
- data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
- data/lib/schema/dc.xsd~ +0 -118
- data/lib/schema/dcterms.xsd~ +0 -331
- data/lib/schema/opc-coreProperties.xsd~ +0 -50
- data/test/#benchmark.txt# +0 -7
- data/test/#tc_helper.rb# +0 -3
- data/test/benchmark.rb~ +0 -0
- data/test/benchmark.txt +0 -6
- data/test/benchmark.txt~ +0 -6
- data/test/drawing/tc_val_axis_data.rb +0 -17
- data/test/example.csv +0 -1000
- data/test/example.xlsx +0 -0
- data/test/example_streamed.xlsx +0 -0
- data/test/tc_axlsx.rb~ +0 -0
- data/test/tc_helper.rb~ +0 -3
- data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
- data/test/workbook/worksheet/tc_col.rb~ +0 -10
|
Binary file
|
data/examples/sample.png
ADDED
|
Binary file
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'nokogiri'
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
require 'axlsx'
|
|
5
|
+
|
|
6
|
+
class Scraper
|
|
7
|
+
|
|
8
|
+
def initialize(url, selector)
|
|
9
|
+
@url = url
|
|
10
|
+
@selector = selector
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def hooks
|
|
14
|
+
@hooks ||= {}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_hook(clue, p_roc)
|
|
18
|
+
hooks[clue] = p_roc
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def export(file_name)
|
|
22
|
+
Scraper.clues.each do |clue|
|
|
23
|
+
if detail = parse_clue(clue)
|
|
24
|
+
output << [clue, detail.pop]
|
|
25
|
+
detail.each { |datum| output << ['', datum] }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
serialize(file_name)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def self.clues
|
|
34
|
+
@clues ||= ['Operating system', 'Processors', 'Chipset', 'Memory type', 'Hard drive', 'Graphics',
|
|
35
|
+
'Ports', 'Webcam', 'Pointing device', 'Keyboard', 'Network interface', 'Chipset', 'Wireless',
|
|
36
|
+
'Power supply type', 'Energy efficiency', 'Weight', 'Minimum dimensions (W x D x H)',
|
|
37
|
+
'Warranty', 'Software included', 'Product color']
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def doc
|
|
41
|
+
@doc ||= begin
|
|
42
|
+
Nokogiri::HTML(open(@url))
|
|
43
|
+
rescue
|
|
44
|
+
raise ArgumentError, 'Invalid URL - Nothing to parse'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def output
|
|
49
|
+
@output ||= []
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def selector_for_clue(clue)
|
|
53
|
+
@selector % clue
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def parse_clue(clue)
|
|
57
|
+
if element = doc.at(selector_for_clue(clue))
|
|
58
|
+
call_hook(clue, element) || element.inner_html.split('<br>').each(&:strip)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def call_hook(clue, element)
|
|
63
|
+
if hooks[clue].is_a? Proc
|
|
64
|
+
value = hooks[clue].call(element)
|
|
65
|
+
value.is_a?(Array) ? value : [value]
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def package
|
|
70
|
+
@package ||= Axlsx::Package.new
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def serialize(file_name)
|
|
74
|
+
package.workbook.add_worksheet do |sheet|
|
|
75
|
+
output.each { |datum| sheet.add_row datum }
|
|
76
|
+
end
|
|
77
|
+
package.serialize(file_name)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
scraper = Scraper.new("http://h10010.www1.hp.com/wwpc/ie/en/ho/WF06b/321957-321957-3329742-89318-89318-5186820-5231694.html?dnr=1", "//td[text()='%s']/following-sibling::td")
|
|
82
|
+
|
|
83
|
+
# define a custom action to take against any elements found.
|
|
84
|
+
os_parse = Proc.new do |element|
|
|
85
|
+
element.inner_html.split('<br>').each(&:strip!).each(&:upcase!)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
scraper.add_hook('Operating system', os_parse)
|
|
89
|
+
|
|
90
|
+
scraper.export('foo.xlsx')
|
|
91
|
+
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
|
4
|
+
require 'axlsx'
|
|
5
|
+
|
|
6
|
+
p = Axlsx::Package.new
|
|
7
|
+
p.workbook.add_worksheet(:name => 'Open Office') { |ws| ws.sheet_protection.password = 'fish' }
|
|
8
|
+
p.serialize 'sheet_protection.xlsx'
|
|
9
|
+
|
|
10
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
|
4
|
+
require 'axlsx'
|
|
5
|
+
|
|
6
|
+
p = Axlsx::Package.new
|
|
7
|
+
ws = p.workbook.add_worksheet :name => "Sheetview - Split"
|
|
8
|
+
ws.sheet_view do |vs|
|
|
9
|
+
vs.pane do |p|
|
|
10
|
+
p.active_pane = :top_right
|
|
11
|
+
p.state = :split
|
|
12
|
+
p.x_split = 11080
|
|
13
|
+
p.y_split = 5000
|
|
14
|
+
p.top_left_cell = 'C44'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
vs.add_selection(:top_left, { :active_cell => 'A2', :sqref => 'A2' })
|
|
18
|
+
vs.add_selection(:top_right, { :active_cell => 'I10', :sqref => 'I10' })
|
|
19
|
+
vs.add_selection(:bottom_left, { :active_cell => 'E55', :sqref => 'E55' })
|
|
20
|
+
vs.add_selection(:bottom_right, { :active_cell => 'I57', :sqref => 'I57' })
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
ws = p.workbook.add_worksheet :name => "Sheetview - Frozen"
|
|
25
|
+
ws.sheet_view do |vs|
|
|
26
|
+
vs.pane do |p|
|
|
27
|
+
p.state = :frozen
|
|
28
|
+
p.x_split = 3
|
|
29
|
+
p.y_split = 4
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
p.serialize 'sheet_view.xlsx'
|
|
@@ -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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env ruby -w -s
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
|
4
|
+
require 'axlsx'
|
|
5
|
+
|
|
6
|
+
p = Axlsx::Package.new
|
|
7
|
+
src = "#{File.dirname(__FILE__)}/image1.png"
|
|
8
|
+
p.workbook.add_worksheet(:name => 'double_anchor') do |ws|
|
|
9
|
+
ws.add_image(:image_src => src, :start_at => [0,0], :end_at => [2,4])
|
|
10
|
+
end
|
|
11
|
+
p.serialize('two_cell_anchor_image.xlsx')
|
|
@@ -1,41 +1,56 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
module Axlsx
|
|
3
|
+
|
|
3
4
|
# An default content part. These parts are automatically created by for you based on the content of your package.
|
|
4
5
|
class Default
|
|
5
6
|
|
|
7
|
+
#Creates a new Default object
|
|
8
|
+
# @option options [String] extension
|
|
9
|
+
# @option options [String] content_type
|
|
10
|
+
# @raise [ArgumentError] An argument error is raised if both extension and content_type are not specified.
|
|
11
|
+
def initialize(options={})
|
|
12
|
+
raise ArgumentError, INVALID_ARGUMENTS unless validate_options(options)
|
|
13
|
+
options.each do |name, value|
|
|
14
|
+
self.send("#{name}=", value) if self.respond_to? "#{name}="
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Error string for option validation
|
|
19
|
+
INVALID_ARGUMENTS = "extension and content_type are required"
|
|
20
|
+
|
|
6
21
|
# The extension of the content type.
|
|
7
22
|
# @return [String]
|
|
8
|
-
attr_reader :
|
|
23
|
+
attr_reader :extension
|
|
24
|
+
alias :Extension :extension
|
|
9
25
|
|
|
10
26
|
# The type of content.
|
|
11
27
|
# @return [String]
|
|
12
|
-
attr_reader :
|
|
28
|
+
attr_reader :content_type
|
|
29
|
+
alias :ContentType :content_type
|
|
13
30
|
|
|
14
|
-
#Creates a new Default object
|
|
15
|
-
# @option options [String] Extension
|
|
16
|
-
# @option options [String] ContentType
|
|
17
|
-
# @raise [ArgumentError] An argument error is raised if both Extension and ContentType are not specified.
|
|
18
|
-
def initialize(options={})
|
|
19
|
-
raise ArgumentError, "Extension and ContentType are required" unless options[:Extension] && options[:ContentType]
|
|
20
|
-
options.each do |o|
|
|
21
|
-
self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
31
|
# Sets the file extension for this content type.
|
|
25
|
-
def
|
|
32
|
+
def extension=(v) Axlsx::validate_string v; @extension = v end
|
|
33
|
+
alias :Extension= :extension=
|
|
26
34
|
|
|
27
35
|
# Sets the content type
|
|
28
36
|
# @see Axlsx#validate_content_type
|
|
29
|
-
def
|
|
37
|
+
def content_type=(v) Axlsx::validate_content_type v; @content_type = v end
|
|
38
|
+
alias :ContentType= :content_type=
|
|
30
39
|
|
|
31
40
|
# Serializes the object
|
|
32
41
|
# @param [String] str
|
|
33
42
|
# @return [String]
|
|
34
43
|
def to_xml_string(str = '')
|
|
35
44
|
str << '<Default '
|
|
36
|
-
str << instance_values.map { |key, value| '' << key
|
|
45
|
+
str << instance_values.map { |key, value| '' << Axlsx::camel(key) << '="' << value.to_s << '"' }.join(' ')
|
|
37
46
|
str << '/>'
|
|
38
47
|
end
|
|
39
48
|
|
|
49
|
+
private
|
|
50
|
+
def validate_options(options)
|
|
51
|
+
(options[:Extension] || options[:extension]) && (options[:content_type] || options[:ContentType])
|
|
52
|
+
end
|
|
53
|
+
|
|
40
54
|
end
|
|
55
|
+
|
|
41
56
|
end
|
|
@@ -1,42 +1,57 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
module Axlsx
|
|
3
|
+
|
|
3
4
|
# An override content part. These parts are automatically created by for you based on the content of your package.
|
|
4
5
|
class Override
|
|
5
6
|
|
|
6
|
-
# The type of content.
|
|
7
|
-
# @return [String]
|
|
8
|
-
attr_reader :ContentType
|
|
9
|
-
|
|
10
|
-
# The name and location of the part.
|
|
11
|
-
# @return [String]
|
|
12
|
-
attr_reader :PartName
|
|
13
|
-
|
|
14
7
|
#Creates a new Override object
|
|
15
8
|
# @option options [String] PartName
|
|
16
9
|
# @option options [String] ContentType
|
|
17
10
|
# @raise [ArgumentError] An argument error is raised if both PartName and ContentType are not specified.
|
|
18
11
|
def initialize(options={})
|
|
19
|
-
raise ArgumentError,
|
|
20
|
-
options.each do |
|
|
21
|
-
self.send("#{
|
|
12
|
+
raise ArgumentError, INVALID_ARGUMENTS unless validate_options(options)
|
|
13
|
+
options.each do |name, value|
|
|
14
|
+
self.send("#{name}=", value) if self.respond_to? "#{name}="
|
|
22
15
|
end
|
|
23
16
|
end
|
|
24
17
|
|
|
18
|
+
# Error message for invalid options
|
|
19
|
+
INVALID_ARGUMENTS = 'part_name and content_type are required'
|
|
20
|
+
|
|
21
|
+
# The type of content.
|
|
22
|
+
# @return [String]
|
|
23
|
+
attr_reader :content_type
|
|
24
|
+
alias :ContentType :content_type
|
|
25
|
+
|
|
26
|
+
# The name and location of the part.
|
|
27
|
+
# @return [String]
|
|
28
|
+
attr_reader :part_name
|
|
29
|
+
alias :PartName :part_name
|
|
30
|
+
|
|
25
31
|
# The name and location of the part.
|
|
26
|
-
def
|
|
32
|
+
def part_name=(v) Axlsx::validate_string v; @part_name = v end
|
|
33
|
+
alias :PartName= :part_name=
|
|
27
34
|
|
|
28
35
|
# The content type.
|
|
29
36
|
# @see Axlsx#validate_content_type
|
|
30
|
-
def
|
|
37
|
+
def content_type=(v) Axlsx::validate_content_type v; @content_type = v end
|
|
38
|
+
alias :ContentType= :content_type=
|
|
31
39
|
|
|
32
40
|
# Serializes the object
|
|
33
41
|
# @param [String] str
|
|
34
42
|
# @return [String]
|
|
35
43
|
def to_xml_string(str = '')
|
|
36
44
|
str << '<Override '
|
|
37
|
-
str << instance_values.map { |key, value| '' << key
|
|
45
|
+
str << instance_values.map { |key, value| '' << Axlsx::camel(key) << '="' << value.to_s << '"' }.join(' ')
|
|
38
46
|
str << '/>'
|
|
39
47
|
end
|
|
40
48
|
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
def validate_options(options)
|
|
52
|
+
(options[:PartName] || options[:part_name]) && (options[:ContentType] || options[:content_type])
|
|
53
|
+
end
|
|
54
|
+
|
|
41
55
|
end
|
|
56
|
+
|
|
42
57
|
end
|