caxlsx 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -215,7 +215,7 @@ module Axlsx
215
215
  # - scaling is not linear as font sizes increase
216
216
  def string_width(string, font_size)
217
217
  font_scale = font_size / 10.0
218
- string.count(Worksheet::THIN_CHARS) * font_scale
218
+ string.size * font_scale
219
219
  end
220
220
 
221
221
  # we scale the font size if bold style is applied to either the style font or
@@ -147,10 +147,11 @@ module Axlsx
147
147
  # @option options [Array, Integer] style
148
148
  def array_to_cells(values, options={})
149
149
  DataTypeValidator.validate :array_to_cells, Array, values
150
- types, style, formula_values = options.delete(:types), options.delete(:style), options.delete(:formula_values)
150
+ types, style, formula_values, escape_formulas = options.delete(:types), options.delete(:style), options.delete(:formula_values), options.delete(:escape_formulas)
151
151
  values.each_with_index do |value, index|
152
152
  options[:style] = style.is_a?(Array) ? style[index] : style if style
153
153
  options[:type] = types.is_a?(Array) ? types[index] : types if types
154
+ options[:escape_formulas] = escape_formulas.is_a?(Array) ? escape_formulas[index] : escape_formulas if escape_formulas
154
155
  options[:formula_value] = formula_values[index] if formula_values.is_a?(Array)
155
156
 
156
157
  self[index] = Cell.new(self, value, options)
@@ -5,9 +5,6 @@ module Axlsx
5
5
  class Worksheet
6
6
  include Axlsx::OptionsParser
7
7
  include Axlsx::SerializedAttributes
8
- # definition of characters which are less than the maximum width of 0-9 in the default font for use in String#count.
9
- # This is used for autowidth calculations
10
- THIN_CHARS = '^.acfijklrstxzFIJL()-'.freeze
11
8
 
12
9
  # Creates a new worksheet.
13
10
  # @note the recommended way to manage worksheets is Workbook#add_worksheet
@@ -390,6 +387,12 @@ module Axlsx
390
387
  # @example - use << alias
391
388
  # ws << [3, 4, 5], :types => [nil, :float]
392
389
  #
390
+ # @example - specify whether a row should escape formulas or not
391
+ # ws.add_row ['=IF(2+2=4,4,5)', 2, 3], :escape_formulas=>true
392
+ #
393
+ # @example - specify whether a certain cells in a row should escape formulas or not
394
+ # ws.add_row ['=IF(2+2=4,4,5)', '=IF(13+13=4,4,5)'], :escape_formulas=>[true, false]
395
+ #
393
396
  # @see Worksheet#column_widths
394
397
  # @return [Row]
395
398
  # @option options [Array] values
@@ -397,6 +400,10 @@ module Axlsx
397
400
  # @option options [Array, Integer] style
398
401
  # @option options [Array] widths each member of the widths array will affect how auto_fit behavies.
399
402
  # @option options [Float] height the row's height (in points)
403
+ # @option options [Array, Boolean] escape_formulas - Whether to treat a value starting with an equal
404
+ # sign as formula (default) or as simple string.
405
+ # Allowing user generated data to be interpreted as formulas can be dangerous
406
+ # (see https://www.owasp.org/index.php/CSV_Injection for details).
400
407
  def add_row(values=[], options={})
401
408
  row = Row.new(self, values, options)
402
409
  update_column_info row, options.delete(:widths)
@@ -656,7 +663,7 @@ module Axlsx
656
663
 
657
664
  def validate_sheet_name(name)
658
665
  DataTypeValidator.validate :worksheet_name, String, name
659
- raise ArgumentError, (ERR_SHEET_NAME_TOO_LONG % name) if name.size > 31
666
+ raise ArgumentError, (ERR_SHEET_NAME_TOO_LONG % name) if name.bytesize > 31
660
667
  raise ArgumentError, (ERR_SHEET_NAME_CHARACTER_FORBIDDEN % name) if '[]*/\?:'.chars.any? { |char| name.include? char }
661
668
  name = Axlsx::coder.encode(name)
662
669
  sheet_names = @workbook.worksheets.reject { |s| s == self }.map { |s| s.name }
@@ -30,4 +30,25 @@ class TestSeriesTitle < Test::Unit::TestCase
30
30
  assert(@title.text == "one")
31
31
  end
32
32
 
33
+ def test_to_xml_string_for_special_characters
34
+ @chart.add_series(title: @title, data: [3, 7], labels: ['A', 'B'])
35
+
36
+ @title.text = "&><'\""
37
+
38
+ doc = Nokogiri::XML(@chart.to_xml_string)
39
+ errors = doc.errors
40
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
41
+ end
42
+
43
+ def test_to_xml_string_for_special_characters_in_cell
44
+ @chart.add_series(title: @title, data: [3, 7], labels: ['A', 'B'])
45
+
46
+ cell = @row.cells.first
47
+ cell.value = "&><'\""
48
+ @title.cell = cell
49
+
50
+ doc = Nokogiri::XML(@chart.to_xml_string)
51
+ errors = doc.errors
52
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
53
+ end
33
54
  end
@@ -51,4 +51,20 @@ class TestTitle < Test::Unit::TestCase
51
51
  assert_equal(1, doc.xpath('//c:v[text()="one"]').size)
52
52
  end
53
53
 
54
+ def test_to_xml_string_for_special_characters
55
+ @chart.title.text = "&><'\""
56
+ doc = Nokogiri::XML(@chart.to_xml_string)
57
+ errors = doc.errors
58
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
59
+ end
60
+
61
+ def test_to_xml_string_for_special_characters_in_cell
62
+ cell = @row.cells.first
63
+ cell.value = "&><'\""
64
+
65
+ @chart.title.cell = cell
66
+ doc = Nokogiri::XML(@chart.to_xml_string)
67
+ errors = doc.errors
68
+ assert(errors.empty?, "invalid xml: #{errors.map(&:to_s).join(', ')}")
69
+ end
54
70
  end
@@ -62,11 +62,23 @@ class TestFont < Test::Unit::TestCase
62
62
  assert_equal(@item.i, true)
63
63
  end
64
64
 
65
- # def u=(v) Axlsx::validate_boolean v; @u = v end
65
+ # def u=(v) Axlsx::validate_cell_u v; @u = v end
66
66
  def test_u
67
67
  assert_raise(ArgumentError) { @item.u = -7 }
68
+ assert_nothing_raised { @item.u = :single }
69
+ assert_equal(@item.u, :single)
70
+ doc = Nokogiri::XML(@item.to_xml_string)
71
+ assert(doc.xpath('//u[@val="single"]'))
72
+ end
73
+
74
+ def test_u_backward_compatibility
75
+ # backward compatibility for true
68
76
  assert_nothing_raised { @item.u = true }
69
- assert_equal(@item.u, true)
77
+ assert_equal(@item.u, :single)
78
+
79
+ # backward compatibility for false
80
+ assert_nothing_raised { @item.u = false }
81
+ assert_equal(@item.u, :none)
70
82
  end
71
83
 
72
84
  # def strike=(v) Axlsx::validate_boolean v; @strike = v end
@@ -124,7 +124,7 @@ class TestStyles < Test::Unit::TestCase
124
124
  :sz => 20,
125
125
  :b => 1,
126
126
  :i => 1,
127
- :u => 1,
127
+ :u => :single,
128
128
  :strike => 1,
129
129
  :outline => 1,
130
130
  :shadow => 1,
@@ -232,4 +232,30 @@ class TestStyles < Test::Unit::TestCase
232
232
  style = @styles.add_style :bg_color=>"FF000000", :fg_color=>"FFFFFFFF", :sz=>13, :alignment=>{:horizontal=>:left}, :border=>{:style => :thin, :color => "FFFF0000"}, :hidden=>true, :locked=>true, :type => :dxf
233
233
  assert_equal(1, style, "returns the second dxfId")
234
234
  end
235
+
236
+ def test_valid_document_with_font_options
237
+ font_options = {
238
+ :fg_color => "FF050505",
239
+ :sz => 20,
240
+ :b => 1,
241
+ :i => 1,
242
+ :u => :single,
243
+ :strike => 1,
244
+ :outline => 1,
245
+ :shadow => 1,
246
+ :charset => 9,
247
+ :family => 1,
248
+ :font_name => "woot font"
249
+ }
250
+ @styles.add_style font_options
251
+
252
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
253
+ doc = Nokogiri::XML(@styles.to_xml_string)
254
+ errors = []
255
+ schema.validate(doc).each do |error|
256
+ errors.push error
257
+ puts error.message
258
+ end
259
+ assert(errors.size == 0)
260
+ end
235
261
  end
@@ -24,8 +24,14 @@ class TestAxlsx < Test::Unit::TestCase
24
24
 
25
25
 
26
26
  def test_trust_input_can_be_set_to_true
27
+ # Class variables like this are not reset between test runs, so we have
28
+ # to save and restore the original value manually.
29
+ old = Axlsx.trust_input
30
+
27
31
  Axlsx.trust_input = true
28
32
  assert_equal true, Axlsx.trust_input
33
+
34
+ Axlsx.trust_input = old
29
35
  end
30
36
  def test_cell_range_relative
31
37
  p = Axlsx::Package.new
@@ -8,7 +8,7 @@ class TestCell < Test::Unit::TestCase
8
8
  @ws = p.workbook.add_worksheet :name=>"hmmm"
9
9
  p.workbook.styles.add_style :sz=>20
10
10
  @row = @ws.add_row
11
- @c = @row.add_cell 1, :type=>:float, :style=>1
11
+ @c = @row.add_cell 1, :type=>:float, :style=>1, :escape_formulas=>true
12
12
  data = (0..26).map { |index| index }
13
13
  @ws.add_row data
14
14
  @cAA = @ws["AA2"]
@@ -19,6 +19,7 @@ class TestCell < Test::Unit::TestCase
19
19
  assert_equal(@c.type, :float, "type option is applied")
20
20
  assert_equal(@c.style, 1, "style option is applied")
21
21
  assert_equal(@c.value, 1.0, "type option is applied and value is casted")
22
+ assert_equal(@c.escape_formulas, true, "escape formulas option is applied")
22
23
  end
23
24
 
24
25
  def test_style_date_data
@@ -60,7 +61,7 @@ class TestCell < Test::Unit::TestCase
60
61
  def test_autowidth
61
62
  style = @c.row.worksheet.workbook.styles.add_style({:alignment => {:horizontal => :center, :vertical => :center, :wrap_text => true}} )
62
63
  @c.style = style
63
- assert_equal(@c.autowidth, 5.5)
64
+ assert_in_delta(6.6, @c.autowidth, 0.01)
64
65
  end
65
66
 
66
67
  def test_time
@@ -321,6 +322,33 @@ class TestCell < Test::Unit::TestCase
321
322
  assert(doc.xpath("//f[text()='IF(2+2=4,4,5)']").any?)
322
323
  end
323
324
 
325
+ def test_to_xml_string_formula_escaped
326
+ p = Axlsx::Package.new
327
+ ws = p.workbook.add_worksheet do |sheet|
328
+ sheet.add_row ["=IF(2+2=4,4,5)"], escape_formulas: true
329
+ end
330
+ doc = Nokogiri::XML(ws.to_xml_string)
331
+ doc.remove_namespaces!
332
+ assert(doc.xpath("//t[text()='=IF(2+2=4,4,5)']").any?)
333
+ end
334
+
335
+ def test_to_xml_string_formula_escape_array_parameter
336
+ p = Axlsx::Package.new
337
+ ws = p.workbook.add_worksheet do |sheet|
338
+ sheet.add_row [
339
+ "=IF(2+2=4,4,5)",
340
+ "=IF(13+13=4,4,5)",
341
+ "=IF(99+99=4,4,5)"
342
+ ], escape_formulas: [true, false, true]
343
+ end
344
+ doc = Nokogiri::XML(ws.to_xml_string)
345
+ doc.remove_namespaces!
346
+
347
+ assert(doc.xpath("//t[text()='=IF(2+2=4,4,5)']").any?)
348
+ assert(doc.xpath("//f[text()='IF(13+13=4,4,5)']").any?)
349
+ assert(doc.xpath("//t[text()='=IF(99+99=4,4,5)']").any?)
350
+ end
351
+
324
352
  def test_to_xml_string_array_formula
325
353
  p = Axlsx::Package.new
326
354
  ws = p.workbook.add_worksheet do |sheet|
@@ -7,7 +7,7 @@ class TestCol < Test::Unit::TestCase
7
7
  end
8
8
 
9
9
  def test_initialize
10
- options = { :width => 12, :collapsed => true, :hidden => true, :outline_level => 1, :phonetic => true, :style => 1}
10
+ options = { :width => 12, :collapsed => true, :hidden => true, :outline_level => 1, :phonetic => true, :style => 1}
11
11
 
12
12
  col = Axlsx::Col.new 0, 0, options
13
13
  options.each{ |key, value| assert_equal(col.send(key.to_sym), value) }
@@ -39,6 +39,21 @@ class TestCol < Test::Unit::TestCase
39
39
  assert_equal(@col.customWidth, true, 'customWidth is true when width is set')
40
40
  end
41
41
 
42
+ def test_widthUnderLimit
43
+ @col.width = 3
44
+ assert_equal(@col.width, 3, 'width is set to exact value')
45
+ end
46
+
47
+ def test_widthOverLimit
48
+ @col.width = 31337
49
+ assert_equal(@col.width, 255, 'width is set to maximum allowed value')
50
+ end
51
+
52
+ def test_widthSetToNil
53
+ @col.width = nil
54
+ assert_equal(@col.width, nil, 'width is set to unspecified value')
55
+ end
56
+
42
57
  def test_hidden
43
58
  assert_equal(@col.hidden, nil)
44
59
  assert_raise(ArgumentError, 'hidden must be boolean(ish)') { @col.hidden = 'bob' }
@@ -148,8 +148,9 @@ class RichTextRun < Test::Unit::TestCase
148
148
  @ws.add_row [rt], :style => wrap
149
149
  ar = [0]
150
150
  awtr.autowidth(ar)
151
- assert_equal(ar.length, 2)
152
- assert_equal(ar.last, 0)
151
+ assert_equal(2, ar.length)
152
+ assert_equal(13.2, ar[0])
153
+ assert_equal(0, ar[1])
153
154
  end
154
155
 
155
156
  def test_to_xml
@@ -60,6 +60,23 @@ class TestRow < Test::Unit::TestCase
60
60
 
61
61
  end
62
62
 
63
+ def test_array_to_cells_with_escape_formulas
64
+ row = ['=HYPERLINK("http://www.example.com", "CSV Payload")', '=Bar']
65
+ @ws.add_row row, escape_formulas: true
66
+
67
+ assert_equal @ws.rows.last.cells[0].escape_formulas, true
68
+ assert_equal @ws.rows.last.cells[1].escape_formulas, true
69
+ end
70
+
71
+ def test_array_to_cells_with_escape_formulas_as_an_array
72
+ row = ['=HYPERLINK("http://www.example.com", "CSV Payload")', '+Foo', '-Bar']
73
+ @ws.add_row row, escape_formulas: [true, false, true]
74
+
75
+ assert_equal @ws.rows.last.cells.first.escape_formulas, true
76
+ assert_equal @ws.rows.last.cells[1].escape_formulas, false
77
+ assert_equal @ws.rows.last.cells[2].escape_formulas, true
78
+ end
79
+
63
80
  def test_custom_height
64
81
  @row.height = 20
65
82
  assert(@row.custom_height)
@@ -29,6 +29,17 @@ class TestWorksheet < Test::Unit::TestCase
29
29
  assert_raises(ArgumentError) { @ws.name = 'foo?bar' }
30
30
  end
31
31
 
32
+ def test_exception_if_name_too_long
33
+ assert_nothing_raised { @ws.name = 'x' * 31 }
34
+ assert_raises(ArgumentError) { @ws.name = 'x' * 32 }
35
+ end
36
+
37
+ def test_exception_if_name_too_long_because_of_multibyte_characters
38
+ three_byte_character = "✔"
39
+ assert_nothing_raised { @ws.name = 'x' * 28 + three_byte_character}
40
+ assert_raises(ArgumentError) { @ws.name = 'x' * 29 + three_byte_character }
41
+ end
42
+
32
43
  def test_page_margins
33
44
  assert(@ws.page_margins.is_a? Axlsx::PageMargins)
34
45
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caxlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Randy Morgan
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-10-04 00:00:00.000000000 Z
12
+ date: 2020-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -252,7 +252,6 @@ files:
252
252
  - lib/axlsx/util/constants.rb
253
253
  - lib/axlsx/util/mime_type_utils.rb
254
254
  - lib/axlsx/util/options_parser.rb
255
- - lib/axlsx/util/parser.rb
256
255
  - lib/axlsx/util/serialized_attributes.rb
257
256
  - lib/axlsx/util/simple_typed_list.rb
258
257
  - lib/axlsx/util/storage.rb
@@ -493,127 +492,128 @@ required_rubygems_version: !ruby/object:Gem::Requirement
493
492
  - !ruby/object:Gem::Version
494
493
  version: '0'
495
494
  requirements: []
496
- rubygems_version: 3.0.4
495
+ rubyforge_project:
496
+ rubygems_version: 2.6.12
497
497
  signing_key:
498
498
  specification_version: 4
499
499
  summary: Excel OOXML (xlsx) with charts, styles, images and autowidth columns.
500
500
  test_files:
501
- - test/drawing/tc_num_data.rb
502
- - test/drawing/tc_two_cell_anchor.rb
503
- - test/drawing/tc_view_3D.rb
504
- - test/drawing/tc_series_title.rb
505
- - test/drawing/tc_cat_axis.rb
506
- - test/drawing/tc_chart.rb
507
- - test/drawing/tc_num_val.rb
501
+ - test/benchmark.rb
502
+ - test/content_type/tc_content_type.rb
503
+ - test/content_type/tc_default.rb
504
+ - test/content_type/tc_override.rb
505
+ - test/doc_props/tc_app.rb
506
+ - test/doc_props/tc_core.rb
507
+ - test/drawing/tc_area_chart.rb
508
+ - test/drawing/tc_area_series.rb
509
+ - test/drawing/tc_axes.rb
508
510
  - test/drawing/tc_axis.rb
509
- - test/drawing/tc_line_chart.rb
510
- - test/drawing/tc_marker.rb
511
+ - test/drawing/tc_bar_3D_chart.rb
512
+ - test/drawing/tc_bar_chart.rb
513
+ - test/drawing/tc_bar_series.rb
514
+ - test/drawing/tc_bubble_chart.rb
511
515
  - test/drawing/tc_bubble_series.rb
516
+ - test/drawing/tc_cat_axis.rb
517
+ - test/drawing/tc_cat_axis_data.rb
518
+ - test/drawing/tc_chart.rb
512
519
  - test/drawing/tc_d_lbls.rb
513
- - test/drawing/tc_str_val.rb
514
- - test/drawing/tc_bar_chart.rb
520
+ - test/drawing/tc_data_source.rb
521
+ - test/drawing/tc_drawing.rb
522
+ - test/drawing/tc_graphic_frame.rb
523
+ - test/drawing/tc_hyperlink.rb
515
524
  - test/drawing/tc_line_3d_chart.rb
516
- - test/drawing/tc_cat_axis_data.rb
517
- - test/drawing/tc_area_chart.rb
525
+ - test/drawing/tc_line_chart.rb
518
526
  - test/drawing/tc_line_series.rb
519
- - test/drawing/tc_scatter_series.rb
520
- - test/drawing/tc_bar_series.rb
521
- - test/drawing/tc_hyperlink.rb
522
- - test/drawing/tc_pic.rb
527
+ - test/drawing/tc_marker.rb
523
528
  - test/drawing/tc_named_axis_data.rb
524
- - test/drawing/tc_bubble_chart.rb
525
- - test/drawing/tc_str_data.rb
526
- - test/drawing/tc_drawing.rb
529
+ - test/drawing/tc_num_data.rb
530
+ - test/drawing/tc_num_val.rb
531
+ - test/drawing/tc_one_cell_anchor.rb
532
+ - test/drawing/tc_pic.rb
533
+ - test/drawing/tc_picture_locking.rb
534
+ - test/drawing/tc_pie_3D_chart.rb
535
+ - test/drawing/tc_pie_series.rb
536
+ - test/drawing/tc_scaling.rb
527
537
  - test/drawing/tc_scatter_chart.rb
538
+ - test/drawing/tc_scatter_series.rb
539
+ - test/drawing/tc_ser_axis.rb
528
540
  - test/drawing/tc_series.rb
541
+ - test/drawing/tc_series_title.rb
542
+ - test/drawing/tc_str_data.rb
543
+ - test/drawing/tc_str_val.rb
529
544
  - test/drawing/tc_title.rb
530
- - test/drawing/tc_ser_axis.rb
531
- - test/drawing/tc_picture_locking.rb
532
- - test/drawing/tc_pie_series.rb
533
- - test/drawing/tc_vml_shape.rb
534
- - test/drawing/tc_axes.rb
535
- - test/drawing/tc_vml_drawing.rb
536
- - test/drawing/tc_pie_3D_chart.rb
537
- - test/drawing/tc_area_series.rb
538
- - test/drawing/tc_graphic_frame.rb
539
- - test/drawing/tc_one_cell_anchor.rb
540
- - test/drawing/tc_data_source.rb
545
+ - test/drawing/tc_two_cell_anchor.rb
541
546
  - test/drawing/tc_val_axis.rb
542
- - test/drawing/tc_scaling.rb
543
- - test/drawing/tc_bar_3D_chart.rb
544
- - test/util/tc_simple_typed_list.rb
545
- - test/util/tc_mime_type_utils.rb
546
- - test/util/tc_validators.rb
547
- - test/util/tc_serialized_attributes.rb
548
- - test/tc_axlsx.rb
549
- - test/stylesheet/tc_fill.rb
547
+ - test/drawing/tc_view_3D.rb
548
+ - test/drawing/tc_vml_drawing.rb
549
+ - test/drawing/tc_vml_shape.rb
550
+ - test/profile.rb
551
+ - test/rels/tc_relationship.rb
552
+ - test/rels/tc_relationships.rb
550
553
  - test/stylesheet/tc_border.rb
551
- - test/stylesheet/tc_gradient_stop.rb
552
- - test/stylesheet/tc_gradient_fill.rb
553
- - test/stylesheet/tc_table_style.rb
554
- - test/stylesheet/tc_font.rb
555
- - test/stylesheet/tc_pattern_fill.rb
556
- - test/stylesheet/tc_color.rb
557
- - test/stylesheet/tc_num_fmt.rb
558
- - test/stylesheet/tc_styles.rb
559
554
  - test/stylesheet/tc_border_pr.rb
555
+ - test/stylesheet/tc_cell_alignment.rb
560
556
  - test/stylesheet/tc_cell_protection.rb
561
- - test/stylesheet/tc_xf.rb
562
557
  - test/stylesheet/tc_cell_style.rb
563
- - test/stylesheet/tc_table_styles.rb
558
+ - test/stylesheet/tc_color.rb
564
559
  - test/stylesheet/tc_dxf.rb
560
+ - test/stylesheet/tc_fill.rb
561
+ - test/stylesheet/tc_font.rb
562
+ - test/stylesheet/tc_gradient_fill.rb
563
+ - test/stylesheet/tc_gradient_stop.rb
564
+ - test/stylesheet/tc_num_fmt.rb
565
+ - test/stylesheet/tc_pattern_fill.rb
566
+ - test/stylesheet/tc_styles.rb
567
+ - test/stylesheet/tc_table_style.rb
565
568
  - test/stylesheet/tc_table_style_element.rb
566
- - test/stylesheet/tc_cell_alignment.rb
569
+ - test/stylesheet/tc_table_styles.rb
570
+ - test/stylesheet/tc_xf.rb
571
+ - test/tc_axlsx.rb
567
572
  - test/tc_helper.rb
568
- - test/doc_props/tc_core.rb
569
- - test/doc_props/tc_app.rb
570
- - test/content_type/tc_override.rb
571
- - test/content_type/tc_content_type.rb
572
- - test/content_type/tc_default.rb
573
- - test/rels/tc_relationship.rb
574
- - test/rels/tc_relationships.rb
575
- - test/profile.rb
576
- - test/benchmark.rb
577
573
  - test/tc_package.rb
578
- - test/workbook/tc_workbook_view.rb
574
+ - test/util/tc_mime_type_utils.rb
575
+ - test/util/tc_serialized_attributes.rb
576
+ - test/util/tc_simple_typed_list.rb
577
+ - test/util/tc_validators.rb
579
578
  - test/workbook/tc_defined_name.rb
579
+ - test/workbook/tc_shared_strings_table.rb
580
+ - test/workbook/tc_workbook.rb
581
+ - test/workbook/tc_workbook_view.rb
582
+ - test/workbook/worksheet/auto_filter/tc_auto_filter.rb
583
+ - test/workbook/worksheet/auto_filter/tc_filter_column.rb
584
+ - test/workbook/worksheet/auto_filter/tc_filters.rb
585
+ - test/workbook/worksheet/tc_break.rb
586
+ - test/workbook/worksheet/tc_cell.rb
587
+ - test/workbook/worksheet/tc_cfvo.rb
588
+ - test/workbook/worksheet/tc_col.rb
589
+ - test/workbook/worksheet/tc_color_scale.rb
590
+ - test/workbook/worksheet/tc_comment.rb
591
+ - test/workbook/worksheet/tc_comments.rb
592
+ - test/workbook/worksheet/tc_conditional_formatting.rb
580
593
  - test/workbook/worksheet/tc_data_bar.rb
581
- - test/workbook/worksheet/tc_worksheet_hyperlink.rb
582
594
  - test/workbook/worksheet/tc_data_validation.rb
595
+ - test/workbook/worksheet/tc_date_time_converter.rb
596
+ - test/workbook/worksheet/tc_header_footer.rb
597
+ - test/workbook/worksheet/tc_icon_set.rb
598
+ - test/workbook/worksheet/tc_outline_pr.rb
599
+ - test/workbook/worksheet/tc_page_margins.rb
600
+ - test/workbook/worksheet/tc_page_set_up_pr.rb
601
+ - test/workbook/worksheet/tc_page_setup.rb
602
+ - test/workbook/worksheet/tc_pane.rb
603
+ - test/workbook/worksheet/tc_pivot_table.rb
583
604
  - test/workbook/worksheet/tc_pivot_table_cache_definition.rb
605
+ - test/workbook/worksheet/tc_print_options.rb
584
606
  - test/workbook/worksheet/tc_protected_range.rb
585
- - test/workbook/worksheet/tc_selection.rb
586
607
  - test/workbook/worksheet/tc_rich_text.rb
587
- - test/workbook/worksheet/tc_date_time_converter.rb
588
- - test/workbook/worksheet/tc_table_style_info.rb
589
- - test/workbook/worksheet/tc_conditional_formatting.rb
590
- - test/workbook/worksheet/tc_page_setup.rb
591
- - test/workbook/worksheet/tc_comments.rb
592
- - test/workbook/worksheet/tc_sheet_view.rb
593
- - test/workbook/worksheet/tc_sheet_calc_pr.rb
594
- - test/workbook/worksheet/tc_color_scale.rb
595
- - test/workbook/worksheet/tc_worksheet.rb
596
608
  - test/workbook/worksheet/tc_rich_text_run.rb
609
+ - test/workbook/worksheet/tc_row.rb
610
+ - test/workbook/worksheet/tc_selection.rb
611
+ - test/workbook/worksheet/tc_sheet_calc_pr.rb
612
+ - test/workbook/worksheet/tc_sheet_format_pr.rb
597
613
  - test/workbook/worksheet/tc_sheet_pr.rb
598
- - test/workbook/worksheet/auto_filter/tc_filters.rb
599
- - test/workbook/worksheet/auto_filter/tc_auto_filter.rb
600
- - test/workbook/worksheet/auto_filter/tc_filter_column.rb
601
- - test/workbook/worksheet/tc_cell.rb
602
614
  - test/workbook/worksheet/tc_sheet_protection.rb
603
- - test/workbook/worksheet/tc_pane.rb
604
- - test/workbook/worksheet/tc_header_footer.rb
615
+ - test/workbook/worksheet/tc_sheet_view.rb
605
616
  - test/workbook/worksheet/tc_table.rb
606
- - test/workbook/worksheet/tc_page_margins.rb
607
- - test/workbook/worksheet/tc_cfvo.rb
608
- - test/workbook/worksheet/tc_col.rb
609
- - test/workbook/worksheet/tc_pivot_table.rb
610
- - test/workbook/worksheet/tc_break.rb
611
- - test/workbook/worksheet/tc_sheet_format_pr.rb
612
- - test/workbook/worksheet/tc_print_options.rb
613
- - test/workbook/worksheet/tc_comment.rb
614
- - test/workbook/worksheet/tc_outline_pr.rb
615
- - test/workbook/worksheet/tc_row.rb
616
- - test/workbook/worksheet/tc_icon_set.rb
617
- - test/workbook/worksheet/tc_page_set_up_pr.rb
618
- - test/workbook/tc_shared_strings_table.rb
619
- - test/workbook/tc_workbook.rb
617
+ - test/workbook/worksheet/tc_table_style_info.rb
618
+ - test/workbook/worksheet/tc_worksheet.rb
619
+ - test/workbook/worksheet/tc_worksheet_hyperlink.rb