axlsx 1.0.17 → 1.1.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 (167) hide show
  1. data/CHANGELOG.md +11 -3
  2. data/README.md +159 -51
  3. data/examples/example.csv +1000 -0
  4. data/examples/example.rb +255 -150
  5. data/examples/example.xlsx +0 -0
  6. data/examples/example_streamed.xlsx +0 -0
  7. data/examples/no-use_autowidth.xlsx +0 -0
  8. data/examples/shared_strings_example.xlsx +0 -0
  9. data/lib/axlsx/content_type/content_type.rb +12 -12
  10. data/lib/axlsx/content_type/default.rb +9 -6
  11. data/lib/axlsx/content_type/override.rb +12 -8
  12. data/lib/axlsx/doc_props/app.rb +37 -40
  13. data/lib/axlsx/doc_props/core.rb +12 -17
  14. data/lib/axlsx/drawing/axis.rb +38 -19
  15. data/lib/axlsx/drawing/bar_3D_chart.rb +33 -32
  16. data/lib/axlsx/drawing/bar_series.rb +13 -14
  17. data/lib/axlsx/drawing/cat_axis.rb +15 -14
  18. data/lib/axlsx/drawing/cat_axis_data.rb +16 -18
  19. data/lib/axlsx/drawing/chart.rb +39 -40
  20. data/lib/axlsx/drawing/drawing.rb +15 -12
  21. data/lib/axlsx/drawing/graphic_frame.rb +21 -21
  22. data/lib/axlsx/drawing/hyperlink.rb +12 -11
  23. data/lib/axlsx/drawing/line_3D_chart.rb +30 -28
  24. data/lib/axlsx/drawing/line_series.rb +11 -11
  25. data/lib/axlsx/drawing/marker.rb +10 -8
  26. data/lib/axlsx/drawing/named_axis_data.rb +36 -0
  27. data/lib/axlsx/drawing/one_cell_anchor.rb +17 -16
  28. data/lib/axlsx/drawing/pic.rb +25 -37
  29. data/lib/axlsx/drawing/picture_locking.rb +21 -18
  30. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -8
  31. data/lib/axlsx/drawing/pie_series.rb +15 -12
  32. data/lib/axlsx/drawing/scaling.rb +10 -10
  33. data/lib/axlsx/drawing/scatter_chart.rb +69 -0
  34. data/lib/axlsx/drawing/scatter_series.rb +39 -0
  35. data/lib/axlsx/drawing/ser_axis.rb +10 -10
  36. data/lib/axlsx/drawing/series.rb +15 -15
  37. data/lib/axlsx/drawing/series_title.rb +14 -14
  38. data/lib/axlsx/drawing/title.rb +26 -26
  39. data/lib/axlsx/drawing/two_cell_anchor.rb +18 -20
  40. data/lib/axlsx/drawing/val_axis.rb +8 -7
  41. data/lib/axlsx/drawing/val_axis_data.rb +17 -17
  42. data/lib/axlsx/drawing/view_3D.rb +22 -20
  43. data/lib/axlsx/package.rb +60 -43
  44. data/lib/axlsx/rels/relationship.rb +11 -8
  45. data/lib/axlsx/rels/relationships.rb +7 -1
  46. data/lib/axlsx/stylesheet/#num_fmt.rb# +69 -0
  47. data/lib/axlsx/stylesheet/border.rb +27 -23
  48. data/lib/axlsx/stylesheet/border_pr.rb +16 -15
  49. data/lib/axlsx/stylesheet/cell_alignment.rb +23 -21
  50. data/lib/axlsx/stylesheet/cell_protection.rb +10 -7
  51. data/lib/axlsx/stylesheet/cell_style.rb +8 -5
  52. data/lib/axlsx/stylesheet/color.rb +20 -14
  53. data/lib/axlsx/stylesheet/fill.rb +7 -5
  54. data/lib/axlsx/stylesheet/font.rb +21 -14
  55. data/lib/axlsx/stylesheet/gradient_fill.rb +19 -16
  56. data/lib/axlsx/stylesheet/gradient_stop.rb +9 -5
  57. data/lib/axlsx/stylesheet/num_fmt.rb +12 -6
  58. data/lib/axlsx/stylesheet/pattern_fill.rb +25 -10
  59. data/lib/axlsx/stylesheet/styles.rb +47 -35
  60. data/lib/axlsx/stylesheet/table_style.rb +9 -4
  61. data/lib/axlsx/stylesheet/table_style_element.rb +10 -7
  62. data/lib/axlsx/stylesheet/table_styles.rb +11 -8
  63. data/lib/axlsx/stylesheet/xf.rb +29 -25
  64. data/lib/axlsx/util/constants.rb +20 -14
  65. data/lib/axlsx/util/simple_typed_list.rb +18 -9
  66. data/lib/axlsx/util/validators.rb +13 -6
  67. data/lib/axlsx/version.rb +1 -1
  68. data/lib/axlsx/workbook/shared_strings_table.rb +19 -21
  69. data/lib/axlsx/workbook/workbook.rb +58 -34
  70. data/lib/axlsx/workbook/worksheet/cell.rb +149 -132
  71. data/lib/axlsx/workbook/worksheet/col.rb +114 -0
  72. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  73. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +29 -0
  74. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -0
  75. data/lib/axlsx/workbook/worksheet/row.rb +40 -23
  76. data/lib/axlsx/workbook/worksheet/table.rb +96 -0
  77. data/lib/axlsx/workbook/worksheet/table.rb~ +97 -0
  78. data/lib/axlsx/workbook/worksheet/worksheet.rb +243 -127
  79. data/lib/axlsx.rb +30 -9
  80. data/lib/schema/dc.xsd +5 -5
  81. data/lib/schema/dcmitype.xsd +5 -3
  82. data/lib/schema/dcterms.xsd +15 -15
  83. data/lib/schema/opc-coreProperties.xsd +6 -2
  84. data/lib/schema/xml.xsd +7 -8
  85. data/test/#benchmark.txt# +7 -0
  86. data/test/#tc_helper.rb# +3 -0
  87. data/test/benchmark.rb +81 -0
  88. data/test/benchmark.rb~ +0 -0
  89. data/test/benchmark.txt +6 -0
  90. data/test/benchmark.txt~ +6 -0
  91. data/test/content_type/tc_content_type.rb +30 -32
  92. data/test/content_type/tc_default.rb +8 -23
  93. data/test/content_type/tc_override.rb +7 -21
  94. data/test/doc_props/tc_app.rb +2 -8
  95. data/test/doc_props/tc_core.rb +6 -7
  96. data/test/drawing/tc_axis.rb +7 -3
  97. data/test/drawing/tc_bar_3D_chart.rb +6 -7
  98. data/test/drawing/tc_bar_series.rb +4 -5
  99. data/test/drawing/tc_cat_axis.rb +2 -3
  100. data/test/drawing/tc_cat_axis_data.rb +2 -3
  101. data/test/drawing/tc_chart.rb +13 -14
  102. data/test/drawing/tc_drawing.rb +7 -8
  103. data/test/drawing/tc_graphic_frame.rb +3 -4
  104. data/test/drawing/tc_hyperlink.rb +2 -3
  105. data/test/drawing/tc_line_3d_chart.rb +5 -6
  106. data/test/drawing/tc_line_series.rb +3 -4
  107. data/test/drawing/tc_marker.rb +3 -4
  108. data/test/drawing/tc_one_cell_anchor.rb +6 -7
  109. data/test/drawing/tc_pic.rb +8 -9
  110. data/test/drawing/tc_picture_locking.rb +2 -3
  111. data/test/drawing/tc_pie_3D_chart.rb +5 -6
  112. data/test/drawing/tc_pie_series.rb +4 -5
  113. data/test/drawing/tc_scaling.rb +3 -4
  114. data/test/drawing/tc_scatter_chart.rb +43 -0
  115. data/test/drawing/tc_scatter_series.rb +20 -0
  116. data/test/drawing/tc_ser_axis.rb +2 -3
  117. data/test/drawing/tc_series.rb +4 -5
  118. data/test/drawing/tc_series_title.rb +4 -5
  119. data/test/drawing/tc_title.rb +4 -5
  120. data/test/drawing/tc_two_cell_anchor.rb +4 -5
  121. data/test/drawing/tc_val_axis.rb +2 -3
  122. data/test/drawing/tc_val_axis_data.rb +2 -3
  123. data/test/drawing/tc_view_3D.rb +6 -7
  124. data/test/example.csv +1000 -0
  125. data/test/example.xlsx +0 -0
  126. data/test/example_streamed.xlsx +0 -0
  127. data/test/profile.rb +33 -0
  128. data/test/rels/tc_relationship.rb +5 -6
  129. data/test/rels/tc_relationships.rb +4 -5
  130. data/test/stylesheet/tc_border.rb +3 -4
  131. data/test/stylesheet/tc_border_pr.rb +3 -4
  132. data/test/stylesheet/tc_cell_alignment.rb +10 -6
  133. data/test/stylesheet/tc_cell_protection.rb +2 -3
  134. data/test/stylesheet/tc_cell_style.rb +2 -3
  135. data/test/stylesheet/tc_color.rb +2 -3
  136. data/test/stylesheet/tc_fill.rb +1 -2
  137. data/test/stylesheet/tc_font.rb +12 -5
  138. data/test/stylesheet/tc_gradient_fill.rb +1 -2
  139. data/test/stylesheet/tc_gradient_stop.rb +1 -2
  140. data/test/stylesheet/tc_num_fmt.rb +1 -2
  141. data/test/stylesheet/tc_pattern_fill.rb +3 -4
  142. data/test/stylesheet/tc_styles.rb +16 -6
  143. data/test/stylesheet/tc_table_style.rb +2 -3
  144. data/test/stylesheet/tc_table_style_element.rb +2 -3
  145. data/test/stylesheet/tc_table_styles.rb +3 -4
  146. data/test/stylesheet/tc_xf.rb +16 -17
  147. data/test/tc_axlsx.rb +39 -0
  148. data/test/tc_axlsx.rb~ +0 -0
  149. data/test/tc_helper.rb +3 -0
  150. data/test/tc_helper.rb~ +3 -0
  151. data/test/tc_package.rb +13 -10
  152. data/test/util/tc_simple_typed_list.rb +8 -9
  153. data/test/util/tc_validators.rb +7 -8
  154. data/test/workbook/tc_shared_strings_table.rb +5 -6
  155. data/test/workbook/tc_workbook.rb +24 -6
  156. data/test/workbook/worksheet/table/tc_table.rb +71 -0
  157. data/test/workbook/worksheet/table/tc_table.rb~ +72 -0
  158. data/test/workbook/worksheet/tc_cell.rb +62 -18
  159. data/test/workbook/worksheet/tc_col.rb +59 -0
  160. data/test/workbook/worksheet/tc_col.rb~ +10 -0
  161. data/test/workbook/worksheet/tc_date_time_converter.rb +126 -0
  162. data/test/workbook/worksheet/tc_page_margins.rb +97 -0
  163. data/test/workbook/worksheet/tc_row.rb +54 -4
  164. data/test/workbook/worksheet/tc_worksheet.rb +177 -34
  165. metadata +69 -41
  166. data/test/drawing/tc_hyperlink.rb~ +0 -71
  167. data/test/workbook/tc_shared_strings_table.rb~ +0 -8
@@ -0,0 +1,126 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'tc_helper.rb'
3
+
4
+ class TestDateTimeConverter < Test::Unit::TestCase
5
+ def setup
6
+ @margin_of_error = 0.000_001
7
+ @extended_time_range = begin
8
+ Time.parse "1893-08-05"
9
+ Time.parse "9999-12-31T23:59:59Z"
10
+ true
11
+ rescue
12
+ false
13
+ end
14
+ end
15
+
16
+ def test_date_to_serial_1900
17
+ Axlsx::Workbook.date1904 = false
18
+ tests = if @extended_time_range
19
+ { # examples taken straight from the spec
20
+ "1893-08-05" => -2338.0,
21
+ "1900-01-01" => 2.0,
22
+ "1910-02-03" => 3687.0,
23
+ "2006-02-01" => 38749.0,
24
+ "9999-12-31" => 2958465.0
25
+ }
26
+ else
27
+ { # examples taken inside the possible values
28
+ "1970-01-01" => 25569.0, # Unix epoch
29
+ "1970-01-02" => 25570.0,
30
+ "2006-02-01" => 38749.0,
31
+ "2038-01-19" => 50424.0, # max date using signed timestamp in 32bit
32
+ }
33
+ end
34
+ tests.each do |date_string, expected|
35
+ serial = Axlsx::DateTimeConverter::date_to_serial Date.parse(date_string)
36
+ assert_equal expected, serial
37
+ end
38
+ end
39
+
40
+ def test_date_to_serial_1904
41
+ Axlsx::Workbook.date1904 = true
42
+ tests = if @extended_time_range
43
+ { # examples taken straight from the spec
44
+ "1893-08-05" => -3800.0,
45
+ "1904-01-01" => 0.0,
46
+ "1910-02-03" => 2225.0,
47
+ "2006-02-01" => 37287.0,
48
+ "9999-12-31" => 2957003.0
49
+ }
50
+ else
51
+ { # examples taken inside the possible values
52
+ "1970-01-01" => 24107.0, # Unix epoch
53
+ "1970-01-02" => 24108.0,
54
+ "2006-02-01" => 37287.0,
55
+ "2038-01-19" => 48962.0, # max date using signed timestamp in 32bit
56
+ }
57
+ end
58
+ tests.each do |date_string, expected|
59
+ serial = Axlsx::DateTimeConverter::date_to_serial Date.parse(date_string)
60
+ assert_equal expected, serial
61
+ end
62
+ end
63
+
64
+ def test_time_to_serial_1900
65
+ Axlsx::Workbook.date1904 = false
66
+ tests = if @extended_time_range
67
+ { # examples taken straight from the spec
68
+ "1893-08-05T00:00:01Z" => -2337.999989,
69
+ "1899-12-28T18:00:00Z" => -1.25,
70
+ "1910-02-03T10:05:54Z" => 3687.4207639,
71
+ "1900-01-01T12:00:00Z" => 2.5, # wrongly indicated as 1.5 in the spec!
72
+ "9999-12-31T23:59:59Z" => 2958465.9999884
73
+ }
74
+ else
75
+ { # examples taken inside the possible values
76
+ "1970-01-01T00:00:00Z" => 25569.0, # Unix epoch
77
+ "1970-01-01T12:00:00Z" => 25569.5,
78
+ "2000-01-01T00:00:00Z" => 36526.0,
79
+ "2038-01-19T03:14:07Z" => 50424.134803, # max signed timestamp in 32bit
80
+ }
81
+ end
82
+ tests.each do |time_string, expected|
83
+ serial = Axlsx::DateTimeConverter::time_to_serial Time.parse(time_string)
84
+ assert_in_delta expected, serial, @margin_of_error
85
+ end
86
+ end
87
+
88
+ def test_time_to_serial_1904
89
+ Axlsx::Workbook.date1904 = true
90
+ # ruby 1.8.7 cannot parse dates prior to epoch. see http://ruby-doc.org/core-1.8.7/Time.html
91
+
92
+ tests = if @extended_time_range
93
+ { # examples taken straight from the spec
94
+ "1893-08-05T00:00:01Z" => -3799.999989,
95
+ "1910-02-03T10:05:54Z" => 2225.4207639,
96
+ "1904-01-01T12:00:00Z" => 0.5000000,
97
+ "9999-12-31T23:59:59Z" => 2957003.9999884
98
+ }
99
+ else
100
+ { # examples taken inside the possible values
101
+ "1970-01-01T00:00:00Z" => 24107.0, # Unix epoch
102
+ "1970-01-01T12:00:00Z" => 24107.5,
103
+ "2000-01-01T00:00:00Z" => 35064.0,
104
+ "2038-01-19T03:14:07Z" => 48962.134803, # max signed timestamp in 32bit
105
+ }
106
+ end
107
+ tests.each do |time_string, expected|
108
+ serial = Axlsx::DateTimeConverter::time_to_serial Time.parse(time_string)
109
+ assert_in_delta expected, serial, @margin_of_error
110
+ end
111
+ end
112
+
113
+ def test_timezone
114
+ utc = Time.utc 2012 # January 1st, 2012 at 0:00 UTC
115
+ local = begin
116
+ Time.new 2012, 1, 1, 1, 0, 0, 3600 # January 1st, 2012 at 1:00 GMT+1
117
+ rescue ArgumentError
118
+ Time.parse "2012-01-01 01:00:00 +0100"
119
+ end
120
+ assert_equal local, utc
121
+ assert_equal Axlsx::DateTimeConverter::time_to_serial(local), Axlsx::DateTimeConverter::time_to_serial(utc)
122
+ Axlsx::Workbook.date1904 = true
123
+ assert_equal Axlsx::DateTimeConverter::time_to_serial(local), Axlsx::DateTimeConverter::time_to_serial(utc)
124
+ end
125
+
126
+ end
@@ -0,0 +1,97 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestPageMargins < Test::Unit::TestCase
4
+
5
+ def setup
6
+ p = Axlsx::Package.new
7
+ ws = p.workbook.add_worksheet :name=>"hmmm"
8
+ @pm = ws.page_margins
9
+ end
10
+
11
+ def test_initialize
12
+ assert_equal(Axlsx::PageMargins::DEFAULT_LEFT_RIGHT, @pm.left)
13
+ assert_equal(Axlsx::PageMargins::DEFAULT_LEFT_RIGHT, @pm.right)
14
+ assert_equal(Axlsx::PageMargins::DEFAULT_TOP_BOTTOM, @pm.top)
15
+ assert_equal(Axlsx::PageMargins::DEFAULT_TOP_BOTTOM, @pm.bottom)
16
+ assert_equal(Axlsx::PageMargins::DEFAULT_HEADER_FOOTER, @pm.header)
17
+ assert_equal(Axlsx::PageMargins::DEFAULT_HEADER_FOOTER, @pm.footer)
18
+ end
19
+
20
+ def test_initialize_with_options
21
+ optioned = Axlsx::PageMargins.new(:left => 2, :right => 3, :top => 2, :bottom => 1, :header => 0.1, :footer => 0.1)
22
+ assert_equal(2, optioned.left)
23
+ assert_equal(3, optioned.right)
24
+ assert_equal(2, optioned.top)
25
+ assert_equal(1, optioned.bottom)
26
+ assert_equal(0.1, optioned.header)
27
+ assert_equal(0.1, optioned.footer)
28
+ end
29
+
30
+
31
+ def test_set_all_values
32
+ @pm.set(:left => 1.1, :right => 1.2, :top => 1.3, :bottom => 1.4, :header => 0.8, :footer => 0.9)
33
+ assert_equal(1.1, @pm.left)
34
+ assert_equal(1.2, @pm.right)
35
+ assert_equal(1.3, @pm.top)
36
+ assert_equal(1.4, @pm.bottom)
37
+ assert_equal(0.8, @pm.header)
38
+ assert_equal(0.9, @pm.footer)
39
+ end
40
+
41
+ def test_set_some_values
42
+ @pm.set(:left => 1.1, :right => 1.2)
43
+ assert_equal(1.1, @pm.left)
44
+ assert_equal(1.2, @pm.right)
45
+ assert_equal(Axlsx::PageMargins::DEFAULT_TOP_BOTTOM, @pm.top)
46
+ assert_equal(Axlsx::PageMargins::DEFAULT_TOP_BOTTOM, @pm.bottom)
47
+ assert_equal(Axlsx::PageMargins::DEFAULT_HEADER_FOOTER, @pm.header)
48
+ assert_equal(Axlsx::PageMargins::DEFAULT_HEADER_FOOTER, @pm.footer)
49
+ end
50
+
51
+ def test_to_xml
52
+ @pm.left = 1.1
53
+ @pm.right = 1.2
54
+ @pm.top = 1.3
55
+ @pm.bottom = 1.4
56
+ @pm.header = 0.8
57
+ @pm.footer = 0.9
58
+ doc = Nokogiri::XML.parse(@pm.to_xml_string)
59
+ assert_equal(1, doc.xpath(".//pageMargins[@left=1.1][@right=1.2][@top=1.3][@bottom=1.4][@header=0.8][@footer=0.9]").size)
60
+ end
61
+
62
+ def test_left
63
+ assert_raise(ArgumentError) { @pm.left = -1.2 }
64
+ assert_nothing_raised { @pm.left = 1.5 }
65
+ assert_equal(@pm.left, 1.5)
66
+ end
67
+
68
+ def test_right
69
+ assert_raise(ArgumentError) { @pm.right = -1.2 }
70
+ assert_nothing_raised { @pm.right = 1.5 }
71
+ assert_equal(@pm.right, 1.5)
72
+ end
73
+
74
+ def test_top
75
+ assert_raise(ArgumentError) { @pm.top = -1.2 }
76
+ assert_nothing_raised { @pm.top = 1.5 }
77
+ assert_equal(@pm.top, 1.5)
78
+ end
79
+
80
+ def test_bottom
81
+ assert_raise(ArgumentError) { @pm.bottom = -1.2 }
82
+ assert_nothing_raised { @pm.bottom = 1.5 }
83
+ assert_equal(@pm.bottom, 1.5)
84
+ end
85
+
86
+ def test_header
87
+ assert_raise(ArgumentError) { @pm.header = -1.2 }
88
+ assert_nothing_raised { @pm.header = 1.5 }
89
+ assert_equal(@pm.header, 1.5)
90
+ end
91
+
92
+ def test_footer
93
+ assert_raise(ArgumentError) { @pm.footer = -1.2 }
94
+ assert_nothing_raised { @pm.footer = 1.5 }
95
+ assert_equal(@pm.footer, 1.5)
96
+ end
97
+ end
@@ -1,5 +1,4 @@
1
- require 'test/unit'
2
- require 'axlsx.rb'
1
+ require 'tc_helper.rb'
3
2
 
4
3
  class TestRow < Test::Unit::TestCase
5
4
 
@@ -8,16 +7,37 @@ class TestRow < Test::Unit::TestCase
8
7
  @ws = p.workbook.add_worksheet :name=>"hmmm"
9
8
  @row = @ws.add_row
10
9
  end
11
-
10
+
12
11
  def test_initialize
13
12
  assert(@row.cells.empty?, "no cells by default")
14
13
  assert_equal(@row.worksheet, @ws, "has a reference to the worksheet")
14
+ assert_nil(@row.height, "height defaults to nil")
15
+ assert(!@row.custom_height?, "no custom height by default")
16
+ end
17
+
18
+ def test_initialize_with_fixed_height
19
+ row = @ws.add_row([1,2,3,4,5], :height=>40)
20
+ assert_equal(40, row.height)
21
+ assert(row.custom_height?)
15
22
  end
16
23
 
17
24
  def test_style
18
25
  r = @ws.add_row([1,2,3,4,5])
19
26
  r.style=1
20
- r.cells.each { |c| assert_equal(c.style,1) }
27
+ r.cells.each { |c| assert_equal(c.style,1) }
28
+ end
29
+
30
+ def test_nil_cells
31
+ row = @ws.add_row([nil,1,2,nil,4,5,nil])
32
+ r_s_xml = Nokogiri::XML(row.to_xml_string(0, ''))
33
+ assert_equal(r_s_xml.xpath(".//row/c").size, 4)
34
+ end
35
+
36
+ def test_nil_cell_r
37
+ row = @ws.add_row([nil,1,2,nil,4,5,nil])
38
+ r_s_xml = Nokogiri::XML(row.to_xml_string(0, ''))
39
+ assert_equal(r_s_xml.xpath(".//row/c").first['r'], 'B1')
40
+ assert_equal(r_s_xml.xpath(".//row/c").last['r'], 'F1')
21
41
  end
22
42
 
23
43
  def test_index
@@ -33,4 +53,34 @@ class TestRow < Test::Unit::TestCase
33
53
  r = @ws.add_row [1,2,3], :style=>0, :types=>:integer
34
54
  assert_equal(r.cells.size, 3)
35
55
  end
56
+
57
+ def test_custom_height
58
+ @row.height = 20
59
+ assert(@row.custom_height?)
60
+ end
61
+
62
+ def test_height
63
+ assert_raise(ArgumentError) { @row.height = -3 }
64
+ assert_nothing_raised { @row.height = 15 }
65
+ assert_equal(15, @row.height)
66
+ end
67
+
68
+ def test_to_xml_without_custom_height
69
+ doc = Nokogiri::XML.parse(@row.to_xml_string(0))
70
+ assert_equal(0, doc.xpath(".//row[@ht]").size)
71
+ assert_equal(0, doc.xpath(".//row[@customHeight]").size)
72
+ end
73
+
74
+ def test_to_xml_string
75
+ r_s_xml = Nokogiri::XML(@row.to_xml_string(0, ''))
76
+ assert_equal(r_s_xml.xpath(".//row[@r=1]").size, 1)
77
+ end
78
+
79
+ def test_to_xml_string_with_custom_height
80
+ @row.add_cell 1
81
+ @row.height = 20
82
+ r_s_xml = Nokogiri::XML(@row.to_xml_string(0, ''))
83
+ assert_equal(r_s_xml.xpath(".//row[@r=1][@ht=20][@customHeight=1]").size, 1)
84
+ end
85
+
36
86
  end
@@ -1,18 +1,63 @@
1
- require 'test/unit'
2
- require 'axlsx.rb'
1
+ require 'tc_helper.rb'
3
2
 
4
3
  class TestWorksheet < Test::Unit::TestCase
5
- def setup
6
- p = Axlsx::Package.new
7
- @ws = p.workbook.add_worksheet
4
+ def setup
5
+ @p = Axlsx::Package.new
6
+ @wb = @p.workbook
7
+ @ws = @wb.add_worksheet
8
8
  end
9
9
 
10
+
10
11
  def test_pn
11
12
  assert_equal(@ws.pn, "worksheets/sheet1.xml")
12
13
  ws = @ws.workbook.add_worksheet
13
14
  assert_equal(ws.pn, "worksheets/sheet2.xml")
14
15
  end
15
16
 
17
+ def test_page_margins
18
+ assert(@ws.page_margins.is_a? Axlsx::PageMargins)
19
+ end
20
+
21
+ def test_page_margins_yeild
22
+ @ws.page_margins do |pm|
23
+ assert(pm.is_a? Axlsx::PageMargins)
24
+ assert(@ws.page_margins == pm)
25
+ end
26
+ end
27
+
28
+ def test_no_autowidth
29
+ @ws.workbook.use_autowidth = false
30
+ @ws.add_row [1,2,3,4]
31
+ assert_equal(@ws.column_info[0].width, nil)
32
+ end
33
+
34
+ def test_initialization_options
35
+ page_margins = {:left => 2, :right => 2, :bottom => 2, :top => 2, :header => 2, :footer => 2}
36
+ optioned = @ws.workbook.add_worksheet(:name => 'bob', :page_margins => page_margins, :selected => true, :show_gridlines => false)
37
+ assert_equal(optioned.page_margins.left, page_margins[:left])
38
+ assert_equal(optioned.page_margins.right, page_margins[:right])
39
+ assert_equal(optioned.page_margins.top, page_margins[:top])
40
+ assert_equal(optioned.page_margins.bottom, page_margins[:bottom])
41
+ assert_equal(optioned.page_margins.header, page_margins[:header])
42
+ assert_equal(optioned.page_margins.footer, page_margins[:footer])
43
+ assert_equal(optioned.name, 'bob')
44
+ assert_equal(optioned.selected, true)
45
+ assert_equal(optioned.show_gridlines, false)
46
+ end
47
+
48
+
49
+ def test_use_gridlines
50
+ assert_raise(ArgumentError) { @ws.show_gridlines = -1.1 }
51
+ assert_nothing_raised { @ws.show_gridlines = false }
52
+ assert_equal(@ws.show_gridlines, false)
53
+ end
54
+
55
+ def test_selected
56
+ assert_raise(ArgumentError) { @ws.selected = -1.1 }
57
+ assert_nothing_raised { @ws.selected = true }
58
+ assert_equal(@ws.selected, true)
59
+ end
60
+
16
61
  def test_rels_pn
17
62
  assert_equal(@ws.rels_pn, "worksheets/_rels/sheet1.xml.rels")
18
63
  ws = @ws.workbook.add_worksheet
@@ -24,7 +69,7 @@ class TestWorksheet < Test::Unit::TestCase
24
69
  ws = @ws.workbook.add_worksheet
25
70
  assert_equal(ws.rId, "rId2")
26
71
  end
27
-
72
+
28
73
  def test_index
29
74
  assert_equal(@ws.index, @ws.workbook.worksheets.index(@ws))
30
75
  end
@@ -39,9 +84,13 @@ class TestWorksheet < Test::Unit::TestCase
39
84
  @ws.add_row [1, 2, 3]
40
85
  @ws.add_row [4, 5, 6]
41
86
  range = @ws["A1:C2"]
87
+ first_row = @ws[0]
88
+ last_row = @ws[1]
89
+ assert_equal(@ws.rows[0],first_row)
90
+ assert_equal(@ws.rows[1],last_row)
42
91
  assert_equal(range.size, 6)
43
92
  assert_equal(range.first, @ws.rows.first.cells.first)
44
- assert_equal(range.last, @ws.rows.last.cells.last)
93
+ assert_equal(range.last, @ws.rows.last.cells.last)
45
94
  end
46
95
 
47
96
  def test_add_row
@@ -67,7 +116,7 @@ class TestWorksheet < Test::Unit::TestCase
67
116
  @ws.add_row [1,2,3,4]
68
117
  @ws.add_row [1,2,3,4]
69
118
  @ws.col_style( (1..2), 1, :row_offset=>1)
70
- @ws.rows[(1..-1)].each do | r |
119
+ @ws.rows[(1..-1)].each do | r |
71
120
  assert_equal(r.cells[1].style, 1)
72
121
  assert_equal(r.cells[2].style, 1)
73
122
  end
@@ -88,7 +137,7 @@ class TestWorksheet < Test::Unit::TestCase
88
137
  @ws.add_row [1,2,3,4]
89
138
  @ws.add_row [1,2,3,4]
90
139
  c = @ws.cols[1]
91
- assert_equal(c.size, 4)
140
+ assert_equal(c.size, 4)
92
141
  assert_equal(c[0].value, 2)
93
142
  end
94
143
 
@@ -98,22 +147,122 @@ class TestWorksheet < Test::Unit::TestCase
98
147
  @ws.add_row [1,2,3,4]
99
148
  @ws.add_row [1,2,3,4]
100
149
  @ws.row_style 1, 1, :col_offset=>1
101
- @ws.rows[1].cells[(1..-1)].each do | c |
150
+ @ws.rows[1].cells[(1..-1)].each do | c |
102
151
  assert_equal(c.style, 1)
103
152
  end
104
153
  assert_equal(@ws.rows[1].cells[0].style, 0)
105
154
  assert_equal(@ws.rows[2].cells[1].style, 0)
106
155
  end
107
-
108
- def test_to_xml
156
+
157
+ def test_to_xml_string_fit_to_page
158
+ @ws.fit_to_page = true
159
+ doc = Nokogiri::XML(@ws.to_xml_string)
160
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetPr/xmlns:pageSetUpPr[@fitToPage="true"]').size, 1)
161
+ end
162
+
163
+ def test_to_xml_string_dimensions
164
+ @ws.add_row [1,2,3]
165
+ doc = Nokogiri::XML(@ws.to_xml_string)
166
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:dimension[@ref="A1:C1"]').size, 1)
167
+ end
168
+
169
+ def test_to_xml_string_selected
170
+ @ws.selected = true
171
+ doc = Nokogiri::XML(@ws.to_xml_string)
172
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView[@tabSelected="true"]').size, 1)
173
+ end
174
+
175
+ def test_to_xml_string_show_gridlines
176
+ @ws.show_gridlines = false
177
+ doc = Nokogiri::XML(@ws.to_xml_string)
178
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView[@showGridLines="false"]').size, 1)
179
+ end
180
+
181
+
182
+ def test_to_xml_string_show_selection
183
+ doc = Nokogiri::XML(@ws.to_xml_string)
184
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView/xmlns:selection[@activeCell="A1"]').size, 1)
185
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetViews/xmlns:sheetView/xmlns:selection[@sqref="A1"]').size, 1)
186
+ end
187
+
188
+ def test_to_xml_string_auto_fit_data
189
+ @ws.add_row [1, "two"]
190
+ doc = Nokogiri::XML(@ws.to_xml_string)
191
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:cols/xmlns:col').size, 2)
192
+ end
193
+
194
+ def test_to_xml_string_sheet_data
195
+ @ws.add_row [1, "two"]
196
+ doc = Nokogiri::XML(@ws.to_xml_string)
197
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:sheetData/xmlns:row').size, 1)
198
+ end
199
+
200
+ def test_to_xml_string_auto_filter
201
+ @ws.add_row [1, "two"]
202
+ @ws.auto_filter = "A1:B1"
203
+ doc = Nokogiri::XML(@ws.to_xml_string)
204
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:autoFilter[@ref="A1:B1"]').size, 1)
205
+ end
206
+
207
+ def test_to_xml_string_merge_cells
208
+ @ws.add_row [1, "two"]
209
+ @ws.merge_cells "A1:D1"
210
+ doc = Nokogiri::XML(@ws.to_xml_string)
211
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:mergeCells/xmlns:mergeCell[@ref="A1:D1"]').size, 1)
212
+ end
213
+
214
+ def test_to_xml_string_page_margins
215
+ @ws.page_margins do |pm|
216
+ pm.left = 9
217
+ pm.right = 7
218
+ end
219
+ doc = Nokogiri::XML(@ws.to_xml_string)
220
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:pageMargins[@left="9"][@right="7"]').size, 1)
221
+ end
222
+
223
+ def test_to_xml_string_drawing
224
+ c = @ws.add_chart Axlsx::Pie3DChart
225
+ doc = Nokogiri::XML(@ws.to_xml_string)
226
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:drawing[@r:id="rId1"]').size, 1)
227
+ end
228
+
229
+ def test_to_xml_string_tables
230
+ @ws.add_row ["one", "two"]
231
+ @ws.add_row [1, 2]
232
+ @ws.add_table "A1:B2"
233
+ doc = Nokogiri::XML(@ws.to_xml_string)
234
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:tableParts[@count="1"]').size, 1)
235
+ assert_equal(doc.xpath('//xmlns:worksheet/xmlns:tableParts/xmlns:tablePart[@r:id="rId1"]').size, 1)
236
+ end
237
+
238
+ def test_abs_auto_filter
239
+ @ws.add_row [1, "two", 3]
240
+ @ws.auto_filter = "A1:C1"
241
+ assert_equal(@ws.abs_auto_filter, "'Sheet1'!$A$1:$C$1")
242
+ end
243
+
244
+ def test_to_xml_string
245
+ schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
246
+ doc = Nokogiri::XML(@ws.to_xml_string)
247
+ errors = []
248
+ schema.validate(doc).each do |error|
249
+ errors.push error
250
+ puts error.message
251
+ end
252
+ assert(errors.empty?, "error free validation")
253
+ end
254
+
255
+ def test_valid_with_page_margins
256
+ @ws.page_margins.set :left => 9
109
257
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
110
- doc = Nokogiri::XML(@ws.to_xml)
258
+ doc = Nokogiri::XML(@ws.to_xml_string)
111
259
  errors = []
112
260
  schema.validate(doc).each do |error|
113
261
  errors.push error
114
262
  puts error.message
115
263
  end
116
264
  assert(errors.empty?, "error free validation")
265
+
117
266
  end
118
267
 
119
268
  def test_relationships
@@ -124,46 +273,40 @@ class TestWorksheet < Test::Unit::TestCase
124
273
  assert_equal(@ws.relationships.size, 1, "multiple charts still only result in one relationship")
125
274
  end
126
275
 
127
-
276
+
128
277
  def test_name_unique
129
278
  assert_raise(ArgumentError, "worksheet name must be unique") { n = @ws.name; @ws.workbook.add_worksheet(:name=> @ws) }
130
279
  end
131
280
 
132
- def test_update_auto_with_data
133
- small = @ws.workbook.styles.add_style(:sz=>2)
134
- big = @ws.workbook.styles.add_style(:sz=>10)
135
-
136
- @ws.add_row ["chasing windmills", "penut"], :style=>small
137
- assert(@ws.auto_fit_data.size == 2, "a data item for each column")
138
-
139
- assert_equal(@ws.auto_fit_data[0], {:sz => 2, :longest => "chasing windmills", :fixed=>nil}, "adding a row updates auto_fit_data if the product of the string length and font is greater for the column")
140
-
141
-
142
- @ws.add_row ["mule"], :style=>big
143
- assert_equal(@ws.auto_fit_data[0], {:sz=>10,:longest=>"mule", :fixed=>nil}, "adding a row updates auto_fit_data if the product of the string length and font is greater for the column")
281
+ def test_name_size
282
+ assert_raise(ArgumentError, "name too long!") { @ws.name = Array.new(32, "A").join('') }
283
+ assert_nothing_raised { @ws.name = Array.new(31, "A").join('') }
144
284
  end
145
285
 
146
- def test_auto_width
147
- assert(@ws.send(:auto_width, {:sz=>11, :longest=>"fisheries"}) > @ws.send(:auto_width, {:sz=>11, :longest=>"fish"}), "longer strings get a longer auto_width at the same font size")
286
+ def test_set_fixed_width_column
287
+ @ws.add_row ["mule", "donkey", "horse"], :widths => [20, :ignore, nil]
288
+ assert(@ws.column_info.size == 3, "a data item for each column")
289
+ assert_equal(@ws.column_info[0].width, 20, "adding a row with fixed width updates :fixed attribute")
290
+ assert_equal(@ws.column_info[1].width, nil, ":ignore does not set any data")
291
+ end
148
292
 
149
- assert(@ws.send(:auto_width, {:sz=>11, :longest=>"fish"}) < @ws.send(:auto_width, {:sz=>12, :longest=>"fish"}), "larger fonts produce longer with with same string")
150
- assert_equal(@ws.send(:auto_width, {:sz=>11, :longest => "This is a really long string", :fixed=>0.2}), 0.2, "fixed rules!")
293
+ def test_fixed_height
294
+ @ws.add_row [1, 2, 3], :height => 40
295
+ assert_equal(40, @ws.rows[-1].height)
151
296
  end
152
297
 
153
298
  def test_set_column_width
154
299
  @ws.add_row ["chasing windmills", "penut"]
155
- assert_equal(@ws.auto_fit_data[0][:fixed], nil, 'no fixed by default')
156
300
  @ws.column_widths nil, 0.5
157
- assert_equal(@ws.auto_fit_data[1][:fixed], 0.5, 'eat my width')
301
+ assert_equal(@ws.column_info[1].width, 0.5, 'eat my width')
158
302
  assert_raise(ArgumentError, 'reject invalid columns') { @ws.column_widths 2, 7, nil }
159
303
  assert_raise(ArgumentError, 'only accept unsigned ints') { @ws.column_widths 2, 7, -1 }
160
304
  assert_raise(ArgumentError, 'only accept Integer, Float or Fixnum') { @ws.column_widths 2, 7, "-1" }
161
305
  end
162
306
 
163
-
164
307
  def test_merge_cells
165
308
  assert(@ws.merged_cells.is_a?(Array))
166
- assert_equal(@ws.merged_cells.size, 0)
309
+ assert_equal(@ws.merged_cells.size, 0)
167
310
  @ws.add_row [1,2,3]
168
311
  @ws.add_row [4,5,6]
169
312
  @ws.add_row [7,8,9]