caxlsx 3.0.1 → 3.0.2

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.
@@ -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