axlsx 1.1.4 → 1.3.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.
Files changed (242) hide show
  1. data/.yardopts +6 -2
  2. data/CHANGELOG.md +72 -0
  3. data/README.md +114 -31
  4. data/Rakefile +11 -3
  5. data/examples/auto_filter.rb +16 -0
  6. data/examples/auto_filter.xlsx +0 -0
  7. data/examples/basic_charts.rb +58 -0
  8. data/examples/chart_colors.rb +17 -2
  9. data/examples/data_validation.rb +50 -0
  10. data/examples/example.rb +171 -60
  11. data/examples/example.xlsx +0 -0
  12. data/examples/example_streamed.xlsx +0 -0
  13. data/examples/extractive.pdf +0 -0
  14. data/examples/extractive.rb +3 -0
  15. data/examples/extractive.xlsx +0 -0
  16. data/examples/hyperlinks.rb +23 -0
  17. data/examples/hyperlinks.xlsx +0 -0
  18. data/examples/no-use_autowidth.xlsx +0 -0
  19. data/examples/page_setup.rb +11 -0
  20. data/examples/page_setup.xlsx +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/axlsx.csv +1 -0
  26. data/examples/skydrive/axlsx.xlsx +0 -0
  27. data/examples/skydrive/real_example.rb +8 -8
  28. data/examples/sprk2012/Screen Shot 2012-09-11 at 10.42.06 PM.png +0 -0
  29. data/examples/sprk2012/Screen Shot 2012-09-11 at 11.07.48 PM.png +0 -0
  30. data/examples/sprk2012/Screen Shot 2012-09-11 at 8.31.50 PM.png +0 -0
  31. data/examples/sprk2012/Screen Shot 2012-09-11 at 9.23.27 PM.png +0 -0
  32. data/examples/sprk2012/Screen Shot 2012-09-11 at 9.32.06 PM.png +0 -0
  33. data/examples/sprk2012/Screen Shot 2012-09-11 at 9.33.35 PM.png +0 -0
  34. data/examples/sprk2012/Screen Shot 2012-09-11 at 9.46.44 PM.png +0 -0
  35. data/examples/sprk2012/Screen Shot 2012-09-12 at 5.07.23 PM.png +0 -0
  36. data/examples/sprk2012/basics.rb +11 -0
  37. data/examples/sprk2012/basics.xlsx +0 -0
  38. data/examples/sprk2012/gravatar.jpeg +0 -0
  39. data/examples/sprk2012/hair_club.jpg +0 -0
  40. data/examples/sprk2012/images.rb +9 -0
  41. data/examples/sprk2012/images.xlsx +0 -0
  42. data/examples/sprk2012/line_chart.rb +56 -0
  43. data/examples/sprk2012/line_chart.xlsx +0 -0
  44. data/examples/sprk2012/sprk2012.key +0 -0
  45. data/examples/sprk2012/styles.rb +20 -0
  46. data/examples/sprk2012/styles.xlsx +0 -0
  47. data/examples/styles.rb +62 -0
  48. data/examples/styles.xlsx +0 -0
  49. data/examples/two_cell_anchor_image.rb +11 -0
  50. data/lib/axlsx/content_type/content_type.rb +2 -0
  51. data/lib/axlsx/content_type/default.rb +30 -15
  52. data/lib/axlsx/content_type/override.rb +29 -14
  53. data/lib/axlsx/doc_props/app.rb +161 -104
  54. data/lib/axlsx/doc_props/core.rb +9 -5
  55. data/lib/axlsx/drawing/ax_data_source.rb +7 -6
  56. data/lib/axlsx/drawing/axis.rb +82 -36
  57. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  58. data/lib/axlsx/drawing/bar_series.rb +2 -1
  59. data/lib/axlsx/drawing/cat_axis.rb +43 -39
  60. data/lib/axlsx/drawing/chart.rb +65 -54
  61. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  62. data/lib/axlsx/drawing/drawing.rb +20 -8
  63. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  64. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  65. data/lib/axlsx/drawing/num_data.rb +2 -2
  66. data/lib/axlsx/drawing/num_data_source.rb +4 -1
  67. data/lib/axlsx/drawing/pic.rb +44 -4
  68. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  69. data/lib/axlsx/drawing/scatter_chart.rb +2 -8
  70. data/lib/axlsx/drawing/title.rb +21 -9
  71. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  72. data/lib/axlsx/drawing/view_3D.rb +42 -32
  73. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  74. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  75. data/lib/axlsx/package.rb +43 -16
  76. data/lib/axlsx/rels/relationship.rb +3 -3
  77. data/lib/axlsx/rels/relationships.rb +1 -11
  78. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  79. data/lib/axlsx/stylesheet/styles.rb +11 -2
  80. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  81. data/lib/axlsx/util/constants.rb +131 -2
  82. data/lib/axlsx/util/simple_typed_list.rb +18 -22
  83. data/lib/axlsx/util/validators.rb +100 -9
  84. data/lib/axlsx/version.rb +2 -7
  85. data/lib/axlsx/workbook/defined_name.rb +174 -0
  86. data/lib/axlsx/workbook/defined_names.rb +21 -0
  87. data/lib/axlsx/workbook/workbook.rb +70 -13
  88. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  89. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +102 -0
  90. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +253 -0
  91. data/lib/axlsx/workbook/worksheet/cell.rb +41 -8
  92. data/lib/axlsx/workbook/worksheet/col.rb +15 -0
  93. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  94. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  95. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  96. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  97. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  98. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  99. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  100. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +1 -1
  101. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  102. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  103. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +47 -0
  104. data/lib/axlsx/workbook/worksheet/page_setup.rb +241 -0
  105. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  106. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  107. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  108. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  109. data/lib/axlsx/workbook/worksheet/row.rb +36 -20
  110. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  111. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +49 -0
  112. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  113. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +107 -0
  114. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  115. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  116. data/lib/axlsx/workbook/worksheet/table.rb +10 -3
  117. data/lib/axlsx/workbook/worksheet/table_style_info.rb +68 -0
  118. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  119. data/lib/axlsx/workbook/worksheet/worksheet.rb +414 -254
  120. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  121. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  122. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +101 -0
  123. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  124. data/lib/axlsx.rb +38 -16
  125. data/test/content_type/tc_content_type.rb +1 -6
  126. data/test/doc_props/tc_app.rb +31 -1
  127. data/test/doc_props/tc_core.rb +3 -1
  128. data/test/drawing/tc_axis.rb +38 -3
  129. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  130. data/test/drawing/tc_bar_series.rb +1 -2
  131. data/test/drawing/tc_cat_axis.rb +3 -3
  132. data/test/drawing/tc_chart.rb +29 -9
  133. data/test/drawing/tc_d_lbls.rb +47 -0
  134. data/test/drawing/tc_drawing.rb +11 -5
  135. data/test/drawing/tc_hyperlink.rb +4 -5
  136. data/test/drawing/tc_line_series.rb +7 -3
  137. data/test/drawing/tc_num_data.rb +5 -1
  138. data/test/drawing/tc_pic.rb +22 -2
  139. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  140. data/test/drawing/tc_pie_series.rb +7 -2
  141. data/test/drawing/tc_scatter_chart.rb +6 -1
  142. data/test/drawing/tc_scatter_series.rb +1 -1
  143. data/test/drawing/tc_series.rb +1 -1
  144. data/test/drawing/tc_title.rb +16 -0
  145. data/test/drawing/tc_two_cell_anchor.rb +1 -2
  146. data/test/drawing/tc_view_3D.rb +18 -18
  147. data/test/drawing/tc_vml_drawing.rb +25 -0
  148. data/test/drawing/tc_vml_shape.rb +100 -0
  149. data/test/rels/tc_relationship.rb +1 -0
  150. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  151. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  152. data/test/stylesheet/tc_styles.rb +16 -4
  153. data/test/stylesheet/tc_table_style.rb +8 -0
  154. data/test/stylesheet/tc_table_style_element.rb +10 -1
  155. data/test/tc_helper.rb +1 -0
  156. data/test/tc_package.rb +94 -17
  157. data/test/util/tc_simple_typed_list.rb +13 -0
  158. data/test/util/tc_validators.rb +101 -8
  159. data/test/workbook/tc_defined_name.rb +41 -0
  160. data/test/workbook/tc_workbook.rb +5 -3
  161. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  162. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  163. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  164. data/test/workbook/worksheet/tc_cell.rb +53 -7
  165. data/test/workbook/worksheet/tc_col.rb +9 -0
  166. data/test/workbook/worksheet/tc_comment.rb +57 -0
  167. data/test/workbook/worksheet/tc_comments.rb +57 -0
  168. data/test/workbook/worksheet/tc_conditional_formatting.rb +44 -0
  169. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  170. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  171. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  172. data/test/workbook/worksheet/tc_page_setup.rb +143 -0
  173. data/test/workbook/worksheet/tc_pane.rb +94 -0
  174. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  175. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  176. data/test/workbook/worksheet/tc_row.rb +32 -14
  177. data/test/workbook/worksheet/tc_selection.rb +94 -0
  178. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  179. data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
  180. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  181. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  182. data/test/workbook/worksheet/{table/tc_table.rb → tc_table.rb} +9 -12
  183. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  184. data/test/workbook/worksheet/tc_worksheet.rb +155 -51
  185. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +64 -0
  186. metadata +194 -81
  187. data/examples/#extractive.csv# +0 -0
  188. data/examples/#extractive.rb# +0 -45
  189. data/examples/chart_colors.rb~ +0 -0
  190. data/examples/chart_colors.xlsx +0 -0
  191. data/examples/colored_series_data.xlsx +0 -0
  192. data/examples/conditional_formatting/getting_barred.xlsx +0 -0
  193. data/examples/example.csv +0 -1000
  194. data/examples/extractive.csv +0 -1
  195. data/examples/extractive.csv~ +0 -1
  196. data/examples/extractive.rb~ +0 -3
  197. data/examples/stack.rb +0 -21
  198. data/examples/stack.rb~ +0 -27
  199. data/examples/stack.xlsx +0 -0
  200. data/examples/~$chart_colors.xlsx +0 -0
  201. data/examples/~$extractive.xlsx +0 -0
  202. data/lib/axlsx/drawing/ax_data_source.rb~ +0 -55
  203. data/lib/axlsx/drawing/data_source.rb~ +0 -51
  204. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  205. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  206. data/lib/axlsx/drawing/num_data.rb~ +0 -51
  207. data/lib/axlsx/drawing/num_data_source.rb~ +0 -54
  208. data/lib/axlsx/drawing/num_val.rb~ +0 -40
  209. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  210. data/lib/axlsx/drawing/ref.rb~ +0 -41
  211. data/lib/axlsx/drawing/str_data.rb~ +0 -58
  212. data/lib/axlsx/drawing/str_val.rb~ +0 -35
  213. data/lib/axlsx/util/cbf.rb +0 -333
  214. data/lib/axlsx/util/cfb.rb~ +0 -201
  215. data/lib/axlsx/util/font_tables.rb~ +0 -0
  216. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  217. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  218. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  219. data/lib/axlsx/util/parser.rb~ +0 -6
  220. data/lib/axlsx/util/storage.rb~ +0 -0
  221. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  222. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  223. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  224. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  225. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  226. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  227. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  228. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  229. data/lib/schema/dc.xsd~ +0 -118
  230. data/lib/schema/dcterms.xsd~ +0 -331
  231. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  232. data/test/drawing/tc_data_source.rb~ +0 -30
  233. data/test/drawing/tc_num_data.rb~ +0 -35
  234. data/test/drawing/tc_num_val.rb~ +0 -29
  235. data/test/drawing/tc_str_data.rb~ +0 -30
  236. data/test/drawing/tc_str_val.rb~ +0 -26
  237. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  238. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  239. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  240. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  241. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  242. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
data/examples/example.rb CHANGED
@@ -55,22 +55,22 @@ wb.add_worksheet(:name => "Cell Level Style Overrides") do |sheet|
55
55
  sheet["A1:D1"].each { |c| c.color = "FF0000" }
56
56
  sheet['A1:D2'].each { |c| c.style = Axlsx::STYLE_THIN_BORDER }
57
57
  end
58
- #```
58
+ ##```
59
59
 
60
- #Using Custom Border Styles
60
+ ##Using Custom Border Styles
61
61
 
62
62
  #```ruby
63
63
  #Axlsx defines a thin border style, but you can easily create and use your own.
64
64
  wb.styles do |s|
65
- red_border = s.add_style :border => { :style => :thick, :color =>"FFFF0000" }
66
- blue_border = s.add_style :border => { :style => :thick, :color =>"FF0000FF" }
65
+ red_border = s.add_style :border => { :style => :thick, :color =>"FFFF0000", :edges => [:left, :right] }
66
+ blue_border = s.add_style :border => { :style => :thick, :color =>"FF0000FF"}
67
67
 
68
68
  wb.add_worksheet(:name => "Custom Borders") do |sheet|
69
69
  sheet.add_row ["wrap", "me", "Up in Red"], :style => red_border
70
70
  sheet.add_row [1, 2, 3], :style => blue_border
71
71
  end
72
72
  end
73
- #```
73
+ ##```
74
74
 
75
75
 
76
76
  ##Styling Rows and Columns
@@ -97,12 +97,11 @@ wb.styles do |s|
97
97
  #Set the second column outline level
98
98
  sheet.column_info[1].outlineLevel = 2
99
99
 
100
- #TODO rows hidden, outline etc.
101
100
  sheet.rows[3].hidden = true
102
101
  sheet.rows[1].outlineLevel = 2
103
102
  end
104
103
  end
105
- #```
104
+ ##```
106
105
 
107
106
 
108
107
  ##Specifying Column Widths
@@ -113,7 +112,7 @@ wb.add_worksheet(:name => "custom column widths") do |sheet|
113
112
  sheet.add_row ['abcdefg', 'This is a very long text and should flow into the right cell', nil, 'xxx' ]
114
113
  sheet.column_widths nil, 3, 5, nil
115
114
  end
116
- #```
115
+ ##```
117
116
 
118
117
  ##Merging Cells.
119
118
 
@@ -128,7 +127,7 @@ wb.add_worksheet(:name => 'Merging Cells') do |sheet|
128
127
  sheet["A1:D1"].each { |c| c.color = "FF0000"}
129
128
  sheet["A1:D4"].each { |c| c.style = Axlsx::STYLE_THIN_BORDER }
130
129
  end
131
- #```
130
+ ##```
132
131
 
133
132
  ##Add an Image with a hyperlink
134
133
 
@@ -170,7 +169,7 @@ wb.add_worksheet(:name => "日本語でのシート名") do |sheet|
170
169
  sheet.add_row ["华语/華語"]
171
170
  sheet.add_row ["한국어/조선말"]
172
171
  end
173
- #```
172
+ ##```
174
173
 
175
174
  ##Using formula
176
175
 
@@ -179,7 +178,7 @@ wb.add_worksheet(:name => "Using Formulas") do |sheet|
179
178
  sheet.add_row ['col 1', 'col 2', 'col 3', 'col 4']
180
179
  sheet.add_row [1, 2, 3, "=SUM(A2:C2)"]
181
180
  end
182
- #```
181
+ ##```
183
182
 
184
183
  ##Auto Filter
185
184
 
@@ -191,11 +190,13 @@ wb.add_worksheet(:name => "Auto Filter") do |sheet|
191
190
  sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
192
191
  sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
193
192
  sheet.auto_filter = "A2:D5"
193
+ sheet.auto_filter.add_column 3, :filters, :filter_items => ['1.9.2', '1.8.7']
194
194
  end
195
195
  #```
196
196
 
197
197
  ##Automatic cell types
198
198
 
199
+
199
200
  #```ruby
200
201
  wb.add_worksheet(:name => "Automatic cell types") do |sheet|
201
202
  date_format = wb.styles.add_style :format_code => 'YYYY-MM-DD'
@@ -203,33 +204,53 @@ wb.add_worksheet(:name => "Automatic cell types") do |sheet|
203
204
  sheet.add_row ["Date", "Time", "String", "Boolean", "Float", "Integer"]
204
205
  sheet.add_row [Date.today, Time.now, "value", true, 0.1, 1], :style => [date_format, time_format]
205
206
  end
206
- #```
207
207
 
208
208
 
209
+ # Hyperlinks in worksheet
210
+ wb.add_worksheet(:name => 'hyperlinks') do |sheet|
211
+ # external references
212
+ sheet.add_row ['axlsx']
213
+ sheet.add_hyperlink :location => 'https://github.com/randym/axlsx', :ref => sheet.rows.first.cells.first
214
+ # internal references
215
+ sheet.add_hyperlink :location => "'Next Sheet'!A1", :ref => 'A2', :target => :sheet
216
+ sheet.add_row ['next sheet']
217
+ end
218
+
219
+ wb.add_worksheet(:name => 'Next Sheet') do |sheet|
220
+ sheet.add_row ['hello!']
221
+ end
222
+ ###```
223
+
224
+ ##Number formatting and currency
225
+ wb.add_worksheet(:name => "Formats and Currency") do |sheet|
226
+ currency = wb.styles.add_style :num_fmt => 5
227
+ red_negative = wb.styles.add_style :num_fmt => 8
228
+ comma = wb.styles.add_style :num_fmt => 3
229
+ super_funk = wb.styles.add_style :format_code => '[Green]#'
230
+ sheet.add_row %w(Currency RedNegative Comma Custom)
231
+ sheet.add_row [1500, -122.34, 123456789, 594829], :style=> [currency, red_negative, comma, super_funk]
232
+ end
233
+
209
234
  ##Generating A Bar Chart
210
235
 
211
236
  #```ruby
212
237
  wb.add_worksheet(:name => "Bar Chart") do |sheet|
213
238
  sheet.add_row ["A Simple Bar Chart"]
214
- sheet.add_row ["First", "Second", "Third"]
215
- sheet.add_row [1, 2, 3]
216
- sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A4", :end_at => "F17") do |chart|
217
- chart.add_series :data => sheet["A3:C3"], :labels => sheet["A2:C2"], :title => sheet["A1"]
218
- chart.valAxis.label_rotation = -45
219
- chart.catAxis.label_rotation = 45
239
+ %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
240
+ sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A6", :end_at => "F20") do |chart|
241
+ chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"], :title => sheet["A1"]
220
242
  end
221
243
  end
222
- #```
244
+ ##```
223
245
 
224
246
  ##Hide Gridlines in chart
225
247
 
226
248
  #```ruby
227
249
  wb.add_worksheet(:name => "Chart With No Gridlines") do |sheet|
228
- sheet.add_row ["A Simple Bar Chart"]
229
- sheet.add_row ["First", "Second", "Third"]
230
- sheet.add_row [1, 2, 3]
231
- sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A4", :end_at => "F17") do |chart|
232
- chart.add_series :data => sheet["A3:C3"], :labels => sheet["A2:C2"], :title => sheet["A1"]
250
+ sheet.add_row ["Bar Chart without gridlines"]
251
+ %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
252
+ sheet.add_chart(Axlsx::Bar3DChart, :start_at => "A6", :end_at => "F20") do |chart|
253
+ chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"]
233
254
  chart.valAxis.gridlines = false
234
255
  chart.catAxis.gridlines = false
235
256
  end
@@ -240,28 +261,10 @@ end
240
261
 
241
262
  #```ruby
242
263
  wb.add_worksheet(:name => "Pie Chart") do |sheet|
243
- sheet.add_row ["First", "Second", "Third", "Fourth"]
244
- sheet.add_row [1, 2, 3, "=PRODUCT(A2:C2)"]
245
- sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,2], :end_at => [5, 15], :title => "example 3: Pie Chart") do |chart|
246
- chart.add_series :data => sheet["A2:D2"], :labels => sheet["A1:D1"]
247
- end
248
- end
249
- #```
250
-
251
- ##Data over time
252
-
253
- #```ruby
254
- wb.add_worksheet(:name=>'Charting Dates') do |sheet|
255
- # cell level style overides when adding cells
256
- sheet.add_row ['Date', 'Value'], :sz => 16
257
- sheet.add_row [Time.now - (7*60*60*24), 3]
258
- sheet.add_row [Time.now - (6*60*60*24), 7]
259
- sheet.add_row [Time.now - (5*60*60*24), 18]
260
- sheet.add_row [Time.now - (4*60*60*24), 1]
261
- sheet.add_chart(Axlsx::Bar3DChart) do |chart|
262
- chart.start_at "B7"
263
- chart.end_at "H27"
264
- chart.add_series(:data => sheet["B2:B5"], :labels => sheet["A2:A5"], :title => sheet["B1"])
264
+ sheet.add_row ["Simple Pie Chart"]
265
+ %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
266
+ sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,5], :end_at => [10, 20], :title => "example 3: Pie Chart") do |chart|
267
+ chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"], :colors => ['FF0000', '00FF00', '0000FF']
265
268
  end
266
269
  end
267
270
  #```
@@ -270,13 +273,18 @@ end
270
273
 
271
274
  #```ruby
272
275
  wb.add_worksheet(:name => "Line Chart") do |sheet|
273
- sheet.add_row ["First", 1, 5, 7, 9]
274
- sheet.add_row ["Second", 5, 2, 14, 9]
275
- sheet.add_chart(Axlsx::Line3DChart, :title => "example 6: Line Chart", :rotX => 30, :rotY => 20) do |chart|
276
- chart.start_at 0, 2
277
- chart.end_at 10, 15
278
- chart.add_series :data => sheet["B1:E1"], :title => sheet["A1"]
279
- chart.add_series :data => sheet["B2:E2"], :title => sheet["A2"]
276
+ sheet.add_row ["Simple Line Chart"]
277
+ sheet.add_row %w(first second)
278
+ 4.times do
279
+ sheet.add_row [ rand(24)+1, rand(24)+1]
280
+ end
281
+ sheet.add_chart(Axlsx::Line3DChart, :title => "Simple Line Chart", :rotX => 30, :rotY => 20) do |chart|
282
+ chart.start_at 0, 5
283
+ chart.end_at 10, 20
284
+ chart.add_series :data => sheet["A3:A6"], :title => sheet["A2"]
285
+ chart.add_series :data => sheet["B3:B6"], :title => sheet["B2"]
286
+ chart.catAxis.title = 'X Axis'
287
+ chart.valAxis.title = 'Y Axis'
280
288
  end
281
289
  end
282
290
  #```
@@ -308,7 +316,7 @@ wb.add_worksheet(:name => "Table") do |sheet|
308
316
  sheet.add_row ["19.1", "1 min 32 sec", "about 10 hours ago", "1.8.7"]
309
317
  sheet.add_row ["19.2", "1 min 28 sec", "about 10 hours ago", "1.9.2"]
310
318
  sheet.add_row ["19.3", "1 min 35 sec", "about 10 hours ago", "1.9.3"]
311
- sheet.add_table "A2:D5", :name => 'Build Matrix'
319
+ sheet.add_table "A2:D5", :name => 'Build Matrix', :style_info => { :name => "TableStyleMedium23" }
312
320
  end
313
321
  #```
314
322
 
@@ -320,7 +328,7 @@ wb.add_worksheet(:name => "fit to page") do |sheet|
320
328
  sheet.add_row ['this all goes on one page']
321
329
  sheet.fit_to_page = true
322
330
  end
323
- #```
331
+ ##```
324
332
 
325
333
 
326
334
  ##Hide Gridlines in worksheet
@@ -330,18 +338,119 @@ wb.add_worksheet(:name => "No Gridlines") do |sheet|
330
338
  sheet.add_row ["This", "Sheet", "Hides", "Gridlines"]
331
339
  sheet.show_gridlines = false
332
340
  end
333
- #```
341
+ ##```
334
342
 
343
+ #```ruby
344
+ wb.add_worksheet(:name => "repeated header") do |sheet|
345
+ sheet.add_row %w(These Column Header Will Render On Every Printed Sheet)
346
+ 200.times { sheet.add_row %w(1 2 3 4 5 6 7 8) }
347
+ wb.add_defined_name("'repeated header'!$1:$1", :local_sheet_id => sheet.index, :name => '_xlnm.Print_Titles')
348
+ end
349
+
350
+ # Sheet Protection and excluding cells from locking.
351
+ unlocked = wb.styles.add_style :locked => false
352
+ wb.add_worksheet(:name => 'Sheet Protection') do |sheet|
353
+ sheet.sheet_protection.password = 'fish'
354
+ sheet.add_row [1, 2 ,3] # These cells will be locked
355
+ sheet.add_row [4, 5, 6], :style => unlocked # these cells will not!
356
+ end
335
357
 
336
- ##Specify Page Margins for printing
358
+
359
+ ##Specify page margins and other options for printing
337
360
 
338
361
  #```ruby
339
362
  margins = {:left => 3, :right => 3, :top => 1.2, :bottom => 1.2, :header => 0.7, :footer => 0.7}
340
- wb.add_worksheet(:name => "print margins", :page_margins => margins) do |sheet|
341
- sheet.add_row ["this sheet uses customized page margins for printing"]
363
+ setup = {:fit_to_width => 1, :orientation => :landscape, :paper_width => "297mm", :paper_height => "210mm"}
364
+ options = {:grid_lines => true, :headings => true, :horizontal_centered => true}
365
+ wb.add_worksheet(:name => "print margins", :page_margins => margins, :page_setup => setup, :print_options => options) do |sheet|
366
+ sheet.add_row ["this sheet uses customized print settings"]
342
367
  end
343
368
  #```
344
369
 
370
+ ## Add Comments to your spreadsheet
371
+ #``` ruby
372
+ wb.add_worksheet(:name => 'comments') do |sheet|
373
+ sheet.add_row ['Can we build it?']
374
+ sheet.add_comment :ref => 'A1', :author => 'Bob', :text => 'Yes We Can!'
375
+ end
376
+
377
+ ## Frozen/Split panes
378
+ ## ``` ruby
379
+ wb.add_worksheet(:name => 'fixed headers') do |sheet|
380
+ sheet.add_row(['', (0..99).map { |i| "column header #{i}" }].flatten )
381
+ 100.times.with_index { |index| sheet << ["row header", (0..index).to_a].flatten }
382
+ sheet.sheet_view.pane do |pane|
383
+ pane.top_left_cell = "B2"
384
+ pane.state = :frozen_split
385
+ pane.y_split = 1
386
+ pane.x_split = 1
387
+ pane.active_pane = :bottom_right
388
+ end
389
+ end
390
+
391
+ # conditional formatting
392
+ #
393
+ percent = wb.styles.add_style(:format_code => "0.00%", :border => Axlsx::STYLE_THIN_BORDER)
394
+ money = wb.styles.add_style(:format_code => '0,000', :border => Axlsx::STYLE_THIN_BORDER)
395
+
396
+ # define the style for conditional formatting
397
+ profitable = wb.styles.add_style( :fg_color=>"FF428751",
398
+ :type => :dxf)
399
+
400
+ wb.add_worksheet(:name => "Conditional Cell Is") do |ws|
401
+
402
+ # Generate 20 rows of data
403
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
404
+ ws.add_row ["Quarter", "Profit", "% of Total"]
405
+ offset = 3
406
+ rows = 20
407
+ offset.upto(rows + offset) do |i|
408
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
409
+ end
410
+
411
+ # Apply conditional formatting to range B3:B100 in the worksheet
412
+ ws.add_conditional_formatting("B3:B100", { :type => :cellIs, :operator => :greaterThan, :formula => "100000", :dxfId => profitable, :priority => 1 })
413
+ end
414
+
415
+ wb.add_worksheet(:name => "Conditional Color Scale") do |ws|
416
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
417
+ ws.add_row ["Quarter", "Profit", "% of Total"]
418
+ offset = 3
419
+ rows = 20
420
+ offset.upto(rows + offset) do |i|
421
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
422
+ end
423
+ # Apply conditional formatting to range B3:B100 in the worksheet
424
+ color_scale = Axlsx::ColorScale.new
425
+ ws.add_conditional_formatting("B3:B100", { :type => :colorScale, :operator => :greaterThan, :formula => "100000", :dxfId => profitable, :priority => 1, :color_scale => color_scale })
426
+ end
427
+
428
+
429
+ wb.add_worksheet(:name => "Conditional Data Bar") do |ws|
430
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
431
+ ws.add_row ["Quarter", "Profit", "% of Total"]
432
+ offset = 3
433
+ rows = 20
434
+ offset.upto(rows + offset) do |i|
435
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
436
+ end
437
+ # Apply conditional formatting to range B3:B100 in the worksheet
438
+ data_bar = Axlsx::DataBar.new
439
+ ws.add_conditional_formatting("B3:B100", { :type => :dataBar, :dxfId => profitable, :priority => 1, :data_bar => data_bar })
440
+ end
441
+
442
+ wb.add_worksheet(:name => "Conditional Format Icon Set") do |ws|
443
+ ws.add_row ["Previous Year Quarterly Profits (JPY)"]
444
+ ws.add_row ["Quarter", "Profit", "% of Total"]
445
+ offset = 3
446
+ rows = 20
447
+ offset.upto(rows + offset) do |i|
448
+ ws.add_row ["Q#{i}", 10000*((rows/2-i) * (rows/2-i)), "=100*B#{i}/SUM(B3:B#{rows+offset})"], :style=>[nil, money, percent]
449
+ end
450
+ # Apply conditional formatting to range B3:B100 in the worksheet
451
+ icon_set = Axlsx::IconSet.new
452
+ ws.add_conditional_formatting("B3:B100", { :type => :iconSet, :dxfId => profitable, :priority => 1, :icon_set => icon_set })
453
+ end
345
454
 
346
455
  ##Validate and Serialize
347
456
 
@@ -364,7 +473,9 @@ p.use_shared_strings = true
364
473
  p.serialize("shared_strings_example.xlsx")
365
474
  #```
366
475
 
367
-
476
+ #p.validate do |er|
477
+ #puts er.inspect
478
+ #end
368
479
  ##Disabling Autowidth
369
480
 
370
481
  #```ruby
Binary file
Binary file
Binary file
@@ -13,6 +13,7 @@ data = [ ['oil-bbl',9591.411671,8860.714604,8237.936509,7700.523067,7231.831842,
13
13
  p = Axlsx::Package.new
14
14
  wb = p.workbook
15
15
  wb.add_worksheet(:name => 'volumes') do |ws|
16
+
16
17
  # perspective, rotX and rotY flatten the 3D chart
17
18
  # hPercent sets the chart height to 100%
18
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')
@@ -27,12 +28,14 @@ wb.add_worksheet(:name => 'volumes') do |ws|
27
28
 
28
29
  # Knock the catAxis labels down to the forced min.
29
30
  chart.catAxis.crosses = :min
31
+
30
32
  # set up cat labels / markes to show every 12th item
31
33
  chart.catAxis.tickLblSkip = 12
32
34
  chart.catAxis.tickMarkSkip = 12
33
35
 
34
36
  #rgb colors for our data series
35
37
  colors = ['00FF00', 'FF0000', '0000FF']
38
+
36
39
  data.each_with_index do |value, index|
37
40
  ws.add_row value
38
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]
Binary file
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby -w -s
2
+ # -*- coding: utf-8 -*-
3
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
4
+
5
+ #```ruby
6
+ require 'axlsx'
7
+
8
+ p = Axlsx::Package.new
9
+ wb = p.workbook
10
+ wb.add_worksheet(:name => 'hyperlinks') do |sheet|
11
+ # external references
12
+ sheet.add_row ['axlsx']
13
+ sheet.add_hyperlink :location => 'https://github.com/randym/axlsx', :ref => sheet.rows.first.cells.first
14
+ # internal references
15
+ sheet.add_row ['next sheet']
16
+ sheet.add_hyperlink :location => "'Next Sheet'!A1", :target => :sheet, :ref => 'A2'
17
+ end
18
+
19
+ wb.add_worksheet(:name => 'Next Sheet') do |sheet|
20
+ sheet.add_row ['hello!']
21
+ end
22
+
23
+ p.serialize 'hyperlinks.xlsx'
Binary file
Binary file
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
2
+ require 'axlsx'
3
+ xls = Axlsx::Package.new
4
+ wb = xls.workbook
5
+ wb.add_worksheet do |ws|
6
+ # Excel does not currently follow the specification and will ignore paper_width and paper_height so if you need
7
+ # to for a paper size, be sure to set :paper_size
8
+ ws.page_setup.set :paper_width => "210mm", :paper_size => 10, :paper_height => "297mm", :orientation => :landscape
9
+ ws.add_row %w(AXLSX is cool)
10
+ end
11
+ xls.serialize "page_setup.xlsx"
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 @@
1
+ ,,,,,
Binary file
@@ -1,18 +1,18 @@
1
- $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
1
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib"
2
2
 
3
3
  require 'axlsx'
4
4
 
5
5
  Axlsx::Package.new do |p|
6
6
  p.workbook do |wb|
7
7
  styles = wb.styles
8
- header = styles.add_style :bg_color => "DD", :sz => 16, :b => true, :alignment => {:horizontal => :center}
8
+ header = styles.add_style :bg_color => "DD", :sz => 16, :b => true, :alignment => {:horizontal => :center}
9
9
  tbl_header = styles.add_style :b => true, :alignment => { :horizontal => :center }
10
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"
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
16
 
17
17
  wb.add_worksheet do |sheet|
18
18
  sheet.add_row
@@ -54,7 +54,7 @@ Axlsx::Package.new do |p|
54
54
  chart.start_at 7, 16
55
55
  chart.end_at 12, 31
56
56
  end
57
- sheet.merged_cells.concat ["B4:C4","E4:F4","B11:C11","E11:F11","B2:F2"]
57
+ %w(B4:C4 E4:F4 B11:C11 E11:F11 B2:F2).each { |range| sheet.merge_cells(range) }
58
58
  sheet.column_widths 2, nil, nil, 2, nil, nil, 2
59
59
  end
60
60
  end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib"
2
+ require 'axlsx'
3
+
4
+ package = Axlsx::Package.new
5
+ package.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
6
+ sheet.add_row ["First Column", "Second", "Third"]
7
+ sheet.add_row [1, 2, 3]
8
+ end
9
+ package.serialize 'basics.xlsx'
10
+
11
+
Binary file
Binary file
Binary file