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.
Files changed (214) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +78 -0
  3. data/LICENSE +1 -1
  4. data/README.md +132 -331
  5. data/Rakefile +17 -5
  6. data/examples/basic_charts.rb +54 -0
  7. data/examples/chart_colors.rb +88 -0
  8. data/examples/conditional_formatting/example_conditional_formatting.rb +72 -0
  9. data/examples/conditional_formatting/getting_barred.rb +37 -0
  10. data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
  11. data/examples/conditional_formatting/scaled_colors.rb +39 -0
  12. data/examples/conditional_formatting/stop_and_go.rb +37 -0
  13. data/examples/data_validation.rb +50 -0
  14. data/examples/example.rb +300 -152
  15. data/examples/example.xlsx +0 -0
  16. data/examples/example_streamed.xlsx +0 -0
  17. data/examples/extractive.pdf +0 -0
  18. data/examples/extractive.rb +45 -0
  19. data/examples/no-use_autowidth.xlsx +0 -0
  20. data/examples/sample.png +0 -0
  21. data/examples/scraping_html.rb +91 -0
  22. data/examples/shared_strings_example.xlsx +0 -0
  23. data/examples/sheet_protection.rb +10 -0
  24. data/examples/sheet_view.rb +34 -0
  25. data/examples/skydrive/real_example.rb +63 -0
  26. data/examples/two_cell_anchor_image.rb +11 -0
  27. data/lib/axlsx/content_type/content_type.rb +2 -0
  28. data/lib/axlsx/content_type/default.rb +30 -15
  29. data/lib/axlsx/content_type/override.rb +29 -14
  30. data/lib/axlsx/doc_props/app.rb +161 -104
  31. data/lib/axlsx/doc_props/core.rb +9 -5
  32. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  33. data/lib/axlsx/drawing/axis.rb +106 -35
  34. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  35. data/lib/axlsx/drawing/bar_series.rb +25 -7
  36. data/lib/axlsx/drawing/cat_axis.rb +50 -22
  37. data/lib/axlsx/drawing/chart.rb +69 -56
  38. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  39. data/lib/axlsx/drawing/drawing.rb +28 -12
  40. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  41. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  42. data/lib/axlsx/drawing/line_series.rb +20 -4
  43. data/lib/axlsx/drawing/num_data.rb +52 -0
  44. data/lib/axlsx/drawing/num_data_source.rb +61 -0
  45. data/lib/axlsx/drawing/num_val.rb +32 -0
  46. data/lib/axlsx/drawing/pic.rb +44 -4
  47. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  48. data/lib/axlsx/drawing/pie_series.rb +18 -4
  49. data/lib/axlsx/drawing/scatter_chart.rb +12 -18
  50. data/lib/axlsx/drawing/scatter_series.rb +28 -2
  51. data/lib/axlsx/drawing/ser_axis.rb +1 -1
  52. data/lib/axlsx/drawing/series.rb +1 -1
  53. data/lib/axlsx/drawing/str_data.rb +42 -0
  54. data/lib/axlsx/drawing/str_val.rb +33 -0
  55. data/lib/axlsx/drawing/title.rb +21 -9
  56. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  57. data/lib/axlsx/drawing/view_3D.rb +44 -31
  58. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  59. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  60. data/lib/axlsx/package.rb +44 -16
  61. data/lib/axlsx/rels/relationship.rb +3 -3
  62. data/lib/axlsx/rels/relationships.rb +1 -11
  63. data/lib/axlsx/stylesheet/color.rb +0 -1
  64. data/lib/axlsx/stylesheet/dxf.rb +79 -0
  65. data/lib/axlsx/stylesheet/font.rb +2 -1
  66. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  67. data/lib/axlsx/stylesheet/styles.rb +143 -50
  68. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  69. data/lib/axlsx/stylesheet/xf.rb +2 -0
  70. data/lib/axlsx/util/constants.rb +36 -0
  71. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  72. data/lib/axlsx/util/validators.rb +122 -5
  73. data/lib/axlsx/version.rb +2 -7
  74. data/lib/axlsx/workbook/defined_name.rb +174 -0
  75. data/lib/axlsx/workbook/defined_names.rb +21 -0
  76. data/lib/axlsx/workbook/shared_strings_table.rb +12 -13
  77. data/lib/axlsx/workbook/workbook.rb +71 -13
  78. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  79. data/lib/axlsx/workbook/worksheet/cell.rb +45 -36
  80. data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
  81. data/lib/axlsx/workbook/worksheet/col.rb +17 -1
  82. data/lib/axlsx/workbook/worksheet/color_scale.rb +76 -0
  83. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  84. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  85. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  86. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
  87. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -0
  88. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  89. data/lib/axlsx/workbook/worksheet/data_bar.rb +97 -0
  90. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  91. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  92. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  93. data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
  94. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  95. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  96. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  97. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  98. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  99. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  100. data/lib/axlsx/workbook/worksheet/row.rb +69 -12
  101. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  102. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  103. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  104. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  105. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  106. data/lib/axlsx/workbook/worksheet/table.rb +3 -3
  107. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  108. data/lib/axlsx/workbook/worksheet/worksheet.rb +379 -233
  109. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  110. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  111. data/lib/axlsx.rb +31 -16
  112. data/test/benchmark.rb +30 -38
  113. data/test/content_type/tc_content_type.rb +1 -6
  114. data/test/doc_props/tc_app.rb +31 -1
  115. data/test/doc_props/tc_core.rb +3 -1
  116. data/test/drawing/tc_axis.rb +46 -3
  117. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  118. data/test/drawing/tc_bar_series.rb +17 -13
  119. data/test/drawing/tc_cat_axis.rb +3 -3
  120. data/test/drawing/tc_cat_axis_data.rb +23 -13
  121. data/test/drawing/tc_chart.rb +29 -11
  122. data/test/drawing/tc_d_lbls.rb +47 -0
  123. data/test/drawing/tc_data_source.rb +17 -0
  124. data/test/drawing/tc_drawing.rb +11 -5
  125. data/test/drawing/tc_hyperlink.rb +4 -5
  126. data/test/drawing/tc_line_series.rb +9 -11
  127. data/test/drawing/tc_named_axis_data.rb +27 -0
  128. data/test/drawing/tc_num_data.rb +31 -0
  129. data/test/drawing/tc_num_val.rb +29 -0
  130. data/test/drawing/tc_pic.rb +22 -2
  131. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  132. data/test/drawing/tc_pie_series.rb +11 -13
  133. data/test/drawing/tc_scatter_chart.rb +6 -1
  134. data/test/drawing/tc_scatter_series.rb +6 -5
  135. data/test/drawing/tc_series.rb +1 -1
  136. data/test/drawing/tc_str_data.rb +18 -0
  137. data/test/drawing/tc_str_val.rb +21 -0
  138. data/test/drawing/tc_title.rb +16 -0
  139. data/test/drawing/tc_two_cell_anchor.rb +2 -3
  140. data/test/drawing/tc_view_3D.rb +18 -18
  141. data/test/drawing/tc_vml_drawing.rb +25 -0
  142. data/test/drawing/tc_vml_shape.rb +100 -0
  143. data/test/profile.rb +2 -1
  144. data/test/rels/tc_relationship.rb +1 -0
  145. data/test/stylesheet/tc_dxf.rb +81 -0
  146. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  147. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  148. data/test/stylesheet/tc_styles.rb +163 -3
  149. data/test/stylesheet/tc_table_style.rb +8 -0
  150. data/test/stylesheet/tc_table_style_element.rb +10 -1
  151. data/test/tc_helper.rb +1 -0
  152. data/test/tc_package.rb +93 -17
  153. data/test/util/tc_simple_typed_list.rb +13 -0
  154. data/test/util/tc_validators.rb +95 -9
  155. data/test/workbook/tc_defined_name.rb +41 -0
  156. data/test/workbook/tc_workbook.rb +5 -3
  157. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  158. data/test/workbook/worksheet/tc_cell.rb +52 -18
  159. data/test/workbook/worksheet/tc_cfvo.rb +31 -0
  160. data/test/workbook/worksheet/tc_col.rb +9 -0
  161. data/test/workbook/worksheet/tc_color_scale.rb +29 -0
  162. data/test/workbook/worksheet/tc_comment.rb +57 -0
  163. data/test/workbook/worksheet/tc_comments.rb +57 -0
  164. data/test/workbook/worksheet/tc_conditional_formatting.rb +217 -0
  165. data/test/workbook/worksheet/tc_data_bar.rb +39 -0
  166. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  167. data/test/workbook/worksheet/tc_date_time_converter.rb +11 -5
  168. data/test/workbook/worksheet/tc_icon_set.rb +45 -0
  169. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  170. data/test/workbook/worksheet/tc_pane.rb +94 -0
  171. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  172. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  173. data/test/workbook/worksheet/tc_row.rb +44 -13
  174. data/test/workbook/worksheet/tc_selection.rb +94 -0
  175. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  176. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  177. data/test/workbook/worksheet/tc_worksheet.rb +147 -50
  178. metadata +216 -148
  179. data/examples/example.csv +0 -1000
  180. data/examples/example.rb~ +0 -112
  181. data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
  182. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  183. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  184. data/lib/axlsx/drawing/named_axis_data.rb +0 -36
  185. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  186. data/lib/axlsx/drawing/val_axis_data.rb +0 -27
  187. data/lib/axlsx/stylesheet/#num_fmt.rb# +0 -69
  188. data/lib/axlsx/util/cbf.rb +0 -333
  189. data/lib/axlsx/util/cfb.rb~ +0 -201
  190. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  191. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  192. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  193. data/lib/axlsx/util/parser.rb~ +0 -6
  194. data/lib/axlsx/util/storage.rb~ +0 -0
  195. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  196. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  197. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  198. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  199. data/lib/schema/dc.xsd~ +0 -118
  200. data/lib/schema/dcterms.xsd~ +0 -331
  201. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  202. data/test/#benchmark.txt# +0 -7
  203. data/test/#tc_helper.rb# +0 -3
  204. data/test/benchmark.rb~ +0 -0
  205. data/test/benchmark.txt +0 -6
  206. data/test/benchmark.txt~ +0 -6
  207. data/test/drawing/tc_val_axis_data.rb +0 -17
  208. data/test/example.csv +0 -1000
  209. data/test/example.xlsx +0 -0
  210. data/test/example_streamed.xlsx +0 -0
  211. data/test/tc_axlsx.rb~ +0 -0
  212. data/test/tc_helper.rb~ +0 -3
  213. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  214. data/test/workbook/worksheet/tc_col.rb~ +0 -10
data/examples/example.rb CHANGED
@@ -1,71 +1,141 @@
1
1
  #!/usr/bin/env ruby -w -s
2
2
  # -*- coding: utf-8 -*-
3
- $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
3
+ # $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
4
+
5
+ #```ruby
4
6
  require 'axlsx'
5
7
 
6
8
  p = Axlsx::Package.new
7
9
  wb = p.workbook
10
+ #```
8
11
 
9
12
  #A Simple Workbook
10
13
 
14
+ #```ruby
11
15
  wb.add_worksheet(:name => "Basic Worksheet") do |sheet|
12
16
  sheet.add_row ["First Column", "Second", "Third"]
13
17
  sheet.add_row [1, 2, 3]
14
18
  end
19
+ #```
15
20
 
16
21
  #Using Custom Styles
17
22
 
23
+ #```ruby
24
+ # Each cell allows a single, predified style.
25
+ # When using add_row, the value in the :style array at the same index as the cell's column will be applied to that cell.
26
+ # Alternatively, you can apply a style to an entire row by using an integer value for :style.
27
+
18
28
  wb.styles do |s|
19
29
  black_cell = s.add_style :bg_color => "00", :fg_color => "FF", :sz => 14, :alignment => { :horizontal=> :center }
20
30
  blue_cell = s.add_style :bg_color => "0000FF", :fg_color => "FF", :sz => 20, :alignment => { :horizontal=> :center }
21
31
  wb.add_worksheet(:name => "Custom Styles") do |sheet|
32
+
33
+ # Applies the black_cell style to the first and third cell, and the blue_cell style to the second.
22
34
  sheet.add_row ["Text Autowidth", "Second", "Third"], :style => [black_cell, blue_cell, black_cell]
35
+
36
+ # Applies the thin border to all three cells
23
37
  sheet.add_row [1, 2, 3], :style => Axlsx::STYLE_THIN_BORDER
24
38
  end
25
39
  end
40
+ #```
41
+
42
+ ##Styling Cell Overrides
43
+
44
+ #```ruby
45
+ #Some of the style attributes can also be set at the cell level. Cell level styles take precedence over Custom Styles shown in the previous example.
46
+
47
+ wb.add_worksheet(:name => "Cell Level Style Overrides") do |sheet|
48
+
49
+ # this will set the font size for each cell.
50
+ sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4'], :sz => 16
51
+
52
+ sheet.add_row [1, 2, 3, "=SUM(A2:C2)"]
53
+
54
+ # You can also apply cell style overrides to a range of cells
55
+ sheet["A1:D1"].each { |c| c.color = "FF0000" }
56
+ sheet['A1:D2'].each { |c| c.style = Axlsx::STYLE_THIN_BORDER }
57
+ end
58
+ #```
26
59
 
27
- #Using Custom Border Styles
60
+ ##Using Custom Border Styles
28
61
 
62
+ #```ruby
63
+ #Axlsx defines a thin border style, but you can easily create and use your own.
29
64
  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"}
65
+ red_border = s.add_style :border => { :style => :thick, :color =>"FFFF0000" }
66
+ blue_border = s.add_style :border => { :style => :thick, :color =>"FF0000FF" }
32
67
 
33
68
  wb.add_worksheet(:name => "Custom Borders") do |sheet|
34
69
  sheet.add_row ["wrap", "me", "Up in Red"], :style => red_border
35
70
  sheet.add_row [1, 2, 3], :style => blue_border
36
71
  end
37
72
  end
73
+ #```
38
74
 
39
75
 
40
- ##Using Custom Formatting and date1904
41
- require 'date'
76
+ ##Styling Rows and Columns
77
+
78
+ #```ruby
42
79
  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]
80
+ head = s.add_style :bg_color => "00", :fg_color => "FF"
81
+ percent = s.add_style :num_fmt => 9
82
+ wb.add_worksheet(:name => "Columns and Rows") do |sheet|
83
+ sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4', 'col5']
84
+ sheet.add_row [1, 2, 0.3, 4, 5.0]
85
+ sheet.add_row [1, 2, 0.2, 4, 5.0]
86
+ sheet.add_row [1, 2, 0.1, 4, 5.0]
87
+
88
+ #apply the percent style to the column at index 2 skipping the first row.
89
+ sheet.col_style 2, percent, :row_offset => 1
90
+
91
+ # apply the head style to the first row.
92
+ sheet.row_style 0, head
93
+
94
+ #Hide the 5th column
95
+ sheet.column_info[4].hidden = true
96
+
97
+ #Set the second column outline level
98
+ sheet.column_info[1].outlineLevel = 2
99
+
100
+ sheet.rows[3].hidden = true
101
+ sheet.rows[1].outlineLevel = 2
50
102
  end
51
103
  end
104
+ #```
52
105
 
53
106
 
54
- ##Add an Image
107
+ ##Specifying Column Widths
55
108
 
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
109
+ #```ruby
110
+ wb.add_worksheet(:name => "custom column widths") do |sheet|
111
+ sheet.add_row ["I use autowidth and am very wide", "I use a custom width and am narrow"]
112
+ sheet.add_row ['abcdefg', 'This is a very long text and should flow into the right cell', nil, 'xxx' ]
113
+ sheet.column_widths nil, 3, 5, nil
63
114
  end
115
+ #```
116
+
117
+ ##Merging Cells.
118
+
119
+ #```ruby
120
+ wb.add_worksheet(:name => 'Merging Cells') do |sheet|
121
+ # cell level style overides when adding cells
122
+ sheet.add_row ["col 1", "col 2", "col 3", "col 4"], :sz => 16
123
+ sheet.add_row [1, 2, 3, "=SUM(A2:C2)"]
124
+ sheet.add_row [2, 3, 4, "=SUM(A3:C3)"]
125
+ sheet.add_row ["total", "", "", "=SUM(D2:D3)"]
126
+ sheet.merge_cells("A4:C4")
127
+ sheet["A1:D1"].each { |c| c.color = "FF0000"}
128
+ sheet["A1:D4"].each { |c| c.style = Axlsx::STYLE_THIN_BORDER }
129
+ end
130
+ #```
64
131
 
65
132
  ##Add an Image with a hyperlink
66
133
 
134
+ #```ruby
67
135
  wb.add_worksheet(:name => "Image with Hyperlink") do |sheet|
68
136
  img = File.expand_path('../image1.jpeg', __FILE__)
137
+ # specifying the :hyperlink option will add a hyper link to your image.
138
+ # @note - Numbers does not support this part of the specification.
69
139
  sheet.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
70
140
  image.width=720
71
141
  image.height=666
@@ -73,159 +143,129 @@ wb.add_worksheet(:name => "Image with Hyperlink") do |sheet|
73
143
  image.start_at 2, 2
74
144
  end
75
145
  end
146
+ #```
76
147
 
77
- ##Asian Language Support
78
-
79
- wb.add_worksheet(:name => "日本語でのシート名") do |sheet|
80
- sheet.add_row ["日本語"]
81
- sheet.add_row ["华语/華語"]
82
- sheet.add_row ["한국어/조선말"]
83
- end
84
-
85
- ##Styling Columns
86
-
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
111
-
112
- ##Styling Rows
148
+ ##Using Custom Formatting and date1904
113
149
 
150
+ #```ruby
151
+ require 'date'
114
152
  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
153
+ date = s.add_style(:format_code => "yyyy-mm-dd", :border => Axlsx::STYLE_THIN_BORDER)
154
+ padded = s.add_style(:format_code => "00#", :border => Axlsx::STYLE_THIN_BORDER)
155
+ percent = s.add_style(:format_code => "0000%", :border => Axlsx::STYLE_THIN_BORDER)
156
+ # wb.date1904 = true # Use the 1904 date system (Used by Excel for Mac < 2011)
157
+ wb.add_worksheet(:name => "Formatting Data") do |sheet|
158
+ sheet.add_row ["Custom Formatted Date", "Percent Formatted Float", "Padded Numbers"], :style => Axlsx::STYLE_THIN_BORDER
159
+ sheet.add_row [Date::strptime('2012-01-19','%Y-%m-%d'), 0.2, 32], :style => [date, percent, padded]
124
160
  end
125
161
  end
162
+ #```
126
163
 
127
- ##Styling Cell Overrides
164
+ ##Asian Language Support
128
165
 
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 }
166
+ #```ruby
167
+ wb.add_worksheet(:name => "日本語でのシート名") do |sheet|
168
+ sheet.add_row ["日本語"]
169
+ sheet.add_row ["华语/華語"]
170
+ sheet.add_row ["한국어/조선말"]
136
171
  end
172
+ #```
137
173
 
138
174
  ##Using formula
139
175
 
176
+ #```ruby
140
177
  wb.add_worksheet(:name => "Using Formulas") do |sheet|
141
178
  sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4']
142
179
  sheet.add_row [1, 2, 3, "=SUM(A2:C2)"]
143
180
  end
181
+ #```
182
+
183
+ ##Auto Filter
184
+
185
+ #```ruby
186
+ wb.add_worksheet(:name => "Auto Filter") do |sheet|
187
+ sheet.add_row ["Build Matrix"]
188
+ sheet.add_row ["Build", "Duration", "Finished", "Rvm"]
189
+ sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
190
+ sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
191
+ sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
192
+ sheet.auto_filter = "A2:D5"
193
+ end
194
+ #```
144
195
 
145
196
  ##Automatic cell types
146
197
 
198
+ #```ruby
147
199
  wb.add_worksheet(:name => "Automatic cell types") do |sheet|
200
+ date_format = wb.styles.add_style :format_code => 'YYYY-MM-DD'
201
+ time_format = wb.styles.add_style :format_code => 'hh:mm:ss'
148
202
  sheet.add_row ["Date", "Time", "String", "Boolean", "Float", "Integer"]
149
- sheet.add_row [Date.today, Time.now, "value", true, 0.1, 1]
203
+ sheet.add_row [Date.today, Time.now, "value", true, 0.1, 1], :style => [date_format, time_format]
150
204
  end
205
+ #```
151
206
 
152
- ##Merging Cells.
153
-
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
164
207
 
165
208
  ##Generating A Bar Chart
166
209
 
210
+ #```ruby
167
211
  wb.add_worksheet(:name => "Bar Chart") do |sheet|
168
212
  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"]
213
+ %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
214
+ sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A6", :end_at => "F20") do |chart|
215
+ chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"], :title => sheet["A1"]
173
216
  end
174
217
  end
218
+ #```
175
219
 
176
220
  ##Hide Gridlines in chart
221
+
222
+ #```ruby
177
223
  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"]
224
+ sheet.add_row ["Bar Chart without gridlines"]
225
+ %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
226
+ sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A6", :end_at => "F20") do |chart|
227
+ chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"]
183
228
  chart.valAxis.gridlines = false
184
229
  chart.catAxis.gridlines = false
185
230
  end
186
231
  end
232
+ #```
187
233
 
188
234
  ##Generating A Pie Chart
189
235
 
236
+ #```ruby
190
237
  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
197
-
198
- ##Data over time
199
-
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"])
238
+ sheet.add_row ["Simple Pie Chart"]
239
+ %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
240
+ sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,5], :end_at => [10, 20], :title => "example 3: Pie Chart") do |chart|
241
+ chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"], :colors => ['FF0000', '00FF00', '0000FF']
211
242
  end
212
243
  end
244
+ #```
213
245
 
214
246
  ##Generating A Line Chart
215
247
 
248
+ #```ruby
216
249
  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"]
250
+ sheet.add_row ["Simple Line Chart"]
251
+ sheet.add_row %w(first second)
252
+ 4.times do
253
+ sheet.add_row [ rand(24)+1, rand(24)+1]
254
+ end
255
+ sheet.add_chart(Axlsx::Line3DChart, :title => "Simple Line Chart", :rotX => 30, :rotY => 20) do |chart|
256
+ chart.start_at 0, 5
257
+ chart.end_at 10, 20
258
+ chart.add_series :data => sheet["A3:A6"], :title => sheet["A2"]
259
+ chart.add_series :data => sheet["B3:B6"], :title => sheet["B2"]
260
+ chart.catAxis.title = 'X Axis'
261
+ chart.valAxis.title = 'Y Axis'
224
262
  end
225
263
  end
264
+ #```
226
265
 
227
266
  ##Generating A Scatter Chart
228
267
 
268
+ #```ruby
229
269
  wb.add_worksheet(:name => "Scatter Chart") do |sheet|
230
270
  sheet.add_row ["First", 1, 5, 7, 9]
231
271
  sheet.add_row ["", 1, 25, 49, 81]
@@ -238,81 +278,189 @@ wb.add_worksheet(:name => "Scatter Chart") do |sheet|
238
278
  chart.add_series :xData => sheet["B3:E3"], :yData => sheet["B4:E4"], :title => sheet["A3"]
239
279
  end
240
280
  end
281
+ #```
241
282
 
242
- ##Auto Filter
243
283
 
244
- wb.add_worksheet(:name => "Auto Filter") do |sheet|
284
+ ##Tables
285
+
286
+ #```ruby
287
+ wb.add_worksheet(:name => "Table") do |sheet|
245
288
  sheet.add_row ["Build Matrix"]
246
289
  sheet.add_row ["Build", "Duration", "Finished", "Rvm"]
247
290
  sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
248
291
  sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
249
292
  sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
250
- sheet.auto_filter = "A2:D5"
293
+ sheet.add_table "A2:D5", :name => 'Build Matrix'
251
294
  end
295
+ #```
252
296
 
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
297
 
273
298
  ##Fit to page printing
274
299
 
300
+ #```ruby
275
301
  wb.add_worksheet(:name => "fit to page") do |sheet|
276
302
  sheet.add_row ['this all goes on one page']
277
303
  sheet.fit_to_page = true
278
304
  end
305
+ ##```
279
306
 
280
307
 
281
308
  ##Hide Gridlines in worksheet
309
+
310
+ #```ruby
282
311
  wb.add_worksheet(:name => "No Gridlines") do |sheet|
283
312
  sheet.add_row ["This", "Sheet", "Hides", "Gridlines"]
284
313
  sheet.show_gridlines = false
285
314
  end
315
+ ##```
316
+
317
+ #```ruby
318
+ wb.add_worksheet(:name => "repeated header") do |sheet|
319
+ sheet.add_row %w(These Column Header Will Render On Every Printed Sheet)
320
+ 200.times { sheet.add_row %w(1 2 3 4 5 6 7 8) }
321
+ wb.add_defined_name("'repeated header'!$1:$1", :local_sheet_id => sheet.index, :name => '_xlnm.Print_Titles')
322
+ end
323
+
324
+ # Sheet Protection and excluding cells from locking.
325
+ unlocked = wb.styles.add_style :locked => false
326
+ wb.add_worksheet(:name => 'Sheet Protection') do |sheet|
327
+ sheet.sheet_protection.password = 'fish'
328
+ sheet.add_row [1, 2 ,3] # These cells will be locked
329
+ sheet.add_row [4, 5, 6], :style => unlocked # these cells will not!
330
+ end
331
+
286
332
 
287
- ##Specify Page Margins for printing
333
+ ##Specify page margins and other options for printing
334
+
335
+ #```ruby
288
336
  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"]
337
+ setup = {:fit_to_width => 1, :orientation => :landscape, :paper_width => "297mm", :paper_height => "210mm"}
338
+ options = {:grid_lines => true, :headings => true, :horizontal_centered => true}
339
+ wb.add_worksheet(:name => "print margins", :page_margins => margins, :page_setup => setup, :print_options => options) do |sheet|
340
+ sheet.add_row ["this sheet uses customized print settings"]
341
+ end
342
+ #```
343
+
344
+ ## Add Comments to your spreadsheet
345
+ #``` ruby
346
+ wb.add_worksheet(:name => 'comments') do |sheet|
347
+ sheet.add_row ['Can we build it?']
348
+ sheet.add_comment :ref => 'A1', :author => 'Bob', :text => 'Yes We Can!'
349
+ end
350
+
351
+ ## Frozen/Split panes
352
+ ## ``` ruby
353
+ wb.add_worksheet(:name => 'fixed headers') do |sheet|
354
+ sheet.add_row(['', (0..99).map { |i| "column header #{i}" }].flatten )
355
+ 100.times.with_index { |index| sheet << ["row header", (0..index).to_a].flatten }
356
+ sheet.sheet_view.pane do |pane|
357
+ pane.top_left_cell = "B2"
358
+ pane.state = :frozen_split
359
+ pane.y_split = 1
360
+ pane.x_split = 1
361
+ pane.active_pane = :bottom_right
362
+ end
363
+ end
364
+
365
+ # conditional formatting
366
+ #
367
+ percent = wb.styles.add_style(:format_code => "0.00%", :border => Axlsx::STYLE_THIN_BORDER)
368
+ money = wb.styles.add_style(:format_code => '0,000', :border => Axlsx::STYLE_THIN_BORDER)
369
+
370
+ # define the style for conditional formatting
371
+ profitable = wb.styles.add_style( :fg_color=>"FF428751",
372
+ :type => :dxf)
373
+
374
+ wb.add_worksheet(:name => "Conditional Cell Is") do |ws|
375
+
376
+ # Generate 20 rows of data
377
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
378
+ ws.add_row ["Quarter", "Profit", "% of Total"]
379
+ offset = 3
380
+ rows = 20
381
+ offset.upto(rows + offset) do |i|
382
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
383
+ end
384
+
385
+ # Apply conditional formatting to range B3:B100 in the worksheet
386
+ ws.add_conditional_formatting("B3:B100", { :type => :cellIs, :operator => :greaterThan, :formula => "100000", :dxfId => profitable, :priority => 1 })
387
+ end
388
+
389
+ wb.add_worksheet(:name => "Conditional Color Scale") do |ws|
390
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
391
+ ws.add_row ["Quarter", "Profit", "% of Total"]
392
+ offset = 3
393
+ rows = 20
394
+ offset.upto(rows + offset) do |i|
395
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
396
+ end
397
+ # Apply conditional formatting to range B3:B100 in the worksheet
398
+ color_scale = Axlsx::ColorScale.new
399
+ ws.add_conditional_formatting("B3:B100", { :type => :colorScale, :operator => :greaterThan, :formula => "100000", :dxfId => profitable, :priority => 1, :color_scale => color_scale })
400
+ end
401
+
402
+
403
+ wb.add_worksheet(:name => "Conditional Data Bar") do |ws|
404
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
405
+ ws.add_row ["Quarter", "Profit", "% of Total"]
406
+ offset = 3
407
+ rows = 20
408
+ offset.upto(rows + offset) do |i|
409
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
410
+ end
411
+ # Apply conditional formatting to range B3:B100 in the worksheet
412
+ data_bar = Axlsx::DataBar.new
413
+ ws.add_conditional_formatting("B3:B100", { :type => :dataBar, :dxfId => profitable, :priority => 1, :data_bar => data_bar })
414
+ end
415
+
416
+ wb.add_worksheet(:name => "Conditional Format Icon Set") do |ws|
417
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
418
+ ws.add_row ["Quarter", "Profit", "% of Total"]
419
+ offset = 3
420
+ rows = 20
421
+ offset.upto(rows + offset) do |i|
422
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
423
+ end
424
+ # Apply conditional formatting to range B3:B100 in the worksheet
425
+ icon_set = Axlsx::IconSet.new
426
+ ws.add_conditional_formatting("B3:B100", { :type => :iconSet, :dxfId => profitable, :priority => 1, :icon_set => icon_set })
291
427
  end
292
428
 
293
429
  ##Validate and Serialize
294
430
 
295
- #p.validate.each { |e| puts e.message }
431
+ #```ruby
432
+ # Serialize directly to file
296
433
  p.serialize("example.xlsx")
297
434
 
435
+ # or
436
+
437
+ #Serialize to a stream
298
438
  s = p.to_stream()
299
439
  File.open('example_streamed.xlsx', 'w') { |f| f.write(s.read) }
300
-
440
+ #```
301
441
 
302
442
  ##Using Shared Strings
443
+
444
+ #```ruby
445
+ # This is required by Numbers
303
446
  p.use_shared_strings = true
304
447
  p.serialize("shared_strings_example.xlsx")
448
+ #```
305
449
 
306
450
 
307
451
  ##Disabling Autowidth
452
+
453
+ #```ruby
308
454
  p = Axlsx::Package.new
309
455
  p.use_autowidth = false
310
456
  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']
457
+ wb.add_worksheet(:name => "Manual Widths") do | sheet |
458
+ sheet.add_row ['oh look! no autowidth']
313
459
  end
314
460
  p.validate.each { |e| puts e.message }
315
461
  p.serialize("no-use_autowidth.xlsx")
462
+ #```
463
+
316
464
 
317
465
 
318
466
 
Binary file
Binary file
Binary file
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby -w -s
2
+ # -*- coding: utf-8 -*-
3
+
4
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
5
+ require 'axlsx'
6
+
7
+ data = [ ['oil-bbl',9591.411671,8860.714604,8237.936509,7700.523067,7231.831842,6819.307902,6453.297235,6126.251755,5832.182748,5566.276532,5324.618706,5103.992757,4901.730597,4715.600022,4543.718862,4384.488699,4236.543136,4098.707009,3969.963937,3849.430276,3736.33405,3629.997786,3529.824424,3435.28568,3345.912388,3261.286414,3181.033882,3104.819438,3032.341401,2963.327615,2897.531915,2834.731083,2774.722219,2717.320479,2662.357097,2609.677666,2559.140642,2510.616021,2463.984182,2419.134871,2375.966292,2334.384311,2294.301748,2255.637735,2218.317165,2182.270173,2147.431696,2113.741056,2081.141602,2049.580377,2019.007821,1989.377502,1960.645871,1932.772042,1905.71759,1879.446367,1853.924338,1829.119424,1805.001366,1781.541597,1758.713122,1736.490414,1714.849315,1693.766943,1673.22161,1653.192744,1633.660817,1614.607284,1596.014514,1577.865741,1560.145009,1542.837121,1525.927597,1509.402632,1493.249056,1477.454298,1462.006352,1446.893746,1432.105512,1417.631159,1403.460647,1389.584361,1375.993094,1362.678018,1349.630672,1336.842938,1324.307026,1312.015455,1299.961043,1288.136885,1276.536347,1265.153047,1253.980847,1243.013838,1232.246332,1221.672852,1211.288119,1201.087047,1191.064732,1181.216443,1171.537618,1162.023853,1152.670896,1143.474642,1134.431125,1125.536513,1116.787101,1108.179309,1099.709672,1091.37484,1083.171571,1075.096725,1067.147265,1059.320247,1051.612821,1044.022223,1036.545778,1029.180889,1021.92504,1014.775789],
8
+
9
+ ['gas-mcf', 940970.153,836556.732,748476.939,673307.64,608520.158,552204.935,502892.3,459432.263,420911.806,386596.658,355889.491,328299.357,303418.988,280907.679,260478.232,241886.857,224925.287,209414.552,195200.029,182147.455,170139.707,159074.174,148860.596,139419.282,130679.626,122578.864,115061.035,108076.1,101579.19,95529.972,89892.104,84632.762,79722.24,75133.597,70842.349,66826.213,63064.865,59539.742,56233.86,53131.662,50218.869,47482.365,44910.082,42490.907,40214.588,38071.662,36053.382,34151.656,32358.989,30668.434,29073.545,27568.334,26147.237,24805.079,23537.041,22338.633,21205.67,20134.246,19120.717,18161.677,17253.941,16394.533,15580.663,14809.724,14079.269,13387.006,12730.786,12108.59,11518.524,10958.809,10427.774,9923.847,9445.55,8991.492,8560.364,8150.934,7762.041,7392.59,7041.551,6707.951,6390.874,6089.452,5802.871,5530.358,5271.185,5024.664,4790.145,4567.013,4354.687,4152.618,3960.286,3777.198,3602.889,3436.919,3278.87,3128.347,2984.976,2848.401,2718.287,2594.316,2476.184,2363.606,2256.309,2154.037,2056.545,1963.599,1874.982,1790.482,1709.903,1633.054,1559.758,1489.844,1423.151,1359.525,1298.821,1240.899,1185.628,1132.883,1082.544,1034.499],
10
+
11
+ ['water-bbl',940.97,836.557,748.477,673.308,608.52,552.205,502.892,459.432,420.912,386.597,355.889,328.299,303.419,280.908,260.478,241.887,224.925,209.415,195.2,182.147,170.14,159.074,148.861,139.419,130.68,122.579,115.061,108.076,101.579,95.53,89.892,84.633,79.722,75.134,70.842,66.826,63.065,59.54,56.234,53.132,50.219,47.482,44.91,42.491,40.215,38.072,36.053,34.152,32.359,30.668,29.074,27.568,26.147,24.805,23.537,22.339,21.206,20.134,19.121,18.162,17.254,16.395,15.581,14.81,14.079,13.387,12.731,12.109,11.519,10.959,10.428,9.924,9.446,8.991,8.56,8.151,7.762,7.393,7.042,6.708,6.391,6.089,5.803,5.53,5.271,5.025,4.79,4.567,4.355,4.153,3.96,3.777,3.603,3.437,3.279,3.128,2.985,2.848,2.718,2.594,2.476,2.364,2.256,2.154,2.057,1.964,1.875,1.79,1.71,1.633,1.56,1.49,1.423,1.36,1.299,1.241,1.186,1.133,1.083,1.034] ]
12
+
13
+ p = Axlsx::Package.new
14
+ wb = p.workbook
15
+ wb.add_worksheet(:name => 'volumes') do |ws|
16
+
17
+ # perspective, rotX and rotY flatten the 3D chart
18
+ # hPercent sets the chart height to 100%
19
+ chart = ws.add_chart(Axlsx::Line3DChart, :perspective => 0, :hPercent => 100, :rotX => 0, :rotY => 0, :start_at => "A4", :end_at => 'M44', :title => 'Monthly forcast for Type Curve Gas secondary - gross ngl')
20
+
21
+ # Set up log based scaling and appropriate min/max values for Y axis
22
+ chart.valAxis.scaling.logBase = 10
23
+ chart.valAxis.scaling.min = 0.1
24
+ chart.valAxis.scaling.max = 10000000.0
25
+
26
+ # No poing in showing the series axis labels as the chart is flattened!
27
+ chart.serAxis.delete = true
28
+
29
+ # Knock the catAxis labels down to the forced min.
30
+ chart.catAxis.crosses = :min
31
+
32
+ # set up cat labels / markes to show every 12th item
33
+ chart.catAxis.tickLblSkip = 12
34
+ chart.catAxis.tickMarkSkip = 12
35
+
36
+ #rgb colors for our data series
37
+ colors = ['00FF00', 'FF0000', '0000FF']
38
+
39
+ data.each_with_index do |value, index|
40
+ ws.add_row value
41
+ chart.add_series :data => ws.rows.last.cells[(1..value.size-1)], :labels => (0..value.size).map{ |i| i }, :title => ws.rows.last.cells.first, :color => colors[index]
42
+ end
43
+ end
44
+
45
+ p.serialize 'extractive.xlsx'