axlsx 1.1.5 → 1.1.6

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 (71) hide show
  1. data/README.md +26 -7
  2. data/Rakefile +2 -1
  3. data/examples/chart_colors.xlsx +0 -0
  4. data/examples/data_validation.rb +50 -0
  5. data/examples/example.xlsx +0 -0
  6. data/examples/example_streamed.xlsx +0 -0
  7. data/examples/examples_saved.xlsx +0 -0
  8. data/examples/fish.xlsx +0 -0
  9. data/examples/no-use_autowidth.xlsx +0 -0
  10. data/examples/pareto.rb +28 -0
  11. data/examples/pareto.xlsx +0 -0
  12. data/examples/pie_chart.rb +16 -0
  13. data/examples/pie_chart.xlsx +0 -0
  14. data/examples/pie_chart_saved.xlsx +0 -0
  15. data/examples/shared_strings_example.xlsx +0 -0
  16. data/examples/sheet_protection.rb +10 -0
  17. data/examples/sheet_protection.xlsx +0 -0
  18. data/examples/two_cell_anchor_image.rb +11 -0
  19. data/examples/two_cell_anchor_image.xlsx +0 -0
  20. data/examples/~$pie_chart_saved.xlsx +0 -0
  21. data/lib/axlsx.rb +7 -0
  22. data/lib/axlsx/content_type/default.rb +15 -9
  23. data/lib/axlsx/content_type/override.rb +10 -6
  24. data/lib/axlsx/doc_props/app.rb +152 -99
  25. data/lib/axlsx/drawing/axis.rb +30 -23
  26. data/lib/axlsx/drawing/bar_series.rb +1 -1
  27. data/lib/axlsx/drawing/drawing.rb +7 -2
  28. data/lib/axlsx/drawing/pic.rb +44 -4
  29. data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
  30. data/lib/axlsx/drawing/vml_shape.rb +2 -5
  31. data/lib/axlsx/rels/relationships.rb +1 -1
  32. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  33. data/lib/axlsx/util/simple_typed_list.rb +0 -13
  34. data/lib/axlsx/util/validators.rb +21 -0
  35. data/lib/axlsx/version.rb +1 -1
  36. data/lib/axlsx/workbook/workbook.rb +2 -0
  37. data/lib/axlsx/workbook/worksheet/cell.rb +3 -4
  38. data/lib/axlsx/workbook/worksheet/comment.rb +3 -9
  39. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  40. data/lib/axlsx/workbook/worksheet/page_setup.rb +17 -3
  41. data/lib/axlsx/workbook/worksheet/row.rb +34 -18
  42. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  43. data/lib/axlsx/workbook/worksheet/table.rb +2 -2
  44. data/lib/axlsx/workbook/worksheet/worksheet.rb +57 -22
  45. data/test/doc_props/tc_app.rb +31 -1
  46. data/test/drawing/tc_axis.rb +12 -2
  47. data/test/drawing/tc_chart.rb +21 -3
  48. data/test/drawing/tc_drawing.rb +6 -1
  49. data/test/drawing/tc_hyperlink.rb +0 -5
  50. data/test/drawing/tc_pic.rb +22 -2
  51. data/test/drawing/tc_scatter_chart.rb +6 -1
  52. data/test/drawing/tc_two_cell_anchor.rb +1 -2
  53. data/test/stylesheet/tc_styles.rb +3 -4
  54. data/test/stylesheet/tc_table_style.rb +8 -0
  55. data/test/stylesheet/tc_table_style_element.rb +10 -1
  56. data/test/tc_package.rb +43 -15
  57. data/test/util/tc_simple_typed_list.rb +13 -0
  58. data/test/util/tc_validators.rb +7 -7
  59. data/test/workbook/worksheet/table/tc_table.rb +3 -3
  60. data/test/workbook/worksheet/tc_cell.rb +15 -6
  61. data/test/workbook/worksheet/tc_col.rb +9 -0
  62. data/test/workbook/worksheet/tc_comment.rb +8 -7
  63. data/test/workbook/worksheet/tc_comments.rb +8 -1
  64. data/test/workbook/worksheet/tc_conditional_formatting.rb +44 -0
  65. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  66. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  67. data/test/workbook/worksheet/tc_page_setup.rb +22 -4
  68. data/test/workbook/worksheet/tc_row.rb +14 -2
  69. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  70. data/test/workbook/worksheet/tc_worksheet.rb +29 -4
  71. metadata +31 -10
@@ -3,8 +3,8 @@ require 'tc_helper.rb'
3
3
  class TestPageSetup < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
- p = Axlsx::Package.new
7
- ws = p.workbook.add_worksheet :name => "hmmm"
6
+ @p = Axlsx::Package.new
7
+ ws = @p.workbook.add_worksheet :name => "hmmm"
8
8
  @ps = ws.page_setup
9
9
  end
10
10
 
@@ -18,7 +18,14 @@ class TestPageSetup < Test::Unit::TestCase
18
18
  end
19
19
 
20
20
  def test_initialize_with_options
21
- optioned = Axlsx::PageSetup.new(:fit_to_height => 1, :fit_to_width => 2, :orientation => :landscape, :paper_height => "297mm", :paper_width => "210mm", :scale => 50)
21
+ page_setup = { :fit_to_height => 1,
22
+ :fit_to_width => 2,
23
+ :orientation => :landscape,
24
+ :paper_height => "297mm",
25
+ :paper_width => "210mm",
26
+ :scale => 50 }
27
+
28
+ optioned = @p.workbook.add_worksheet(:name => 'optioned', :page_setup => page_setup).page_setup
22
29
  assert_equal(1, optioned.fit_to_height)
23
30
  assert_equal(2, optioned.fit_to_width)
24
31
  assert_equal(:landscape, optioned.orientation)
@@ -99,5 +106,16 @@ class TestPageSetup < Test::Unit::TestCase
99
106
  assert_nothing_raised { @ps.scale = 99 }
100
107
  assert_equal(99, @ps.scale)
101
108
  end
102
-
109
+
110
+ def test_fit_to
111
+ fits = @ps.fit_to(:width => 1)
112
+ assert_equal([1, 9999], fits)
113
+ fits = @ps.fit_to :height => 1
114
+ assert_equal(fits, [9999,1])
115
+ fits = @ps.fit_to :height => 7, :width => 2
116
+ assert_equal(fits, [2, 7])
117
+ assert_raise(ArgumentError) { puts @ps.fit_to(:width => true)}
118
+
119
+
120
+ end
103
121
  end
@@ -39,7 +39,7 @@ class TestRow < Test::Unit::TestCase
39
39
 
40
40
  def test_add_cell_autowidth_info
41
41
  width = @ws.send :calculate_width, 'this is the cell of cells', @ws.workbook.styles.fonts.first.sz
42
- c = @row.add_cell("this is the cell of cells")
42
+ @row.add_cell("this is the cell of cells")
43
43
  assert_equal(@ws.column_info.last.width, width)
44
44
  end
45
45
 
@@ -66,6 +66,13 @@ class TestRow < Test::Unit::TestCase
66
66
  assert_equal(15, @row.height)
67
67
  end
68
68
 
69
+
70
+ def test_ph
71
+ assert_raise(ArgumentError) { @row.ph = -3 }
72
+ assert_nothing_raised { @row.ph = true }
73
+ assert_equal(true, @row.ph)
74
+ end
75
+
69
76
  def test_hidden
70
77
  assert_raise(ArgumentError) { @row.hidden = -3 }
71
78
  assert_nothing_raised { @row.hidden = true }
@@ -84,13 +91,18 @@ class TestRow < Test::Unit::TestCase
84
91
  assert_equal(2, @row.outlineLevel)
85
92
  end
86
93
 
87
- def test_to_xml_without_custom_height
94
+ def test_to_xml_without_custom_height
88
95
  doc = Nokogiri::XML.parse(@row.to_xml_string(0))
89
96
  assert_equal(0, doc.xpath(".//row[@ht]").size)
90
97
  assert_equal(0, doc.xpath(".//row[@customHeight]").size)
91
98
  end
92
99
 
93
100
  def test_to_xml_string
101
+ @row.height = 20
102
+ @row.s = 1
103
+ @row.outlineLevel = 2
104
+ @row.collapsed = true
105
+ @row.hidden = true
94
106
  r_s_xml = Nokogiri::XML(@row.to_xml_string(0, ''))
95
107
  assert_equal(r_s_xml.xpath(".//row[@r=1]").size, 1)
96
108
  end
@@ -0,0 +1,117 @@
1
+ # encoding: UTF-8
2
+ require 'tc_helper.rb'
3
+
4
+ # <xsd:complexType name="CT_SheetProtection">
5
+ # <xsd:attribute name="sheet" type="xsd:boolean" use="optional" default="false"/>
6
+ # <xsd:attribute name="objects" type="xsd:boolean" use="optional" default="false"/>
7
+ # <xsd:attribute name="scenarios" type="xsd:boolean" use="optional" default="false"/>
8
+ # <xsd:attribute name="formatCells" type="xsd:boolean" use="optional" default="true"/>
9
+ # <xsd:attribute name="formatColumns" type="xsd:boolean" use="optional" default="true"/>
10
+ # <xsd:attribute name="formatRows" type="xsd:boolean" use="optional" default="true"/>
11
+ # <xsd:attribute name="insertColumns" type="xsd:boolean" use="optional" default="true"/>
12
+ # <xsd:attribute name="insertRows" type="xsd:boolean" use="optional" default="true"/>
13
+ # <xsd:attribute name="insertHyperlinks" type="xsd:boolean" use="optional" default="true"/>
14
+ # <xsd:attribute name="deleteColumns" type="xsd:boolean" use="optional" default="true"/>
15
+ # <xsd:attribute name="deleteRows" type="xsd:boolean" use="optional" default="true"/>
16
+ # <xsd:attribute name="selectLockedCells" type="xsd:boolean" use="optional" default="false"/>
17
+ # <xsd:attribute name="sort" type="xsd:boolean" use="optional" default="true"/>
18
+ # <xsd:attribute name="autoFilter" type="xsd:boolean" use="optional" default="true"/>
19
+ # <xsd:attribute name="pivotTables" type="xsd:boolean" use="optional" default="true"/>
20
+ # <xsd:attribute name="selectUnlockedCells" type="xsd:boolean" use="optional" default="false"/>
21
+ # <xsd:attribute name="password" type="xsd:string" use="optional" default="nil"/>
22
+ # </xsd:complexType>
23
+
24
+ class TestSheetProtection < Test::Unit::TestCase
25
+ def setup
26
+ #inverse defaults
27
+ @boolean_options = { :sheet => false, :objects => true, :scenarios => true, :format_cells => false,
28
+ :format_columns => false, :format_rows => false, :insert_columns => false, :insert_rows => false,
29
+ :insert_hyperlinks => false, :delete_columns => false, :delete_rows => false, :select_locked_cells => true,
30
+ :sort => false, :auto_filter => false, :pivot_tables => false, :select_unlocked_cells => true }
31
+
32
+ @string_options = { :password => nil }
33
+
34
+ @options = @boolean_options.merge(@string_options)
35
+
36
+ @sp = Axlsx::SheetProtection.new(@options)
37
+ end
38
+
39
+ def test_initialize
40
+ sp = Axlsx::SheetProtection.new
41
+ @boolean_options.each do |key, value|
42
+ assert_equal(!value, sp.send(key.to_sym), "initialized default #{key} should be #{!value}")
43
+ assert_equal(value, @sp.send(key.to_sym), "initialized options #{key} should be #{value}")
44
+ end
45
+ end
46
+
47
+ def test_boolean_attribute_validation
48
+ @boolean_options.each do |key, value|
49
+ assert_raise(ArgumentError, "#{key} must be boolean") { @sp.send("#{key}=".to_sym, 'A') }
50
+ assert_nothing_raised { @sp.send("#{key}=".to_sym, true) }
51
+ assert_nothing_raised { @sp.send("#{key}=".to_sym, true) }
52
+ end
53
+ end
54
+
55
+ def test_to_xml_string
56
+ @sp.password = 'fish' # -> CA3F
57
+ doc = Nokogiri::XML(@sp.to_xml_string)
58
+ @options.each do |key, value|
59
+ assert(doc.xpath("//sheetProtection[@#{key.to_s.gsub(/_(.)/){ $1.upcase }}='#{value}']"))
60
+ end
61
+ end
62
+
63
+ end
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
@@ -180,10 +180,16 @@ class TestWorksheet < Test::Unit::TestCase
180
180
  end
181
181
  assert_equal(@ws.rows[1].cells[0].style, 0)
182
182
  assert_equal(@ws.rows[2].cells[1].style, 0)
183
+ @ws.row_style( 1..2, 1, :col_offset => 2)
184
+ @ws.rows[(1..2)].each do |r|
185
+ r.cells[(2..-1)].each do |c|
186
+ assert_equal(c.style, 1)
187
+ end
188
+ end
183
189
  end
184
190
 
185
191
  def test_to_xml_string_fit_to_page
186
- @ws.fit_to_page = true
192
+ @ws.page_setup.fit_to_width = 1
187
193
  doc = Nokogiri::XML(@ws.to_xml_string)
188
194
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetPr/xmlns:pageSetUpPr[@fitToPage="true"]').size, 1)
189
195
  end
@@ -194,6 +200,11 @@ class TestWorksheet < Test::Unit::TestCase
194
200
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:dimension[@ref="A1:C1"]').size, 1)
195
201
  end
196
202
 
203
+ def test_fit_to_page_assignation_does_nothing
204
+ @ws.fit_to_page = false
205
+ assert_equal(@ws.fit_to_page, false)
206
+ end
207
+
197
208
  def test_to_xml_string_selected
198
209
  @ws.selected = true
199
210
  doc = Nokogiri::XML(@ws.to_xml_string)
@@ -241,6 +252,12 @@ class TestWorksheet < Test::Unit::TestCase
241
252
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:mergeCells/xmlns:mergeCell[@ref="E1:F1"]').size, 1)
242
253
  end
243
254
 
255
+ def test_to_xml_string_sheet_protection
256
+ @ws.sheet_protection.password = 'fish'
257
+ doc = Nokogiri::XML(@ws.to_xml_string)
258
+ assert(doc.xpath('//sheetProtection'))
259
+ end
260
+
244
261
  def test_to_xml_string_page_margins
245
262
  @ws.page_margins do |pm|
246
263
  pm.left = 9
@@ -269,7 +286,7 @@ class TestWorksheet < Test::Unit::TestCase
269
286
  end
270
287
 
271
288
  def test_to_xml_string_drawing
272
- c = @ws.add_chart Axlsx::Pie3DChart
289
+ @ws.add_chart Axlsx::Pie3DChart
273
290
  doc = Nokogiri::XML(@ws.to_xml_string)
274
291
  assert_equal(doc.xpath('//xmlns:worksheet/xmlns:drawing[@r:id="rId1"]').size, 1)
275
292
  end
@@ -336,7 +353,7 @@ class TestWorksheet < Test::Unit::TestCase
336
353
 
337
354
 
338
355
  def test_name_unique
339
- assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> @ws) }
356
+ assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> n) }
340
357
  end
341
358
 
342
359
  def test_name_size
@@ -376,7 +393,15 @@ class TestWorksheet < Test::Unit::TestCase
376
393
  assert_equal(@ws.merged_cells.size, 3)
377
394
  assert_equal(@ws.merged_cells.last, "A3:B3")
378
395
  end
379
-
396
+
397
+ def test_merge_cells_sorts_correctly_by_row_when_given_array
398
+ 10.times do |i|
399
+ @ws.add_row [i]
400
+ end
401
+ @ws.merge_cells [@ws.rows[8].cells.first, @ws.rows[9].cells.first]
402
+ assert_equal "A9:A10", @ws.merged_cells.first
403
+ end
404
+
380
405
  def test_auto_filter
381
406
  assert(@ws.auto_filter.nil?)
382
407
  assert_raise(ArgumentError) { @ws.auto_filter = 123 }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: axlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-13 00:00:00.000000000 Z
12
+ date: 2012-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
16
- requirement: &2151818760 !ruby/object:Gem::Requirement
16
+ requirement: &2151817600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.4.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2151818760
24
+ version_requirements: *2151817600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rubyzip
27
- requirement: &2151817980 !ruby/object:Gem::Requirement
27
+ requirement: &2151816420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.9.5
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2151817980
35
+ version_requirements: *2151816420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &2151816780 !ruby/object:Gem::Requirement
38
+ requirement: &2151814900 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.8.7
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2151816780
46
+ version_requirements: *2151814900
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: cover_me
49
- requirement: &2151815800 !ruby/object:Gem::Requirement
49
+ requirement: &2151814060 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2151815800
57
+ version_requirements: *2151814060
58
58
  description: ! ' xlsx generation with charts, images, automated column width, customizable
59
59
  styles and full schema validation. Axlsx excels at helping you generate beautiful
60
60
  Office Open XML Spreadsheet documents without having to understand the entire ECMA
@@ -173,6 +173,7 @@ files:
173
173
  - lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb
174
174
  - lib/axlsx/workbook/worksheet/data_bar.rb
175
175
  - lib/axlsx/workbook/worksheet/data_bar.rb~
176
+ - lib/axlsx/workbook/worksheet/data_validation.rb
176
177
  - lib/axlsx/workbook/worksheet/date_time_converter.rb
177
178
  - lib/axlsx/workbook/worksheet/icon_set.rb
178
179
  - lib/axlsx/workbook/worksheet/icon_set.rb~
@@ -181,6 +182,7 @@ files:
181
182
  - lib/axlsx/workbook/worksheet/print_options.rb
182
183
  - lib/axlsx/workbook/worksheet/row.rb
183
184
  - lib/axlsx/workbook/worksheet/shared_strings_table.rb~
185
+ - lib/axlsx/workbook/worksheet/sheet_protection.rb
184
186
  - lib/axlsx/workbook/worksheet/table.rb
185
187
  - lib/axlsx/workbook/worksheet/table.rb~
186
188
  - lib/axlsx/workbook/worksheet/worksheet.rb
@@ -231,6 +233,7 @@ files:
231
233
  - examples/conditional_formatting/hitting_the_high_notes.rb
232
234
  - examples/conditional_formatting/scaled_colors.rb
233
235
  - examples/conditional_formatting/stop_and_go.rb
236
+ - examples/data_validation.rb
234
237
  - examples/doc/_index.html
235
238
  - examples/doc/class_list.html
236
239
  - examples/doc/css/common.css
@@ -247,13 +250,27 @@ files:
247
250
  - examples/example.rb
248
251
  - examples/example.xlsx
249
252
  - examples/example_streamed.xlsx
253
+ - examples/examples_saved.xlsx
250
254
  - examples/extractive.rb
255
+ - examples/fish.xlsx
251
256
  - examples/image1.gif
252
257
  - examples/image1.jpeg
253
258
  - examples/image1.jpg
254
259
  - examples/image1.png
260
+ - examples/no-use_autowidth.xlsx
261
+ - examples/pareto.rb
262
+ - examples/pareto.xlsx
263
+ - examples/pie_chart.rb
264
+ - examples/pie_chart.xlsx
265
+ - examples/pie_chart_saved.xlsx
255
266
  - examples/sample.png
267
+ - examples/shared_strings_example.xlsx
268
+ - examples/sheet_protection.rb
269
+ - examples/sheet_protection.xlsx
256
270
  - examples/skydrive/real_example.rb
271
+ - examples/two_cell_anchor_image.rb
272
+ - examples/two_cell_anchor_image.xlsx
273
+ - examples/~$pie_chart_saved.xlsx
257
274
  - LICENSE
258
275
  - README.md
259
276
  - Rakefile
@@ -348,6 +365,7 @@ files:
348
365
  - test/workbook/worksheet/tc_conditional_formatting.rb
349
366
  - test/workbook/worksheet/tc_data_bar.rb
350
367
  - test/workbook/worksheet/tc_data_bar.rb~
368
+ - test/workbook/worksheet/tc_data_validation.rb
351
369
  - test/workbook/worksheet/tc_date_time_converter.rb
352
370
  - test/workbook/worksheet/tc_icon_set.rb
353
371
  - test/workbook/worksheet/tc_icon_set.rb~
@@ -355,6 +373,7 @@ files:
355
373
  - test/workbook/worksheet/tc_page_setup.rb
356
374
  - test/workbook/worksheet/tc_print_options.rb
357
375
  - test/workbook/worksheet/tc_row.rb
376
+ - test/workbook/worksheet/tc_sheet_protection.rb
358
377
  - test/workbook/worksheet/tc_worksheet.rb
359
378
  homepage: https://github.com/randym/axlsx
360
379
  licenses: []
@@ -470,6 +489,7 @@ test_files:
470
489
  - test/workbook/worksheet/tc_conditional_formatting.rb
471
490
  - test/workbook/worksheet/tc_data_bar.rb
472
491
  - test/workbook/worksheet/tc_data_bar.rb~
492
+ - test/workbook/worksheet/tc_data_validation.rb
473
493
  - test/workbook/worksheet/tc_date_time_converter.rb
474
494
  - test/workbook/worksheet/tc_icon_set.rb
475
495
  - test/workbook/worksheet/tc_icon_set.rb~
@@ -477,5 +497,6 @@ test_files:
477
497
  - test/workbook/worksheet/tc_page_setup.rb
478
498
  - test/workbook/worksheet/tc_print_options.rb
479
499
  - test/workbook/worksheet/tc_row.rb
500
+ - test/workbook/worksheet/tc_sheet_protection.rb
480
501
  - test/workbook/worksheet/tc_worksheet.rb
481
502
  has_rdoc: axlsx