axlsx 1.2.0 → 2.0.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 (208) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +3 -2
  3. data/.yardopts_guide +19 -0
  4. data/CHANGELOG.md +64 -1
  5. data/README.md +105 -87
  6. data/Rakefile +0 -5
  7. data/examples/2010_comments.rb +17 -0
  8. data/examples/anchor_swapping.rb +28 -0
  9. data/examples/auto_filter.rb +16 -0
  10. data/examples/basic_charts.rb +4 -0
  11. data/examples/colored_links.rb +59 -0
  12. data/examples/conditional_formatting/example_conditional_formatting.rb +4 -2
  13. data/examples/example.rb +569 -258
  14. data/examples/ios_preview.rb +14 -0
  15. data/examples/page_setup.rb +11 -0
  16. data/examples/pivot_table.rb +39 -0
  17. data/examples/skydrive/real_example.rb +8 -8
  18. data/examples/styles.rb +66 -0
  19. data/examples/underline.rb +13 -0
  20. data/examples/wrap_text.rb +21 -0
  21. data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
  22. data/lib/axlsx/content_type/content_type.rb +1 -1
  23. data/lib/axlsx/content_type/default.rb +6 -37
  24. data/lib/axlsx/content_type/override.rb +6 -38
  25. data/lib/axlsx/doc_props/app.rb +10 -7
  26. data/lib/axlsx/doc_props/core.rb +6 -1
  27. data/lib/axlsx/drawing/axes.rb +61 -0
  28. data/lib/axlsx/drawing/axis.rb +20 -17
  29. data/lib/axlsx/drawing/bar_3D_chart.rb +31 -22
  30. data/lib/axlsx/drawing/cat_axis.rb +2 -10
  31. data/lib/axlsx/drawing/chart.rb +33 -6
  32. data/lib/axlsx/drawing/d_lbls.rb +21 -31
  33. data/lib/axlsx/drawing/drawing.rb +11 -17
  34. data/lib/axlsx/drawing/graphic_frame.rb +3 -3
  35. data/lib/axlsx/drawing/hyperlink.rb +42 -36
  36. data/lib/axlsx/drawing/line_3D_chart.rb +28 -70
  37. data/lib/axlsx/drawing/line_chart.rb +99 -0
  38. data/lib/axlsx/drawing/line_series.rb +20 -2
  39. data/lib/axlsx/drawing/marker.rb +38 -18
  40. data/lib/axlsx/drawing/num_data.rb +6 -6
  41. data/lib/axlsx/drawing/num_data_source.rb +17 -16
  42. data/lib/axlsx/drawing/one_cell_anchor.rb +28 -21
  43. data/lib/axlsx/drawing/pic.rb +43 -45
  44. data/lib/axlsx/drawing/picture_locking.rb +12 -44
  45. data/lib/axlsx/drawing/pie_3D_chart.rb +2 -1
  46. data/lib/axlsx/drawing/scaling.rb +13 -13
  47. data/lib/axlsx/drawing/scatter_chart.rb +32 -21
  48. data/lib/axlsx/drawing/ser_axis.rb +15 -16
  49. data/lib/axlsx/drawing/series.rb +3 -6
  50. data/lib/axlsx/drawing/str_data.rb +3 -3
  51. data/lib/axlsx/drawing/str_val.rb +7 -8
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +7 -27
  53. data/lib/axlsx/drawing/val_axis.rb +14 -13
  54. data/lib/axlsx/drawing/view_3D.rb +52 -38
  55. data/lib/axlsx/drawing/vml_shape.rb +20 -79
  56. data/lib/axlsx/package.rb +58 -28
  57. data/lib/axlsx/rels/relationship.rb +75 -9
  58. data/lib/axlsx/rels/relationships.rb +8 -1
  59. data/lib/axlsx/stylesheet/border.rb +29 -20
  60. data/lib/axlsx/stylesheet/border_pr.rb +5 -4
  61. data/lib/axlsx/stylesheet/cell_alignment.rb +55 -29
  62. data/lib/axlsx/stylesheet/cell_protection.rb +7 -4
  63. data/lib/axlsx/stylesheet/cell_style.rb +19 -14
  64. data/lib/axlsx/stylesheet/color.rb +20 -17
  65. data/lib/axlsx/stylesheet/dxf.rb +4 -4
  66. data/lib/axlsx/stylesheet/font.rb +22 -22
  67. data/lib/axlsx/stylesheet/gradient_fill.rb +45 -21
  68. data/lib/axlsx/stylesheet/num_fmt.rb +23 -14
  69. data/lib/axlsx/stylesheet/pattern_fill.rb +12 -21
  70. data/lib/axlsx/stylesheet/styles.rb +37 -22
  71. data/lib/axlsx/stylesheet/table_style.rb +17 -16
  72. data/lib/axlsx/stylesheet/table_style_element.rb +15 -11
  73. data/lib/axlsx/stylesheet/table_styles.rb +14 -11
  74. data/lib/axlsx/stylesheet/xf.rb +28 -26
  75. data/lib/axlsx/util/accessors.rb +64 -0
  76. data/lib/axlsx/util/constants.rb +127 -6
  77. data/lib/axlsx/util/options_parser.rb +15 -0
  78. data/lib/axlsx/util/serialized_attributes.rb +79 -0
  79. data/lib/axlsx/util/simple_typed_list.rb +50 -15
  80. data/lib/axlsx/util/validators.rb +51 -16
  81. data/lib/axlsx/version.rb +2 -2
  82. data/lib/axlsx/workbook/defined_name.rb +14 -59
  83. data/lib/axlsx/workbook/shared_strings_table.rb +13 -4
  84. data/lib/axlsx/workbook/workbook.rb +85 -6
  85. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  86. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
  87. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +246 -0
  88. data/lib/axlsx/workbook/worksheet/break.rb +37 -0
  89. data/lib/axlsx/workbook/worksheet/cell.rb +109 -107
  90. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
  91. data/lib/axlsx/workbook/worksheet/cfvo.rb +15 -15
  92. data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
  93. data/lib/axlsx/workbook/worksheet/col.rb +43 -29
  94. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
  95. data/lib/axlsx/workbook/worksheet/color_scale.rb +62 -28
  96. data/lib/axlsx/workbook/worksheet/comment.rb +28 -37
  97. data/lib/axlsx/workbook/worksheet/comments.rb +3 -3
  98. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +11 -11
  99. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +31 -27
  100. data/lib/axlsx/workbook/worksheet/data_bar.rb +75 -41
  101. data/lib/axlsx/workbook/worksheet/data_validation.rb +61 -62
  102. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +6 -5
  103. data/lib/axlsx/workbook/worksheet/dimension.rb +0 -1
  104. data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
  105. data/lib/axlsx/workbook/worksheet/icon_set.rb +20 -20
  106. data/lib/axlsx/workbook/worksheet/page_margins.rb +21 -19
  107. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
  108. data/lib/axlsx/workbook/worksheet/page_setup.rb +152 -23
  109. data/lib/axlsx/workbook/worksheet/pane.rb +48 -51
  110. data/lib/axlsx/workbook/worksheet/pivot_table.rb +273 -0
  111. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
  112. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  113. data/lib/axlsx/workbook/worksheet/print_options.rb +8 -30
  114. data/lib/axlsx/workbook/worksheet/protected_range.rb +16 -13
  115. data/lib/axlsx/workbook/worksheet/row.rb +59 -83
  116. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
  117. data/lib/axlsx/workbook/worksheet/selection.rb +30 -38
  118. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
  119. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  120. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +49 -4
  121. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +51 -155
  122. data/lib/axlsx/workbook/worksheet/sheet_view.rb +68 -234
  123. data/lib/axlsx/workbook/worksheet/table.rb +25 -19
  124. data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
  125. data/lib/axlsx/workbook/worksheet/tables.rb +1 -1
  126. data/lib/axlsx/workbook/worksheet/worksheet.rb +174 -35
  127. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -5
  128. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +4 -10
  129. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
  130. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  131. data/lib/axlsx.rb +55 -5
  132. data/lib/schema/sml.xsd +4 -0
  133. data/test/axlsx.qcachegrind +2226 -0
  134. data/test/benchmark.rb +2 -3
  135. data/test/content_type/tc_default.rb +0 -11
  136. data/test/content_type/tc_override.rb +0 -13
  137. data/test/doc_props/tc_core.rb +7 -0
  138. data/test/drawing/tc_axes.rb +8 -0
  139. data/test/drawing/tc_axis.rb +15 -17
  140. data/test/drawing/tc_bar_3D_chart.rb +6 -0
  141. data/test/drawing/tc_cat_axis.rb +9 -9
  142. data/test/drawing/tc_chart.rb +20 -0
  143. data/test/drawing/tc_d_lbls.rb +14 -4
  144. data/test/drawing/tc_drawing.rb +0 -5
  145. data/test/drawing/tc_graphic_frame.rb +5 -3
  146. data/test/drawing/tc_hyperlink.rb +0 -4
  147. data/test/drawing/tc_line_chart.rb +39 -0
  148. data/test/drawing/tc_line_series.rb +8 -2
  149. data/test/drawing/tc_pic.rb +14 -3
  150. data/test/drawing/tc_ser_axis.rb +13 -12
  151. data/test/drawing/tc_two_cell_anchor.rb +3 -3
  152. data/test/drawing/tc_val_axis.rb +6 -6
  153. data/test/drawing/tc_vml_shape.rb +9 -3
  154. data/test/profile.rb +11 -21
  155. data/test/rels/tc_relationship.rb +32 -9
  156. data/test/rels/tc_relationships.rb +12 -1
  157. data/test/stylesheet/tc_color.rb +6 -0
  158. data/test/stylesheet/tc_styles.rb +15 -2
  159. data/test/tc_axlsx.rb +35 -2
  160. data/test/tc_helper.rb +7 -1
  161. data/test/tc_package.rb +44 -5
  162. data/test/util/tc_serialized_attributes.rb +19 -0
  163. data/test/util/tc_validators.rb +26 -1
  164. data/test/workbook/tc_defined_name.rb +2 -2
  165. data/test/workbook/tc_shared_strings_table.rb +6 -0
  166. data/test/workbook/tc_workbook.rb +38 -1
  167. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  168. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  169. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  170. data/test/workbook/worksheet/tc_break.rb +49 -0
  171. data/test/workbook/worksheet/tc_cell.rb +40 -6
  172. data/test/workbook/worksheet/tc_col.rb +11 -1
  173. data/test/workbook/worksheet/tc_color_scale.rb +31 -2
  174. data/test/workbook/worksheet/tc_comment.rb +21 -6
  175. data/test/workbook/worksheet/tc_comments.rb +2 -2
  176. data/test/workbook/worksheet/tc_conditional_formatting.rb +7 -0
  177. data/test/workbook/worksheet/tc_data_bar.rb +7 -0
  178. data/test/workbook/worksheet/tc_date_time_converter.rb +3 -11
  179. data/test/workbook/worksheet/tc_header_footer.rb +151 -0
  180. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  181. data/test/workbook/worksheet/tc_page_setup.rb +6 -1
  182. data/test/workbook/worksheet/tc_pane.rb +5 -45
  183. data/test/workbook/worksheet/tc_pivot_table.rb +120 -0
  184. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
  185. data/test/workbook/worksheet/tc_row.rb +4 -4
  186. data/test/workbook/worksheet/tc_selection.rb +9 -48
  187. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  188. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  189. data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
  190. data/test/workbook/worksheet/tc_sheet_view.rb +39 -39
  191. data/test/workbook/worksheet/{table/tc_table.rb → tc_table.rb} +8 -3
  192. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  193. data/test/workbook/worksheet/tc_worksheet.rb +131 -16
  194. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
  195. metadata +97 -64
  196. data/examples/example.xlsx +0 -0
  197. data/examples/example_streamed.xlsx +0 -0
  198. data/examples/extractive.pdf +0 -0
  199. data/examples/image1.gif +0 -0
  200. data/examples/image1.jpg +0 -0
  201. data/examples/image1.png +0 -0
  202. data/examples/no-use_autowidth.xlsx +0 -0
  203. data/examples/sample.png +0 -0
  204. data/examples/scraping_html.rb +0 -91
  205. data/examples/shared_strings_example.xlsx +0 -0
  206. data/examples/sheet_view.rb +0 -34
  207. data/examples/two_cell_anchor_image.rb +0 -11
  208. data/lib/axlsx/workbook/worksheet/auto_filter.rb +0 -34
@@ -5,207 +5,207 @@ require 'tc_helper.rb'
5
5
  class TestSheetView < Test::Unit::TestCase
6
6
  def setup
7
7
  #inverse defaults for booleans
8
- @boolean_options = { :right_to_left => true, :show_formulas => true, :show_outline_symbols => true,
8
+ @boolean_options = { :right_to_left => true, :show_formulas => true, :show_outline_symbols => true,
9
9
  :show_white_space => true, :tab_selected => true, :default_grid_color => false, :show_grid_lines => false,
10
10
  :show_row_col_headers => false, :show_ruler => false, :show_zeros => false, :window_protection => true }
11
11
  @symbol_options = { :view => :page_break_preview }
12
12
  @nil_options = { :color_id => 2, :top_left_cell => 'A2' }
13
13
  @int_0 = { :zoom_scale_normal => 100, :zoom_scale_page_layout_view => 100, :zoom_scale_sheet_layout_view => 100, :workbook_view_id => 2 }
14
14
  @int_100 = { :zoom_scale => 10 }
15
-
15
+
16
16
  @integer_options = { :color_id => 2, :workbook_view_id => 2 }.merge(@int_0).merge(@int_100)
17
17
  @string_options = { :top_left_cell => 'A2' }
18
-
19
-
18
+
19
+
20
20
  @options = @boolean_options.merge(@boolean_options).merge(@symbol_options).merge(@nil_options).merge(@int_0).merge(@int_100)
21
-
21
+
22
22
  @sv = Axlsx::SheetView.new(@options)
23
23
  end
24
-
24
+
25
25
  def test_initialize
26
26
  sv = Axlsx::SheetView.new
27
-
27
+
28
28
  @boolean_options.each do |key, value|
29
29
  assert_equal(!value, sv.send(key.to_sym), "initialized default #{key} should be #{!value}")
30
30
  assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
31
31
  end
32
-
32
+
33
33
  @nil_options.each do |key, value|
34
34
  assert_equal(nil, sv.send(key.to_sym), "initialized default #{key} should be nil")
35
35
  assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
36
36
  end
37
-
37
+
38
38
  @int_0.each do |key, value|
39
39
  assert_equal(0, sv.send(key.to_sym), "initialized default #{key} should be 0")
40
40
  assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
41
41
  end
42
-
42
+
43
43
  @int_100.each do |key, value|
44
44
  assert_equal(100, sv.send(key.to_sym), "initialized default #{key} should be 100")
45
45
  assert_equal(value, @sv.send(key.to_sym), "initialized options #{key} should be #{value}")
46
46
  end
47
47
  end
48
-
48
+
49
49
  def test_boolean_attribute_validation
50
50
  @boolean_options.each do |key, value|
51
51
  assert_raise(ArgumentError, "#{key} must be boolean") { @sv.send("#{key}=".to_sym, 'A') }
52
52
  assert_nothing_raised { @sv.send("#{key}=".to_sym, true) }
53
53
  end
54
54
  end
55
-
55
+
56
56
  def test_string_attribute_validation
57
57
  @string_options.each do |key, value|
58
58
  assert_raise(ArgumentError, "#{key} must be string") { @sv.send("#{key}=".to_sym, :symbol) }
59
59
  assert_nothing_raised { @sv.send("#{key}=".to_sym, "foo") }
60
60
  end
61
61
  end
62
-
62
+
63
63
  def test_symbol_attribute_validation
64
64
  @symbol_options.each do |key, value|
65
65
  assert_raise(ArgumentError, "#{key} must be symbol") { @sv.send("#{key}=".to_sym, "foo") }
66
66
  assert_nothing_raised { @sv.send("#{key}=".to_sym, value) }
67
67
  end
68
68
  end
69
-
69
+
70
70
  def test_integer_attribute_validation
71
71
  @integer_options.each do |key, value|
72
72
  assert_raise(ArgumentError, "#{key} must be integer") { @sv.send("#{key}=".to_sym, "foo") }
73
73
  assert_nothing_raised { @sv.send("#{key}=".to_sym, value) }
74
74
  end
75
75
  end
76
-
76
+
77
77
  def test_color_id
78
78
  assert_raise(ArgumentError) { @sv.color_id = "10" }
79
79
  assert_nothing_raised { @sv.color_id = 2 }
80
80
  assert_equal(@sv.color_id, 2)
81
81
  end
82
-
82
+
83
83
  def test_default_grid_color
84
84
  assert_raise(ArgumentError) { @sv.default_grid_color = "foo" }
85
85
  assert_nothing_raised { @sv.default_grid_color = false }
86
86
  assert_equal(@sv.default_grid_color, false)
87
87
  end
88
-
88
+
89
89
  def test_right_to_left
90
90
  assert_raise(ArgumentError) { @sv.right_to_left = "foo´" }
91
91
  assert_nothing_raised { @sv.right_to_left = true }
92
92
  assert_equal(@sv.right_to_left, true)
93
93
  end
94
-
94
+
95
95
  def test_show_formulas
96
96
  assert_raise(ArgumentError) { @sv.show_formulas = 'foo' }
97
97
  assert_nothing_raised { @sv.show_formulas = false }
98
98
  assert_equal(@sv.show_formulas, false)
99
99
  end
100
-
100
+
101
101
  def test_show_grid_lines
102
102
  assert_raise(ArgumentError) { @sv.show_grid_lines = "foo" }
103
103
  assert_nothing_raised { @sv.show_grid_lines = false }
104
104
  assert_equal(@sv.show_grid_lines, false)
105
105
  end
106
-
106
+
107
107
  def test_show_outline_symbols
108
108
  assert_raise(ArgumentError) { @sv.show_outline_symbols = 'foo' }
109
109
  assert_nothing_raised { @sv.show_outline_symbols = false }
110
110
  assert_equal(@sv.show_outline_symbols, false)
111
111
  end
112
-
112
+
113
113
  def test_show_row_col_headers
114
114
  assert_raise(ArgumentError) { @sv.show_row_col_headers = "foo" }
115
115
  assert_nothing_raised { @sv.show_row_col_headers = false }
116
116
  assert_equal(@sv.show_row_col_headers, false)
117
117
  end
118
-
118
+
119
119
  def test_show_ruler
120
120
  assert_raise(ArgumentError) { @sv.show_ruler = 'foo' }
121
121
  assert_nothing_raised { @sv.show_ruler = false }
122
122
  assert_equal(@sv.show_ruler, false)
123
123
  end
124
-
124
+
125
125
  def test_show_white_space
126
126
  assert_raise(ArgumentError) { @sv.show_white_space = 'foo' }
127
127
  assert_nothing_raised { @sv.show_white_space = false }
128
128
  assert_equal(@sv.show_white_space, false)
129
129
  end
130
-
130
+
131
131
  def test_show_zeros
132
132
  assert_raise(ArgumentError) { @sv.show_zeros = "foo" }
133
133
  assert_nothing_raised { @sv.show_zeros = false }
134
134
  assert_equal(@sv.show_zeros, false)
135
135
  end
136
-
136
+
137
137
  def test_tab_selected
138
138
  assert_raise(ArgumentError) { @sv.tab_selected = "foo" }
139
139
  assert_nothing_raised { @sv.tab_selected = false }
140
140
  assert_equal(@sv.tab_selected, false)
141
141
  end
142
-
142
+
143
143
  def test_top_left_cell
144
144
  assert_raise(ArgumentError) { @sv.top_left_cell = :cell_adress }
145
145
  assert_nothing_raised { @sv.top_left_cell = "A2" }
146
146
  assert_equal(@sv.top_left_cell, "A2")
147
147
  end
148
-
148
+
149
149
  def test_view
150
150
  assert_raise(ArgumentError) { @sv.view = 'view' }
151
151
  assert_nothing_raised { @sv.view = :page_break_preview }
152
152
  assert_equal(@sv.view, :page_break_preview)
153
153
  end
154
-
154
+
155
155
  def test_window_protection
156
156
  assert_raise(ArgumentError) { @sv.window_protection = "foo" }
157
157
  assert_nothing_raised { @sv.window_protection = false }
158
158
  assert_equal(@sv.window_protection, false)
159
159
  end
160
-
160
+
161
161
  def test_workbook_view_id
162
162
  assert_raise(ArgumentError) { @sv.workbook_view_id = "1" }
163
163
  assert_nothing_raised { @sv.workbook_view_id = 1 }
164
164
  assert_equal(@sv.workbook_view_id, 1)
165
165
  end
166
-
166
+
167
167
  def test_zoom_scale
168
168
  assert_raise(ArgumentError) { @sv.zoom_scale = "50" }
169
169
  assert_nothing_raised { @sv.zoom_scale = 50 }
170
170
  assert_equal(@sv.zoom_scale, 50)
171
171
  end
172
-
172
+
173
173
  def test_zoom_scale_normal
174
174
  assert_raise(ArgumentError) { @sv.zoom_scale_normal = "50" }
175
175
  assert_nothing_raised { @sv.zoom_scale_normal = 50 }
176
176
  assert_equal(@sv.zoom_scale_normal, 50)
177
177
  end
178
-
178
+
179
179
  def test_zoom_scale_page_layout_view
180
180
  assert_raise(ArgumentError) { @sv.zoom_scale_page_layout_view = "50" }
181
181
  assert_nothing_raised { @sv.zoom_scale_page_layout_view = 50 }
182
182
  assert_equal(@sv.zoom_scale_page_layout_view, 50)
183
183
  end
184
-
184
+
185
185
  def test_zoom_scale_sheet_layout_view
186
186
  assert_raise(ArgumentError) { @sv.zoom_scale_sheet_layout_view = "50" }
187
187
  assert_nothing_raised { @sv.zoom_scale_sheet_layout_view = 50 }
188
188
  assert_equal(@sv.zoom_scale_sheet_layout_view, 50)
189
189
  end
190
-
190
+
191
191
  def test_to_xml
192
192
  p = Axlsx::Package.new
193
193
  @ws = p.workbook.add_worksheet :name => "sheetview"
194
194
  @ws.sheet_view do |vs|
195
195
  vs.view = :page_break_preview
196
196
  end
197
-
197
+
198
198
  doc = Nokogiri::XML.parse(@ws.sheet_view.to_xml_string)
199
-
199
+
200
200
  assert_equal(1, doc.xpath("//sheetView[@tabSelected='false']").size)
201
-
201
+
202
202
  assert_equal(1, doc.xpath("//sheetView[@tabSelected='false'][@showWhiteSpace='false'][@showOutlineSymbols='false'][@showFormulas='false']
203
203
  [@rightToLeft='false'][@windowProtection='false'][@showZeros='true'][@showRuler='true']
204
204
  [@showRowColHeaders='true'][@showGridLines='true'][@defaultGridColor='true']
205
205
  [@zoomScale='100'][@workbookViewId='0'][@zoomScaleSheetLayoutView='0'][@zoomScalePageLayoutView='0']
206
- [@zoomScaleNormal='0'][@view='page_break_preview']").size)
206
+ [@zoomScaleNormal='0'][@view='pageBreakPreview']").size)
207
207
  end
208
-
208
+
209
209
  def test_add_selection
210
210
  @sv.add_selection(:top_left, :active_cell => "A1")
211
211
  assert_equal('A1', @sv.selections[:top_left].active_cell)
@@ -15,6 +15,12 @@ class TestTable < Test::Unit::TestCase
15
15
 
16
16
  end
17
17
 
18
+ def test_table_style_info
19
+ table = @ws.add_table('A1:D5', :name => 'foo', :style_info => { :show_row_stripes => true, :name => "TableStyleMedium25" })
20
+ assert_equal('TableStyleMedium25', table.table_style_info.name)
21
+ assert_equal(true, table.table_style_info.show_row_stripes)
22
+ end
23
+
18
24
  def test_add_table
19
25
  name = "test"
20
26
  table = @ws.add_table("A1:D5", :name => name)
@@ -22,7 +28,6 @@ class TestTable < Test::Unit::TestCase
22
28
  assert_equal(@ws.workbook.tables.last, table, "must be added to workbook table collection")
23
29
  assert_equal(@ws.tables.last, table, "must be added to worksheet table collection")
24
30
  assert_equal(table.name, name, "options for name are applied")
25
-
26
31
  end
27
32
 
28
33
  def test_pn
@@ -31,8 +36,8 @@ class TestTable < Test::Unit::TestCase
31
36
  end
32
37
 
33
38
  def test_rId
34
- @ws.add_table("A1:D5")
35
- assert_equal(@ws.tables.first.rId, "rId1")
39
+ table = @ws.add_table("A1:D5")
40
+ assert_equal @ws.relationships.for(table).Id, table.rId
36
41
  end
37
42
 
38
43
  def test_index
@@ -0,0 +1,53 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestTableStyleInfo < Test::Unit::TestCase
4
+ def setup
5
+ p = Axlsx::Package.new
6
+ @ws = p.workbook.add_worksheet
7
+ 40.times do
8
+ @ws.add_row %w(aa bb cc dd ee ff gg hh ii jj kk)
9
+ end
10
+ @table = @ws.add_table(Axlsx::cell_range([@ws.rows.first.cells.first,@ws.rows.last.cells.last], false), :name => 'foo')
11
+ @options = { :show_first_column => 1,
12
+ :show_last_column => 1,
13
+ :show_row_stripes => 1,
14
+ :show_column_stripes => 1,
15
+ :name => "TableStyleDark4" }
16
+
17
+
18
+ end
19
+
20
+ def test_initialize
21
+ table_style = Axlsx::TableStyleInfo.new @options
22
+ @options.each do |key, value|
23
+ assert_equal(value, table_style.send(key.to_sym))
24
+ end
25
+ end
26
+
27
+ def test_boolean_properties
28
+ table_style = Axlsx::TableStyleInfo.new
29
+ @options.keys.each do |key|
30
+ assert_nothing_raised { table_style.send("#{key.to_sym}=", true) }
31
+ assert_raises(ArgumentError) { table_style.send(key.to_sym, 'foo') }
32
+ end
33
+ end
34
+ def doc
35
+ @doc ||= Nokogiri::XML(Axlsx::TableStyleInfo.new(@options).to_xml_string)
36
+ end
37
+
38
+ def test_to_xml_string_first_column
39
+ assert(doc.xpath('//tableStyleInfo[@showLastColumn=1]'))
40
+ end
41
+
42
+ def test_to_xml_string_row_stripes
43
+ assert(doc.xpath('//tableStyleInfo[@showRowStripes=1]'))
44
+ end
45
+
46
+ def test_to_xml_string_column_stripes
47
+ assert(doc.xpath('//tableStyleInfo[@showColumnStripes=1]'))
48
+ end
49
+
50
+ def test_to_xml_string_name
51
+ assert(doc.xpath("//tableStyleInfo[@name=#{@options[:name]}]"))
52
+ end
53
+ end
@@ -19,9 +19,16 @@ class TestWorksheet < Test::Unit::TestCase
19
19
  assert_equal(@ws.name, '&lt;foo&gt; &amp; &lt;bar&gt;')
20
20
  end
21
21
 
22
- def test_name_exception_on_colon
22
+ def test_name_exception_on_invalid_character
23
23
  assert_raises(ArgumentError) { @ws.name = 'foo:bar' }
24
+ assert_raises(ArgumentError) { @ws.name = 'foo[bar' }
25
+ assert_raises(ArgumentError) { @ws.name = 'foo]bar' }
26
+ assert_raises(ArgumentError) { @ws.name = 'foo*bar' }
27
+ assert_raises(ArgumentError) { @ws.name = 'foo/bar' }
28
+ assert_raises(ArgumentError) { @ws.name = 'foo\bar' }
29
+ assert_raises(ArgumentError) { @ws.name = 'foo?bar' }
24
30
  end
31
+
25
32
  def test_page_margins
26
33
  assert(@ws.page_margins.is_a? Axlsx::PageMargins)
27
34
  end
@@ -55,6 +62,17 @@ class TestWorksheet < Test::Unit::TestCase
55
62
  end
56
63
  end
57
64
 
65
+ def test_header_footer
66
+ assert(@ws.header_footer.is_a? Axlsx::HeaderFooter)
67
+ end
68
+
69
+ def test_header_footer_yield
70
+ @ws.header_footer do |hf|
71
+ assert(hf.is_a? Axlsx::HeaderFooter)
72
+ assert(@ws.header_footer == hf)
73
+ end
74
+ end
75
+
58
76
  def test_no_autowidth
59
77
  @ws.workbook.use_autowidth = false
60
78
  @ws.add_row [1,2,3,4]
@@ -65,7 +83,8 @@ class TestWorksheet < Test::Unit::TestCase
65
83
  page_margins = {:left => 2, :right => 2, :bottom => 2, :top => 2, :header => 2, :footer => 2}
66
84
  page_setup = {:fit_to_height => 1, :fit_to_width => 1, :orientation => :landscape, :paper_width => "210mm", :paper_height => "297mm", :scale => 80}
67
85
  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)
86
+ header_footer = {:different_first => false, :different_odd_even => false, :odd_header => 'Header'}
87
+ optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :page_setup => page_setup, :print_options => print_options, :header_footer => header_footer, :selected => true, :show_gridlines => false)
69
88
  page_margins.keys.each do |key|
70
89
  assert_equal(page_margins[key], optioned.page_margins.send(key))
71
90
  end
@@ -75,6 +94,9 @@ class TestWorksheet < Test::Unit::TestCase
75
94
  print_options.keys.each do |key|
76
95
  assert_equal(print_options[key], optioned.print_options.send(key))
77
96
  end
97
+ header_footer.keys.each do |key|
98
+ assert_equal(header_footer[key], optioned.header_footer.send(key))
99
+ end
78
100
  assert_equal(optioned.name, 'bob')
79
101
  assert_equal(optioned.selected, true)
80
102
  assert_equal(optioned.show_gridlines, false)
@@ -101,9 +123,7 @@ class TestWorksheet < Test::Unit::TestCase
101
123
  end
102
124
 
103
125
  def test_rId
104
- assert_equal(@ws.rId, "rId1")
105
- ws = @ws.workbook.add_worksheet
106
- assert_equal(ws.rId, "rId2")
126
+ assert_equal @ws.workbook.relationships.for(@ws).Id, @ws.rId
107
127
  end
108
128
 
109
129
  def test_index
@@ -147,12 +167,39 @@ class TestWorksheet < Test::Unit::TestCase
147
167
  assert_equal(@ws.workbook.charts.size, 1, "add_chart adds a chart to the workbook")
148
168
  end
149
169
 
170
+ def test_add_page_break_with_string_cell_ref
171
+ assert(@ws.row_breaks.empty?)
172
+ assert(@ws.col_breaks.empty?)
173
+ @ws.add_page_break("B1")
174
+ assert_equal(1, @ws.row_breaks.size)
175
+ assert_equal(1, @ws.col_breaks.size)
176
+ end
177
+
178
+ def test_add_page_break_with_cell
179
+ @ws.add_row [1, 2, 3, 4]
180
+ @ws.add_row [1, 2, 3, 4]
181
+
182
+
183
+ assert(@ws.row_breaks.empty?)
184
+ assert(@ws.col_breaks.empty?)
185
+ @ws.add_page_break(@ws.rows.last.cells[1])
186
+ assert_equal(1, @ws.row_breaks.size)
187
+ assert_equal(1, @ws.col_breaks.size)
188
+ end
189
+
190
+
150
191
  def test_drawing
151
192
  assert @ws.drawing == nil
152
193
  @ws.add_chart(Axlsx::Pie3DChart)
153
194
  assert @ws.drawing.is_a?(Axlsx::Drawing)
154
195
  end
155
196
 
197
+ def test_add_pivot_table
198
+ assert(@ws.workbook.pivot_tables.empty?, "the sheet's workbook should not have any pivot tables by default")
199
+ @ws.add_pivot_table 'G5:G6', 'A1:D:10'
200
+ assert_equal(@ws.workbook.pivot_tables.size, 1, "add_pivot_tables adds a pivot_table to the workbook")
201
+ end
202
+
156
203
  def test_col_style
157
204
  @ws.add_row [1,2,3,4]
158
205
  @ws.add_row [1,2,3,4]
@@ -177,13 +224,20 @@ class TestWorksheet < Test::Unit::TestCase
177
224
  def test_cols
178
225
  @ws.add_row [1,2,3,4]
179
226
  @ws.add_row [1,2,3,4]
180
- @ws.add_row [1,2,3,4]
227
+ @ws.add_row [1,2,3]
181
228
  @ws.add_row [1,2,3,4]
182
229
  c = @ws.cols[1]
183
230
  assert_equal(c.size, 4)
184
231
  assert_equal(c[0].value, 2)
185
232
  end
186
233
 
234
+ def test_cols_with_block
235
+ @ws.add_row [1,2,3]
236
+ @ws.add_row [1]
237
+ cols = @ws.cols {|row, column| :foo }
238
+ assert_equal(:foo, cols[1][1])
239
+ end
240
+
187
241
  def test_row_style
188
242
  @ws.add_row [1,2,3,4]
189
243
  @ws.add_row [1,2,3,4]
@@ -246,7 +300,7 @@ class TestWorksheet < Test::Unit::TestCase
246
300
 
247
301
  def test_to_xml_string_auto_filter
248
302
  @ws.add_row [1, "two"]
249
- @ws.auto_filter = "A1:B1"
303
+ @ws.auto_filter.range = "A1:B1"
250
304
  doc = Nokogiri::XML(@ws.to_xml_string)
251
305
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:autoFilter[@ref="A1:B1"]').size, 1)
252
306
  end
@@ -260,6 +314,12 @@ class TestWorksheet < Test::Unit::TestCase
260
314
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:mergeCells/xmlns:mergeCell[@ref="E1:F1"]').size, 1)
261
315
  end
262
316
 
317
+ def test_to_xml_string_row_breaks
318
+ @ws.add_page_break("A1")
319
+ doc = Nokogiri::XML(@ws.to_xml_string)
320
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:rowBreaks/xmlns:brk[@id="0"]').size, 1)
321
+ end
322
+
263
323
  def test_to_xml_string_sheet_protection
264
324
  @ws.sheet_protection.password = 'fish'
265
325
  doc = Nokogiri::XML(@ws.to_xml_string)
@@ -293,19 +353,29 @@ class TestWorksheet < Test::Unit::TestCase
293
353
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:printOptions[@gridLines="true"][@horizontalCentered="true"]').size, 1)
294
354
  end
295
355
 
356
+ def test_to_xml_string_header_footer
357
+ @ws.header_footer do |hf|
358
+ hf.different_first = false
359
+ hf.different_odd_even = false
360
+ hf.odd_header = 'Test Header'
361
+ end
362
+ doc = Nokogiri::XML(@ws.to_xml_string)
363
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:headerFooter[@differentFirst="false"][@differentOddEven="false"]').size, 1)
364
+ end
365
+
296
366
  def test_to_xml_string_drawing
297
367
  @ws.add_chart Axlsx::Pie3DChart
298
368
  doc = Nokogiri::XML(@ws.to_xml_string)
299
- assert_equal(doc.xpath('//xmlns:worksheet/xmlns:drawing[@r:id="rId1"]').size, 1)
369
+ assert_equal @ws.send(:worksheet_drawing).relationship.Id, doc.xpath('//xmlns:worksheet/xmlns:drawing').first["r:id"]
300
370
  end
301
371
 
302
372
  def test_to_xml_string_tables
303
373
  @ws.add_row ["one", "two"]
304
374
  @ws.add_row [1, 2]
305
- @ws.add_table "A1:B2"
375
+ table = @ws.add_table "A1:B2"
306
376
  doc = Nokogiri::XML(@ws.to_xml_string)
307
377
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:tableParts[@count="1"]').size, 1)
308
- assert_equal(doc.xpath('//xmlns:worksheet/xmlns:tableParts/xmlns:tablePart[@r:id="rId1"]').size, 1)
378
+ assert_equal table.rId, doc.xpath('//xmlns:worksheet/xmlns:tableParts/xmlns:tablePart').first["r:id"]
309
379
  end
310
380
 
311
381
  def test_to_xml_string
@@ -317,23 +387,31 @@ class TestWorksheet < Test::Unit::TestCase
317
387
  def test_styles
318
388
  assert(@ws.styles.is_a?(Axlsx::Styles), 'worksheet provides access to styles')
319
389
  end
320
-
390
+
321
391
  def test_to_xml_string_with_illegal_chars
322
392
  nasties = "\v\u2028\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u001f"
323
393
  @ws.add_row [nasties]
324
394
  assert_equal(0, @ws.rows.last.cells.last.value.index("\v"))
325
395
  assert_equal(nil,@ws.to_xml_string.index("\v"))
326
396
  end
397
+
398
+ def test_to_xml_string_with_newlines
399
+ cell_with_newline = "foo\n\r\nbar"
400
+ @ws.add_row [cell_with_newline]
401
+ assert_equal("foo\n\r\nbar", @ws.rows.last.cells.last.value)
402
+ assert_not_nil(@ws.to_xml_string.index("foo\n\r\nbar"))
403
+ end
327
404
  # Make sure the XML for all optional elements (like pageMargins, autoFilter, ...)
328
405
  # is generated in correct order.
329
406
  def test_valid_with_optional_elements
330
407
  @ws.page_margins.set :left => 9
331
408
  @ws.page_setup.set :fit_to_width => 1
332
409
  @ws.print_options.set :headings => true
333
- @ws.auto_filter = "A1:C3"
410
+ @ws.auto_filter.range = "A1:C3"
334
411
  @ws.merge_cells "A4:A5"
335
412
  @ws.add_chart Axlsx::Pie3DChart
336
413
  @ws.add_table "E1:F3"
414
+ @ws.add_pivot_table 'G5:G6', 'A1:D10'
337
415
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
338
416
  doc = Nokogiri::XML(@ws.to_xml_string)
339
417
  assert(schema.validate(doc).map { |e| puts e.message; e }.empty?, schema.validate(doc).map { |e| e.message }.join('\n'))
@@ -350,6 +428,8 @@ class TestWorksheet < Test::Unit::TestCase
350
428
  assert_equal(@ws.relationships.size, 4, "adding a comment adds 3 relationships")
351
429
  c = @ws.add_comment :text => 'not that is a comment!', :author => 'travis', :ref => "A1"
352
430
  assert_equal(@ws.relationships.size, 4, "adding multiple comments in the same worksheet should not add any additional comment relationships")
431
+ c = @ws.add_pivot_table 'G5:G6', 'A1:D10'
432
+ assert_equal(@ws.relationships.size, 5, "adding a pivot table adds 1 relationship")
353
433
  end
354
434
 
355
435
 
@@ -357,6 +437,11 @@ class TestWorksheet < Test::Unit::TestCase
357
437
  assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> n) }
358
438
  end
359
439
 
440
+ def test_name_unique_only_checks_other_worksheet_names
441
+ assert_nothing_raised { @ws.name = @ws.name }
442
+ assert_nothing_raised { Axlsx::Package.new.workbook.add_worksheet :name => 'Sheet1' }
443
+ end
444
+
360
445
  def test_name_size
361
446
  assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join() }
362
447
  assert_nothing_raised { @ws.name = Array.new(31, "A").join() }
@@ -393,7 +478,7 @@ class TestWorksheet < Test::Unit::TestCase
393
478
  @ws.add_row [1, 2, 3]
394
479
  assert_nothing_raised {@ws.protect_range(@ws.rows.first.cells) }
395
480
  assert_equal('A1:C1', @ws.send(:protected_ranges).last.sqref)
396
-
481
+
397
482
  end
398
483
  def test_merge_cells
399
484
  @ws.add_row [1,2,3]
@@ -405,7 +490,7 @@ class TestWorksheet < Test::Unit::TestCase
405
490
  assert_equal(@ws.send(:merged_cells).size, 3)
406
491
  assert_equal(@ws.send(:merged_cells).last, "A3:B3")
407
492
  end
408
-
493
+
409
494
  def test_merge_cells_sorts_correctly_by_row_when_given_array
410
495
  10.times do |i|
411
496
  @ws.add_row [i]
@@ -413,11 +498,41 @@ class TestWorksheet < Test::Unit::TestCase
413
498
  @ws.merge_cells [@ws.rows[8].cells.first, @ws.rows[9].cells.first]
414
499
  assert_equal "A9:A10", @ws.send(:merged_cells).first
415
500
  end
416
-
501
+
417
502
  def test_auto_filter
418
503
  assert(@ws.auto_filter.range.nil?)
419
504
  assert_raise(ArgumentError) { @ws.auto_filter = 123 }
420
- @ws.auto_filter = "A1:D9"
505
+ @ws.auto_filter.range = "A1:D9"
421
506
  assert_equal(@ws.auto_filter.range, "A1:D9")
422
507
  end
508
+
509
+ def test_sheet_pr_for_auto_filter
510
+ @ws.auto_filter.range = 'A1:D9'
511
+ @ws.auto_filter.add_column 0, :filters, :filter_items => [1]
512
+ doc = Nokogiri::XML(@ws.to_xml_string)
513
+ assert(doc.xpath('//sheetPr[@filterMode="true"]'))
514
+ end
515
+
516
+ def test_outline_level_rows
517
+ 3.times { @ws.add_row [1,2,3] }
518
+ @ws.outline_level_rows 0, 2
519
+ assert_equal(1, @ws.rows[0].outline_level)
520
+ assert_equal(true, @ws.rows[2].hidden)
521
+ assert_equal(true, @ws.sheet_view.show_outline_symbols)
522
+ end
523
+
524
+ def test_outline_level_columns
525
+ 3.times { @ws.add_row [1,2,3] }
526
+ @ws.outline_level_columns 0, 2
527
+ assert_equal(1, @ws.column_info[0].outline_level)
528
+ assert_equal(true, @ws.column_info[2].hidden)
529
+ assert_equal(true, @ws.sheet_view.show_outline_symbols)
530
+ end
531
+
532
+ def test_worksheet_does_not_get_added_to_workbook_on_initialize_failure
533
+ assert_equal(1, @wb.worksheets.size)
534
+ assert_raise(ArgumentError) { @wb.add_worksheet(:name => 'Sheet1') }
535
+ assert_equal(1, @wb.worksheets.size)
536
+ end
537
+
423
538
  end
@@ -0,0 +1,55 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestWorksheetHyperlink < Test::Unit::TestCase
4
+ def setup
5
+ p = Axlsx::Package.new
6
+ wb = p.workbook
7
+ @ws = wb.add_worksheet
8
+ @options = { :location => 'https://github.com/randym/axlsx?foo=1&bar=2', :tooltip => 'axlsx', :ref => 'A1', :display => 'AXSLX', :target => :internal }
9
+ @a = @ws.add_hyperlink @options
10
+ end
11
+
12
+ def test_initailize
13
+ assert_raise(ArgumentError) { Axlsx::WorksheetHyperlink.new }
14
+ end
15
+
16
+ def test_location
17
+ assert_equal(@options[:location], @a.location)
18
+ end
19
+
20
+ def test_tooltip
21
+ assert_equal(@options[:tooltip], @a.tooltip)
22
+ end
23
+
24
+ def test_target
25
+ assert_equal(@options[:target], @a.instance_values['target'])
26
+ end
27
+
28
+ def test_display
29
+ assert_equal(@options[:display], @a.display)
30
+ end
31
+ def test_ref
32
+ assert_equal(@options[:ref], @a.ref)
33
+ end
34
+
35
+ def test_to_xml_string_with_non_external
36
+ doc = Nokogiri::XML(@ws.to_xml_string)
37
+ assert_equal(doc.xpath("//xmlns:hyperlink[@ref='#{@a.ref}']").size, 1)
38
+ assert_equal(doc.xpath("//xmlns:hyperlink[@tooltip='#{@a.tooltip}']").size, 1)
39
+ assert_equal(doc.xpath("//xmlns:hyperlink[@location='#{@a.location}']").size, 1)
40
+ assert_equal(doc.xpath("//xmlns:hyperlink[@display='#{@a.display}']").size, 1)
41
+ assert_equal(doc.xpath("//xmlns:hyperlink[@r:id]").size, 0)
42
+ end
43
+
44
+ def test_to_xml_stirng_with_external
45
+ @a.target = :external
46
+ doc = Nokogiri::XML(@ws.to_xml_string)
47
+ assert_equal(doc.xpath("//xmlns:hyperlink[@ref='#{@a.ref}']").size, 1)
48
+ assert_equal(doc.xpath("//xmlns:hyperlink[@tooltip='#{@a.tooltip}']").size, 1)
49
+ assert_equal(doc.xpath("//xmlns:hyperlink[@display='#{@a.display}']").size, 1)
50
+ assert_equal(doc.xpath("//xmlns:hyperlink[@location='#{@a.location}']").size, 0)
51
+ assert_equal(doc.xpath("//xmlns:hyperlink[@r:id='#{@a.relationship.Id}']").size, 1)
52
+ end
53
+ end
54
+
55
+