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
@@ -0,0 +1,214 @@
1
+ # encoding: UTF-8
2
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../"
3
+ require 'tc_helper.rb'
4
+
5
+ class TestSheetView < Test::Unit::TestCase
6
+ def setup
7
+ #inverse defaults for booleans
8
+ @boolean_options = { :right_to_left => true, :show_formulas => true, :show_outline_symbols => true,
9
+ :show_white_space => true, :tab_selected => true, :default_grid_color => false, :show_grid_lines => false,
10
+ :show_row_col_headers => false, :show_ruler => false, :show_zeros => false, :window_protection => true }
11
+ @symbol_options = { :view => :page_break_preview }
12
+ @nil_options = { :color_id => 2, :top_left_cell => 'A2' }
13
+ @int_0 = { :zoom_scale_normal => 100, :zoom_scale_page_layout_view => 100, :zoom_scale_sheet_layout_view => 100, :workbook_view_id => 2 }
14
+ @int_100 = { :zoom_scale => 10 }
15
+
16
+ @integer_options = { :color_id => 2, :workbook_view_id => 2 }.merge(@int_0).merge(@int_100)
17
+ @string_options = { :top_left_cell => 'A2' }
18
+
19
+
20
+ @options = @boolean_options.merge(@boolean_options).merge(@symbol_options).merge(@nil_options).merge(@int_0).merge(@int_100)
21
+
22
+ @sv = Axlsx::SheetView.new(@options)
23
+ end
24
+
25
+ def test_initialize
26
+ sv = Axlsx::SheetView.new
27
+
28
+ @boolean_options.each do |key, value|
29
+ assert_equal(!value, sv.send(key.to_sym), "initialized default #{key} should be #{!value}")
30
+ assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
31
+ end
32
+
33
+ @nil_options.each do |key, value|
34
+ assert_equal(nil, sv.send(key.to_sym), "initialized default #{key} should be nil")
35
+ assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
36
+ end
37
+
38
+ @int_0.each do |key, value|
39
+ assert_equal(0, sv.send(key.to_sym), "initialized default #{key} should be 0")
40
+ assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
41
+ end
42
+
43
+ @int_100.each do |key, value|
44
+ assert_equal(100, sv.send(key.to_sym), "initialized default #{key} should be 100")
45
+ assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
46
+ end
47
+ end
48
+
49
+ def test_boolean_attribute_validation
50
+ @boolean_options.each do |key, value|
51
+ assert_raise(ArgumentError, "#{key} must be boolean") { @sv.send("#{key}=".to_sym, 'A') }
52
+ assert_nothing_raised { @sv.send("#{key}=".to_sym, true) }
53
+ end
54
+ end
55
+
56
+ def test_string_attribute_validation
57
+ @string_options.each do |key, value|
58
+ assert_raise(ArgumentError, "#{key} must be string") { @sv.send("#{key}=".to_sym, :symbol) }
59
+ assert_nothing_raised { @sv.send("#{key}=".to_sym, "foo") }
60
+ end
61
+ end
62
+
63
+ def test_symbol_attribute_validation
64
+ @symbol_options.each do |key, value|
65
+ assert_raise(ArgumentError, "#{key} must be symbol") { @sv.send("#{key}=".to_sym, "foo") }
66
+ assert_nothing_raised { @sv.send("#{key}=".to_sym, value) }
67
+ end
68
+ end
69
+
70
+ def test_integer_attribute_validation
71
+ @integer_options.each do |key, value|
72
+ assert_raise(ArgumentError, "#{key} must be integer") { @sv.send("#{key}=".to_sym, "foo") }
73
+ assert_nothing_raised { @sv.send("#{key}=".to_sym, value) }
74
+ end
75
+ end
76
+
77
+ def test_color_id
78
+ assert_raise(ArgumentError) { @sv.color_id = "10" }
79
+ assert_nothing_raised { @sv.color_id = 2 }
80
+ assert_equal(@sv.color_id, 2)
81
+ end
82
+
83
+ def test_default_grid_color
84
+ assert_raise(ArgumentError) { @sv.default_grid_color = "foo" }
85
+ assert_nothing_raised { @sv.default_grid_color = false }
86
+ assert_equal(@sv.default_grid_color, false)
87
+ end
88
+
89
+ def test_right_to_left
90
+ assert_raise(ArgumentError) { @sv.right_to_left = "foo´" }
91
+ assert_nothing_raised { @sv.right_to_left = true }
92
+ assert_equal(@sv.right_to_left, true)
93
+ end
94
+
95
+ def test_show_formulas
96
+ assert_raise(ArgumentError) { @sv.show_formulas = 'foo' }
97
+ assert_nothing_raised { @sv.show_formulas = false }
98
+ assert_equal(@sv.show_formulas, false)
99
+ end
100
+
101
+ def test_show_grid_lines
102
+ assert_raise(ArgumentError) { @sv.show_grid_lines = "foo" }
103
+ assert_nothing_raised { @sv.show_grid_lines = false }
104
+ assert_equal(@sv.show_grid_lines, false)
105
+ end
106
+
107
+ def test_show_outline_symbols
108
+ assert_raise(ArgumentError) { @sv.show_outline_symbols = 'foo' }
109
+ assert_nothing_raised { @sv.show_outline_symbols = false }
110
+ assert_equal(@sv.show_outline_symbols, false)
111
+ end
112
+
113
+ def test_show_row_col_headers
114
+ assert_raise(ArgumentError) { @sv.show_row_col_headers = "foo" }
115
+ assert_nothing_raised { @sv.show_row_col_headers = false }
116
+ assert_equal(@sv.show_row_col_headers, false)
117
+ end
118
+
119
+ def test_show_ruler
120
+ assert_raise(ArgumentError) { @sv.show_ruler = 'foo' }
121
+ assert_nothing_raised { @sv.show_ruler = false }
122
+ assert_equal(@sv.show_ruler, false)
123
+ end
124
+
125
+ def test_show_white_space
126
+ assert_raise(ArgumentError) { @sv.show_white_space = 'foo' }
127
+ assert_nothing_raised { @sv.show_white_space = false }
128
+ assert_equal(@sv.show_white_space, false)
129
+ end
130
+
131
+ def test_show_zeros
132
+ assert_raise(ArgumentError) { @sv.show_zeros = "foo" }
133
+ assert_nothing_raised { @sv.show_zeros = false }
134
+ assert_equal(@sv.show_zeros, false)
135
+ end
136
+
137
+ def test_tab_selected
138
+ assert_raise(ArgumentError) { @sv.tab_selected = "foo" }
139
+ assert_nothing_raised { @sv.tab_selected = false }
140
+ assert_equal(@sv.tab_selected, false)
141
+ end
142
+
143
+ def test_top_left_cell
144
+ assert_raise(ArgumentError) { @sv.top_left_cell = :cell_adress }
145
+ assert_nothing_raised { @sv.top_left_cell = "A2" }
146
+ assert_equal(@sv.top_left_cell, "A2")
147
+ end
148
+
149
+ def test_view
150
+ assert_raise(ArgumentError) { @sv.view = 'view' }
151
+ assert_nothing_raised { @sv.view = :page_break_preview }
152
+ assert_equal(@sv.view, :page_break_preview)
153
+ end
154
+
155
+ def test_window_protection
156
+ assert_raise(ArgumentError) { @sv.window_protection = "foo" }
157
+ assert_nothing_raised { @sv.window_protection = false }
158
+ assert_equal(@sv.window_protection, false)
159
+ end
160
+
161
+ def test_workbook_view_id
162
+ assert_raise(ArgumentError) { @sv.workbook_view_id = "1" }
163
+ assert_nothing_raised { @sv.workbook_view_id = 1 }
164
+ assert_equal(@sv.workbook_view_id, 1)
165
+ end
166
+
167
+ def test_zoom_scale
168
+ assert_raise(ArgumentError) { @sv.zoom_scale = "50" }
169
+ assert_nothing_raised { @sv.zoom_scale = 50 }
170
+ assert_equal(@sv.zoom_scale, 50)
171
+ end
172
+
173
+ def test_zoom_scale_normal
174
+ assert_raise(ArgumentError) { @sv.zoom_scale_normal = "50" }
175
+ assert_nothing_raised { @sv.zoom_scale_normal = 50 }
176
+ assert_equal(@sv.zoom_scale_normal, 50)
177
+ end
178
+
179
+ def test_zoom_scale_page_layout_view
180
+ assert_raise(ArgumentError) { @sv.zoom_scale_page_layout_view = "50" }
181
+ assert_nothing_raised { @sv.zoom_scale_page_layout_view = 50 }
182
+ assert_equal(@sv.zoom_scale_page_layout_view, 50)
183
+ end
184
+
185
+ def test_zoom_scale_sheet_layout_view
186
+ assert_raise(ArgumentError) { @sv.zoom_scale_sheet_layout_view = "50" }
187
+ assert_nothing_raised { @sv.zoom_scale_sheet_layout_view = 50 }
188
+ assert_equal(@sv.zoom_scale_sheet_layout_view, 50)
189
+ end
190
+
191
+ def test_to_xml
192
+ p = Axlsx::Package.new
193
+ @ws = p.workbook.add_worksheet :name => "sheetview"
194
+ @ws.sheet_view do |vs|
195
+ vs.view = :page_break_preview
196
+ end
197
+
198
+ doc = Nokogiri::XML.parse(@ws.sheet_view.to_xml_string)
199
+
200
+ assert_equal(1, doc.xpath("//sheetView[@tabSelected='false']").size)
201
+
202
+ assert_equal(1, doc.xpath("//sheetView[@tabSelected='false'][@showWhiteSpace='false'][@showOutlineSymbols='false'][@showFormulas='false']
203
+ [@rightToLeft='false'][@windowProtection='false'][@showZeros='true'][@showRuler='true']
204
+ [@showRowColHeaders='true'][@showGridLines='true'][@defaultGridColor='true']
205
+ [@zoomScale='100'][@workbookViewId='0'][@zoomScaleSheetLayoutView='0'][@zoomScalePageLayoutView='0']
206
+ [@zoomScaleNormal='0'][@view='page_break_preview']").size)
207
+ end
208
+
209
+ def test_add_selection
210
+ @sv.add_selection(:top_left, :active_cell => "A1")
211
+ assert_equal('A1', @sv.selections[:top_left].active_cell)
212
+ end
213
+
214
+ end
@@ -14,6 +14,14 @@ class TestWorksheet < Test::Unit::TestCase
14
14
  assert_equal(ws.pn, "worksheets/sheet2.xml")
15
15
  end
16
16
 
17
+ def test_name_is_html_encoded
18
+ @ws.name = '<foo> & <bar>'
19
+ assert_equal(@ws.name, '&lt;foo&gt; &amp; &lt;bar&gt;')
20
+ end
21
+
22
+ def test_name_exception_on_colon
23
+ assert_raises(ArgumentError) { @ws.name = 'foo:bar' }
24
+ end
17
25
  def test_page_margins
18
26
  assert(@ws.page_margins.is_a? Axlsx::PageMargins)
19
27
  end
@@ -25,6 +33,28 @@ class TestWorksheet < Test::Unit::TestCase
25
33
  end
26
34
  end
27
35
 
36
+ def test_page_setup
37
+ assert(@ws.page_setup.is_a? Axlsx::PageSetup)
38
+ end
39
+
40
+ def test_page_setup_yield
41
+ @ws.page_setup do |ps|
42
+ assert(ps.is_a? Axlsx::PageSetup)
43
+ assert(@ws.page_setup == ps)
44
+ end
45
+ end
46
+
47
+ def test_print_options
48
+ assert(@ws.print_options.is_a? Axlsx::PrintOptions)
49
+ end
50
+
51
+ def test_print_options_yield
52
+ @ws.print_options do |po|
53
+ assert(po.is_a? Axlsx::PrintOptions)
54
+ assert(@ws.print_options == po)
55
+ end
56
+ end
57
+
28
58
  def test_no_autowidth
29
59
  @ws.workbook.use_autowidth = false
30
60
  @ws.add_row [1,2,3,4]
@@ -33,16 +63,22 @@ class TestWorksheet < Test::Unit::TestCase
33
63
 
34
64
  def test_initialization_options
35
65
  page_margins = {:left => 2, :right => 2, :bottom => 2, :top => 2, :header => 2, :footer => 2}
36
- optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :selected => true, :show_gridlines => false)
37
- assert_equal(optioned.page_margins.left, page_margins[:left])
38
- assert_equal(optioned.page_margins.right, page_margins[:right])
39
- assert_equal(optioned.page_margins.top, page_margins[:top])
40
- assert_equal(optioned.page_margins.bottom, page_margins[:bottom])
41
- assert_equal(optioned.page_margins.header, page_margins[:header])
42
- assert_equal(optioned.page_margins.footer, page_margins[:footer])
66
+ page_setup = {:fit_to_height => 1, :fit_to_width => 1, :orientation => :landscape, :paper_width => "210mm", :paper_height => "297mm", :scale => 80}
67
+ print_options = {:grid_lines => true, :headings => true, :horizontal_centered => true, :vertical_centered => true}
68
+ optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :page_setup => page_setup, :print_options => print_options, :selected => true, :show_gridlines => false)
69
+ page_margins.keys.each do |key|
70
+ assert_equal(page_margins[key], optioned.page_margins.send(key))
71
+ end
72
+ page_setup.keys.each do |key|
73
+ assert_equal(page_setup[key], optioned.page_setup.send(key))
74
+ end
75
+ print_options.keys.each do |key|
76
+ assert_equal(print_options[key], optioned.print_options.send(key))
77
+ end
43
78
  assert_equal(optioned.name, 'bob')
44
79
  assert_equal(optioned.selected, true)
45
80
  assert_equal(optioned.show_gridlines, false)
81
+
46
82
  end
47
83
 
48
84
 
@@ -77,7 +113,12 @@ class TestWorksheet < Test::Unit::TestCase
77
113
  def test_dimension
78
114
  @ws.add_row [1, 2, 3]
79
115
  @ws.add_row [4, 5, 6]
80
- assert_equal @ws.dimension, "A1:C2"
116
+ assert_equal @ws.dimension.sqref, "A1:C2"
117
+ end
118
+
119
+ def test_dimension_with_empty_row
120
+ @ws.add_row
121
+ assert_equal "A1:AA200", @ws.dimension.sqref
81
122
  end
82
123
 
83
124
  def test_referencing
@@ -107,7 +148,9 @@ class TestWorksheet < Test::Unit::TestCase
107
148
  end
108
149
 
109
150
  def test_drawing
110
- assert @ws.drawing.is_a? Axlsx::Drawing
151
+ assert @ws.drawing == nil
152
+ @ws.add_chart(Axlsx::Pie3DChart)
153
+ assert @ws.drawing.is_a?(Axlsx::Drawing)
111
154
  end
112
155
 
113
156
  def test_col_style
@@ -152,10 +195,16 @@ class TestWorksheet < Test::Unit::TestCase
152
195
  end
153
196
  assert_equal(@ws.rows[1].cells[0].style, 0)
154
197
  assert_equal(@ws.rows[2].cells[1].style, 0)
198
+ @ws.row_style( 1..2, 1, :col_offset => 2)
199
+ @ws.rows[(1..2)].each do |r|
200
+ r.cells[(2..-1)].each do |c|
201
+ assert_equal(c.style, 1)
202
+ end
203
+ end
155
204
  end
156
205
 
157
206
  def test_to_xml_string_fit_to_page
158
- @ws.fit_to_page = true
207
+ @ws.page_setup.fit_to_width = 1
159
208
  doc = Nokogiri::XML(@ws.to_xml_string)
160
209
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetPr/xmlns:pageSetUpPr[@fitToPage="true"]').size, 1)
161
210
  end
@@ -166,6 +215,11 @@ class TestWorksheet < Test::Unit::TestCase
166
215
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:dimension[@ref="A1:C1"]').size, 1)
167
216
  end
168
217
 
218
+ def test_fit_to_page_assignation_does_nothing
219
+ @ws.fit_to_page = true
220
+ assert_equal(@ws.fit_to_page?, false)
221
+ end
222
+
169
223
  def test_to_xml_string_selected
170
224
  @ws.selected = true
171
225
  doc = Nokogiri::XML(@ws.to_xml_string)
@@ -178,13 +232,6 @@ class TestWorksheet < Test::Unit::TestCase
178
232
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView[@showGridLines="false"]').size, 1)
179
233
  end
180
234
 
181
-
182
- def test_to_xml_string_show_selection
183
- doc = Nokogiri::XML(@ws.to_xml_string)
184
- assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView/xmlns:selection[@activeCell="A1"]').size, 1)
185
- assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView/xmlns:selection[@sqref="A1"]').size, 1)
186
- end
187
-
188
235
  def test_to_xml_string_auto_fit_data
189
236
  @ws.add_row [1, "two"]
190
237
  doc = Nokogiri::XML(@ws.to_xml_string)
@@ -207,8 +254,16 @@ class TestWorksheet < Test::Unit::TestCase
207
254
  def test_to_xml_string_merge_cells
208
255
  @ws.add_row [1, "two"]
209
256
  @ws.merge_cells "A1:D1"
257
+ @ws.merge_cells "E1:F1"
210
258
  doc = Nokogiri::XML(@ws.to_xml_string)
211
259
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:mergeCells/xmlns:mergeCell[@ref="A1:D1"]').size, 1)
260
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:mergeCells/xmlns:mergeCell[@ref="E1:F1"]').size, 1)
261
+ end
262
+
263
+ def test_to_xml_string_sheet_protection
264
+ @ws.sheet_protection.password = 'fish'
265
+ doc = Nokogiri::XML(@ws.to_xml_string)
266
+ assert(doc.xpath('//xmlns:sheetProtection'))
212
267
  end
213
268
 
214
269
  def test_to_xml_string_page_margins
@@ -220,8 +275,26 @@ class TestWorksheet < Test::Unit::TestCase
220
275
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:pageMargins[@left="9"][@right="7"]').size, 1)
221
276
  end
222
277
 
278
+ def test_to_xml_string_page_setup
279
+ @ws.page_setup do |ps|
280
+ ps.paper_width = "210mm"
281
+ ps.scale = 80
282
+ end
283
+ doc = Nokogiri::XML(@ws.to_xml_string)
284
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:pageSetup[@paperWidth="210mm"][@scale="80"]').size, 1)
285
+ end
286
+
287
+ def test_to_xml_string_print_options
288
+ @ws.print_options do |po|
289
+ po.grid_lines = true
290
+ po.horizontal_centered = true
291
+ end
292
+ doc = Nokogiri::XML(@ws.to_xml_string)
293
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:printOptions[@gridLines="true"][@horizontalCentered="true"]').size, 1)
294
+ end
295
+
223
296
  def test_to_xml_string_drawing
224
- c = @ws.add_chart Axlsx::Pie3DChart
297
+ @ws.add_chart Axlsx::Pie3DChart
225
298
  doc = Nokogiri::XML(@ws.to_xml_string)
226
299
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:drawing[@r:id="rId1"]').size, 1)
227
300
  end
@@ -235,58 +308,64 @@ class TestWorksheet < Test::Unit::TestCase
235
308
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:tableParts/xmlns:tablePart[@r:id="rId1"]').size, 1)
236
309
  end
237
310
 
238
- def test_abs_auto_filter
239
- @ws.add_row [1, "two", 3]
240
- @ws.auto_filter = "A1:C1"
241
- assert_equal(@ws.abs_auto_filter, "'Sheet1'!$A$1:$C$1")
242
- end
243
-
244
311
  def test_to_xml_string
245
312
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
246
313
  doc = Nokogiri::XML(@ws.to_xml_string)
247
- errors = []
248
- schema.validate(doc).each do |error|
249
- errors.push error
250
- puts error.message
251
- end
252
- assert(errors.empty?, "error free validation")
314
+ assert(schema.validate(doc).map{ |e| puts e.message; e }.empty?, "error free validation")
253
315
  end
254
316
 
255
- def test_valid_with_page_margins
317
+ def test_styles
318
+ assert(@ws.styles.is_a?(Axlsx::Styles), 'worksheet provides access to styles')
319
+ end
320
+
321
+ def test_to_xml_string_with_illegal_chars
322
+ nasties = "\v\u2028\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u001f"
323
+ @ws.add_row [nasties]
324
+ assert_equal(0, @ws.rows.last.cells.last.value.index("\v"))
325
+ assert_equal(nil,@ws.to_xml_string.index("\v"))
326
+ end
327
+ # Make sure the XML for all optional elements (like pageMargins, autoFilter, ...)
328
+ # is generated in correct order.
329
+ def test_valid_with_optional_elements
256
330
  @ws.page_margins.set :left => 9
331
+ @ws.page_setup.set :fit_to_width => 1
332
+ @ws.print_options.set :headings => true
333
+ @ws.auto_filter = "A1:C3"
334
+ @ws.merge_cells "A4:A5"
335
+ @ws.add_chart Axlsx::Pie3DChart
336
+ @ws.add_table "E1:F3"
257
337
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
258
338
  doc = Nokogiri::XML(@ws.to_xml_string)
259
- errors = []
260
- schema.validate(doc).each do |error|
261
- errors.push error
262
- puts error.message
263
- end
264
- assert(errors.empty?, "error free validation")
265
-
339
+ assert(schema.validate(doc).map { |e| puts e.message; e }.empty?, schema.validate(doc).map { |e| e.message }.join('\n'))
266
340
  end
267
341
 
268
342
  def test_relationships
343
+ @ws.add_row [1,2,3]
269
344
  assert(@ws.relationships.empty?, "No Drawing relationship until you add a chart")
270
345
  c = @ws.add_chart Axlsx::Pie3DChart
271
346
  assert_equal(@ws.relationships.size, 1, "adding a chart creates the relationship")
272
347
  c = @ws.add_chart Axlsx::Pie3DChart
273
348
  assert_equal(@ws.relationships.size, 1, "multiple charts still only result in one relationship")
349
+ c = @ws.add_comment :text => 'builder', :author => 'bob', :ref => @ws.rows.last.cells.last
350
+ assert_equal(@ws.relationships.size, 4, "adding a comment adds 3 relationships")
351
+ c = @ws.add_comment :text => 'not that is a comment!', :author => 'travis', :ref => "A1"
352
+ assert_equal(@ws.relationships.size, 4, "adding multiple comments in the same worksheet should not add any additional comment relationships")
274
353
  end
275
354
 
276
355
 
277
356
  def test_name_unique
278
- assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> @ws) }
357
+ assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> n) }
279
358
  end
280
359
 
281
360
  def test_name_size
282
- assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join('') }
283
- assert_nothing_raised { @ws.name = Array.new(31, "A").join('') }
361
+ assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join() }
362
+ assert_nothing_raised { @ws.name = Array.new(31, "A").join() }
284
363
  end
285
364
 
286
365
  def test_set_fixed_width_column
287
366
  @ws.add_row ["mule", "donkey", "horse"], :widths => [20, :ignore, nil]
288
367
  assert(@ws.column_info.size == 3, "a data item for each column")
289
- assert_equal(@ws.column_info[0].width, 20, "adding a row with fixed width updates :fixed attribute")
368
+ assert_equal(20, @ws.column_info[0].width, "adding a row with fixed width updates :fixed attribute")
290
369
  assert_equal(@ws.column_info[1].width, nil, ":ignore does not set any data")
291
370
  end
292
371
 
@@ -299,28 +378,46 @@ class TestWorksheet < Test::Unit::TestCase
299
378
  @ws.add_row ["chasing windmills", "penut"]
300
379
  @ws.column_widths nil, 0.5
301
380
  assert_equal(@ws.column_info[1].width, 0.5, 'eat my width')
302
- assert_raise(ArgumentError, 'reject invalid columns') { @ws.column_widths 2, 7, nil }
303
381
  assert_raise(ArgumentError, 'only accept unsigned ints') { @ws.column_widths 2, 7, -1 }
304
382
  assert_raise(ArgumentError, 'only accept Integer, Float or Fixnum') { @ws.column_widths 2, 7, "-1" }
305
383
  end
306
384
 
385
+ def test_protect_range
386
+ assert(@ws.send(:protected_ranges).is_a?(Axlsx::SimpleTypedList))
387
+ assert_equal(0, @ws.send(:protected_ranges).size)
388
+ @ws.protect_range('A1:A3')
389
+ assert_equal('A1:A3', @ws.send(:protected_ranges).last.sqref)
390
+ end
391
+
392
+ def test_protect_range_with_cells
393
+ @ws.add_row [1, 2, 3]
394
+ assert_nothing_raised {@ws.protect_range(@ws.rows.first.cells) }
395
+ assert_equal('A1:C1', @ws.send(:protected_ranges).last.sqref)
396
+
397
+ end
307
398
  def test_merge_cells
308
- assert(@ws.merged_cells.is_a?(Array))
309
- assert_equal(@ws.merged_cells.size, 0)
310
399
  @ws.add_row [1,2,3]
311
400
  @ws.add_row [4,5,6]
312
401
  @ws.add_row [7,8,9]
313
402
  @ws.merge_cells "A1:A2"
314
403
  @ws.merge_cells "B2:C3"
315
404
  @ws.merge_cells @ws.rows.last.cells[(0..1)]
316
- assert_equal(@ws.merged_cells.size, 3)
317
- assert_equal(@ws.merged_cells.last, "A3:B3")
405
+ assert_equal(@ws.send(:merged_cells).size, 3)
406
+ assert_equal(@ws.send(:merged_cells).last, "A3:B3")
318
407
  end
319
-
408
+
409
+ def test_merge_cells_sorts_correctly_by_row_when_given_array
410
+ 10.times do |i|
411
+ @ws.add_row [i]
412
+ end
413
+ @ws.merge_cells [@ws.rows[8].cells.first, @ws.rows[9].cells.first]
414
+ assert_equal "A9:A10", @ws.send(:merged_cells).first
415
+ end
416
+
320
417
  def test_auto_filter
321
- assert(@ws.auto_filter.nil?)
418
+ assert(@ws.auto_filter.range.nil?)
322
419
  assert_raise(ArgumentError) { @ws.auto_filter = 123 }
323
420
  @ws.auto_filter = "A1:D9"
324
- assert_equal(@ws.auto_filter, "A1:D9")
421
+ assert_equal(@ws.auto_filter.range, "A1:D9")
325
422
  end
326
423
  end