axlsx 1.1.3 → 1.2.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 (187) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +60 -0
  3. data/LICENSE +1 -1
  4. data/README.md +115 -415
  5. data/Rakefile +11 -3
  6. data/examples/basic_charts.rb +54 -0
  7. data/examples/chart_colors.rb +88 -0
  8. data/examples/data_validation.rb +50 -0
  9. data/examples/example.rb +299 -155
  10. data/examples/example.xlsx +0 -0
  11. data/examples/example_streamed.xlsx +0 -0
  12. data/examples/extractive.pdf +0 -0
  13. data/examples/extractive.rb +45 -0
  14. data/examples/no-use_autowidth.xlsx +0 -0
  15. data/examples/scraping_html.rb +91 -0
  16. data/examples/shared_strings_example.xlsx +0 -0
  17. data/examples/sheet_protection.rb +10 -0
  18. data/examples/sheet_view.rb +34 -0
  19. data/examples/two_cell_anchor_image.rb +11 -0
  20. data/lib/axlsx/content_type/content_type.rb +2 -0
  21. data/lib/axlsx/content_type/default.rb +30 -15
  22. data/lib/axlsx/content_type/override.rb +29 -14
  23. data/lib/axlsx/doc_props/app.rb +161 -104
  24. data/lib/axlsx/doc_props/core.rb +9 -5
  25. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  26. data/lib/axlsx/drawing/axis.rb +92 -37
  27. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  28. data/lib/axlsx/drawing/bar_series.rb +25 -7
  29. data/lib/axlsx/drawing/cat_axis.rb +50 -22
  30. data/lib/axlsx/drawing/chart.rb +69 -56
  31. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  32. data/lib/axlsx/drawing/drawing.rb +28 -12
  33. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  34. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  35. data/lib/axlsx/drawing/line_series.rb +20 -4
  36. data/lib/axlsx/drawing/num_data.rb +52 -0
  37. data/lib/axlsx/drawing/num_data_source.rb +61 -0
  38. data/lib/axlsx/drawing/num_val.rb +32 -0
  39. data/lib/axlsx/drawing/pic.rb +44 -4
  40. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  41. data/lib/axlsx/drawing/pie_series.rb +18 -4
  42. data/lib/axlsx/drawing/scatter_chart.rb +2 -8
  43. data/lib/axlsx/drawing/scatter_series.rb +28 -2
  44. data/lib/axlsx/drawing/ser_axis.rb +1 -1
  45. data/lib/axlsx/drawing/series.rb +1 -1
  46. data/lib/axlsx/drawing/str_data.rb +42 -0
  47. data/lib/axlsx/drawing/str_val.rb +33 -0
  48. data/lib/axlsx/drawing/title.rb +21 -9
  49. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  50. data/lib/axlsx/drawing/view_3D.rb +44 -31
  51. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  52. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  53. data/lib/axlsx/package.rb +44 -16
  54. data/lib/axlsx/rels/relationship.rb +3 -3
  55. data/lib/axlsx/rels/relationships.rb +1 -11
  56. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  57. data/lib/axlsx/stylesheet/styles.rb +1 -1
  58. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  59. data/lib/axlsx/util/constants.rb +28 -0
  60. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  61. data/lib/axlsx/util/validators.rb +81 -8
  62. data/lib/axlsx/version.rb +2 -7
  63. data/lib/axlsx/workbook/defined_name.rb +174 -0
  64. data/lib/axlsx/workbook/defined_names.rb +21 -0
  65. data/lib/axlsx/workbook/workbook.rb +65 -13
  66. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  67. data/lib/axlsx/workbook/worksheet/cell.rb +35 -7
  68. data/lib/axlsx/workbook/worksheet/col.rb +17 -1
  69. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  70. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  71. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  72. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  73. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  74. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  75. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  76. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  77. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  78. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  79. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  80. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  81. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  82. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  83. data/lib/axlsx/workbook/worksheet/row.rb +67 -12
  84. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  85. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  86. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  87. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  88. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  89. data/lib/axlsx/workbook/worksheet/table.rb +3 -3
  90. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  91. data/lib/axlsx/workbook/worksheet/worksheet.rb +377 -255
  92. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  93. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  94. data/lib/axlsx.rb +30 -15
  95. data/test/content_type/tc_content_type.rb +1 -6
  96. data/test/doc_props/tc_app.rb +31 -1
  97. data/test/doc_props/tc_core.rb +3 -1
  98. data/test/drawing/tc_axis.rb +38 -3
  99. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  100. data/test/drawing/tc_bar_series.rb +17 -13
  101. data/test/drawing/tc_cat_axis.rb +3 -3
  102. data/test/drawing/tc_cat_axis_data.rb +23 -13
  103. data/test/drawing/tc_chart.rb +29 -11
  104. data/test/drawing/tc_d_lbls.rb +47 -0
  105. data/test/drawing/tc_data_source.rb +17 -0
  106. data/test/drawing/tc_drawing.rb +11 -5
  107. data/test/drawing/tc_hyperlink.rb +4 -5
  108. data/test/drawing/tc_line_series.rb +9 -11
  109. data/test/drawing/tc_named_axis_data.rb +27 -0
  110. data/test/drawing/tc_num_data.rb +31 -0
  111. data/test/drawing/tc_num_val.rb +29 -0
  112. data/test/drawing/tc_pic.rb +22 -2
  113. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  114. data/test/drawing/tc_pie_series.rb +11 -13
  115. data/test/drawing/tc_scatter_chart.rb +6 -1
  116. data/test/drawing/tc_scatter_series.rb +6 -5
  117. data/test/drawing/tc_series.rb +1 -1
  118. data/test/drawing/tc_str_data.rb +18 -0
  119. data/test/drawing/tc_str_val.rb +21 -0
  120. data/test/drawing/tc_title.rb +16 -0
  121. data/test/drawing/tc_two_cell_anchor.rb +2 -3
  122. data/test/drawing/tc_view_3D.rb +18 -18
  123. data/test/drawing/tc_vml_drawing.rb +25 -0
  124. data/test/drawing/tc_vml_shape.rb +100 -0
  125. data/test/rels/tc_relationship.rb +1 -0
  126. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  127. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  128. data/test/stylesheet/tc_styles.rb +3 -4
  129. data/test/stylesheet/tc_table_style.rb +8 -0
  130. data/test/stylesheet/tc_table_style_element.rb +10 -1
  131. data/test/tc_helper.rb +1 -0
  132. data/test/tc_package.rb +93 -17
  133. data/test/util/tc_simple_typed_list.rb +13 -0
  134. data/test/util/tc_validators.rb +95 -9
  135. data/test/workbook/tc_defined_name.rb +41 -0
  136. data/test/workbook/tc_workbook.rb +5 -3
  137. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  138. data/test/workbook/worksheet/tc_cell.rb +30 -6
  139. data/test/workbook/worksheet/tc_col.rb +9 -0
  140. data/test/workbook/worksheet/tc_comment.rb +57 -0
  141. data/test/workbook/worksheet/tc_comments.rb +57 -0
  142. data/test/workbook/worksheet/tc_conditional_formatting.rb +44 -0
  143. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  144. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  145. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  146. data/test/workbook/worksheet/tc_pane.rb +94 -0
  147. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  148. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  149. data/test/workbook/worksheet/tc_row.rb +36 -12
  150. data/test/workbook/worksheet/tc_selection.rb +94 -0
  151. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  152. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  153. data/test/workbook/worksheet/tc_worksheet.rb +138 -48
  154. metadata +164 -52
  155. data/examples/example.csv +0 -1000
  156. data/lib/axlsx/drawing/cat_axis_data.rb +0 -34
  157. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  158. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  159. data/lib/axlsx/drawing/named_axis_data.rb +0 -36
  160. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  161. data/lib/axlsx/drawing/val_axis_data.rb +0 -27
  162. data/lib/axlsx/util/cbf.rb +0 -333
  163. data/lib/axlsx/util/cfb.rb~ +0 -201
  164. data/lib/axlsx/util/font_tables.rb~ +0 -0
  165. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  166. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  167. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  168. data/lib/axlsx/util/parser.rb~ +0 -6
  169. data/lib/axlsx/util/storage.rb~ +0 -0
  170. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  171. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  172. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  173. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  174. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  175. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  176. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  177. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  178. data/lib/schema/dc.xsd~ +0 -118
  179. data/lib/schema/dcterms.xsd~ +0 -331
  180. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  181. data/test/drawing/tc_val_axis_data.rb +0 -17
  182. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  183. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  184. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  185. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  186. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  187. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
@@ -33,5 +33,11 @@ class TestPatternFill < Test::Unit::TestCase
33
33
  assert_nothing_raised { @item.patternType = :lightUp }
34
34
  assert_equal(@item.patternType, :lightUp)
35
35
  end
36
-
36
+
37
+ def test_to_xml_string
38
+ @item = Axlsx::PatternFill.new :bgColor => Axlsx::Color.new(:rgb => "FF0000"), :fgColor => Axlsx::Color.new(:rgb=>"00FF00")
39
+ doc = Nokogiri::XML(@item.to_xml_string)
40
+ assert(doc.xpath('//color[@rgb="FFFF0000"]'))
41
+ assert(doc.xpath('//color[@rgb="FF00FF00"]'))
42
+ end
37
43
  end
@@ -19,7 +19,7 @@ class TestStyles < Test::Unit::TestCase
19
19
  end
20
20
  def test_add_style_border_hash
21
21
  border_count = @styles.borders.size
22
- s = @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}
22
+ @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}
23
23
  assert_equal(@styles.borders.size, border_count + 1)
24
24
  assert_equal(@styles.borders.last.prs.last.color.rgb, "FFFF0000")
25
25
  assert_raise(ArgumentError) { @styles.add_style :border => {:color => "FFFF0000"} }
@@ -27,7 +27,7 @@ class TestStyles < Test::Unit::TestCase
27
27
  end
28
28
 
29
29
  def test_add_style_border_edges
30
- s = @styles.add_style :border => { :style => :thin, :color => "0000FFFF", :edges => [:top, :bottom] }
30
+ @styles.add_style :border => { :style => :thin, :color => "0000FFFF", :edges => [:top, :bottom] }
31
31
  parts = @styles.borders.last.prs
32
32
  parts.each { |pr| assert_equal(pr.color.rgb, "0000FFFF", "Style is applied to #{pr.name} properly") }
33
33
  assert((parts.map { |pr| pr.name.to_s }.sort && ['bottom', 'top']).size == 2, "specify two edges, and you get two border prs")
@@ -44,7 +44,6 @@ class TestStyles < Test::Unit::TestCase
44
44
  def test_parse_num_fmt
45
45
  f_code = {:format_code => "YYYY/MM"}
46
46
  num_fmt = {:num_fmt => 5}
47
- both = { :format_code => "#000", :num_fmt => 0 }
48
47
  assert_equal(@styles.parse_num_fmt_options, nil, 'noop if neither :format_code or :num_fmt exist')
49
48
  max = @styles.numFmts.map{ |nf| nf.numFmtId }.max
50
49
  @styles.parse_num_fmt_options(f_code)
@@ -181,7 +180,7 @@ class TestStyles < Test::Unit::TestCase
181
180
 
182
181
  def test_basic_add_style_dxf
183
182
  border_count = @styles.borders.size
184
- s = @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}, :type => :dxf
183
+ @styles.add_style :border => {:style => :thin, :color => "FFFF0000"}, :type => :dxf
185
184
  assert_equal(@styles.borders.size, border_count, "styles borders not affected")
186
185
  assert_equal(@styles.dxfs.last.border.prs.last.color.rgb, "FFFF0000")
187
186
  assert_raise(ArgumentError) { @styles.add_style :border => {:color => "FFFF0000"}, :type => :dxf }
@@ -13,6 +13,10 @@ class TestTableStyle < Test::Unit::TestCase
13
13
  assert_equal(@item.name, "fisher")
14
14
  assert_equal(@item.pivot, nil)
15
15
  assert_equal(@item.table, nil)
16
+ ts = Axlsx::TableStyle.new 'price', :pivot => true, :table => true
17
+ assert_equal(ts.name, 'price')
18
+ assert_equal(ts.pivot, true)
19
+ assert_equal(ts.table, true)
16
20
  end
17
21
 
18
22
  def test_name
@@ -33,4 +37,8 @@ class TestTableStyle < Test::Unit::TestCase
33
37
  assert_equal(@item.table, true)
34
38
  end
35
39
 
40
+ def test_to_xml_string
41
+ doc = Nokogiri::XML(@item.to_xml_string)
42
+ assert(doc.xpath("//tableStyle[@name='#{@item.name}']"))
43
+ end
36
44
  end
@@ -13,6 +13,10 @@ class TestTableStyleElement < Test::Unit::TestCase
13
13
  assert_equal(@item.type, nil)
14
14
  assert_equal(@item.size, nil)
15
15
  assert_equal(@item.dxfId, nil)
16
+ options = { :type => :headerRow, :size => 10, :dxfId => 1 }
17
+
18
+ tse = Axlsx::TableStyleElement.new options
19
+ options.each { |key, value| assert_equal(tse.send(key.to_sym), value) }
16
20
  end
17
21
 
18
22
  def test_type
@@ -32,5 +36,10 @@ class TestTableStyleElement < Test::Unit::TestCase
32
36
  assert_nothing_raised { @item.dxfId = 7 }
33
37
  assert_equal(@item.dxfId, 7)
34
38
  end
35
-
39
+
40
+ def test_to_xml_string
41
+ doc = Nokogiri::XML(@item.to_xml_string)
42
+ @item.type = :headerRow
43
+ assert(doc.xpath("//tableStyleElement[@type='#{@item.type.to_s}']"))
44
+ end
36
45
  end
data/test/tc_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
2
+ require 'cover_me' unless RUBY_VERSION == '1.8.7'
2
3
  require 'test/unit'
3
4
  require "axlsx.rb"
data/test/tc_package.rb CHANGED
@@ -1,13 +1,78 @@
1
+ # encoding: UTF-8
1
2
  require 'tc_helper.rb'
2
3
 
3
4
  class TestPackage < Test::Unit::TestCase
4
5
  def setup
5
6
  @package = Axlsx::Package.new
6
7
  ws = @package.workbook.add_worksheet
7
- chart = ws.add_chart Axlsx::Pie3DChart
8
- chart.add_series :data=>[1,2,3], :labels=>["a", "b", "c"]
8
+ ws.add_row ['Can', 'we', 'build it?']
9
+ ws.add_row ['Yes!', 'We', 'can!']
10
+ ws.workbook.add_defined_name("#{ws.name}!A1:C2", :name => '_xlnm.Print_Titles', :hidden => true)
11
+ ws.protect_range('A1:C1')
12
+ ws.protect_range(ws.rows.last.cells)
13
+ ws.add_comment :author => 'alice', :text => 'Hi Bob', :ref => 'A12'
14
+ ws.add_comment :author => 'bob', :text => 'Hi Alice', :ref => 'F19'
15
+ ws.sheet_view do |vs|
16
+ vs.pane do |p|
17
+ p.active_pane = :top_right
18
+ p.state = :split
19
+ p.x_split = 11080
20
+ p.y_split = 5000
21
+ p.top_left_cell = 'C44'
22
+ end
23
+
24
+ vs.add_selection(:top_left, { :active_cell => 'A2', :sqref => 'A2' })
25
+ vs.add_selection(:top_right, { :active_cell => 'I10', :sqref => 'I10' })
26
+ vs.add_selection(:bottom_left, { :active_cell => 'E55', :sqref => 'E55' })
27
+ vs.add_selection(:bottom_right, { :active_cell => 'I57', :sqref => 'I57' })
28
+ end
29
+
30
+ ws.add_chart(Axlsx::Pie3DChart, :title => "これは?", :start_at => [0,3]) do |chart|
31
+ chart.add_series :data=>[1,2,3], :labels=>["a", "b", "c"]
32
+ chart.d_lbls.show_val = true
33
+ chart.d_lbls.d_lbl_pos = :outEnd
34
+ chart.d_lbls.show_percent = true
35
+ end
36
+
37
+ ws.add_chart(Axlsx::Line3DChart, :title => "axis labels") do |chart|
38
+ chart.valAxis.title = 'bob'
39
+ chart.d_lbls.show_val = true
40
+ end
41
+
42
+ ws.add_chart(Axlsx::Bar3DChart, :title => 'bar chart') do |chart|
43
+ chart.add_series :data => [1,4,5], :labels => %w(A B C)
44
+ chart.d_lbls.show_percent = true
45
+ end
46
+
47
+ ws.add_chart(Axlsx::ScatterChart, :title => 'scat man') do |chart|
48
+ chart.add_series :xData => [1,2,3,4], :yData => [4,3,2,1]
49
+ chart.d_lbls.show_val = true
50
+ end
51
+
9
52
  @fname = 'axlsx_test_serialization.xlsx'
53
+ img = File.expand_path('../../examples/image1.jpeg', __FILE__)
54
+ ws.add_image(:image_src => img, :noSelect => true, :noMove => true, :hyperlink=>"http://axlsx.blogspot.com") do |image|
55
+ image.width=720
56
+ image.height=666
57
+ image.hyperlink.tooltip = "Labeled Link"
58
+ image.start_at 5, 5
59
+ end
60
+ ws.add_image :image_src => File.expand_path('../../examples/image1.gif', __FILE__) do |image|
61
+ image.start_at 0, 20
62
+ image.width=360
63
+ image.height=333
64
+ end
65
+ ws.add_image :image_src => File.expand_path('../../examples/image1.png', __FILE__) do |image|
66
+ image.start_at 9, 20
67
+ image.width = 180
68
+ image.height = 167
69
+ end
70
+ ws.add_table 'A1:C1'
71
+ end
10
72
 
73
+ def test_use_autowidth
74
+ @package.use_autowidth = false
75
+ assert(@package.workbook.use_autowidth == false)
11
76
  end
12
77
 
13
78
  def test_core_accessor
@@ -35,30 +100,26 @@ class TestPackage < Test::Unit::TestCase
35
100
  end
36
101
 
37
102
  def test_serialization
38
- fname = 'axlsx_test_serialization.xlsx'
39
103
  assert_nothing_raised do
40
104
  begin
41
- z= @package.serialize(@fname)
42
- zf = Zip::ZipFile.open(@fname)
43
- @package.send(:parts).each{ |part| zf.get_entry(part[:entry]) }
44
- File.delete(@fname)
105
+ @package.serialize(@fname)
106
+ zf = Zip::ZipFile.open(@fname)
107
+ @package.send(:parts).each{ |part| zf.get_entry(part[:entry]) }
108
+ File.delete(@fname)
45
109
  rescue Errno::EACCES
46
- puts "WARNING:: test_serialization requires write access."
110
+ puts "WARNING:: test_serialization requires write access."
47
111
  end
48
- end
49
- end
112
+ end
113
+ end
50
114
 
51
115
  def test_validation
52
116
  assert_equal(@package.validate.size, 0, @package.validate)
53
- #how to test for failure? the internal validations on the models are so strict I cant break anthing.....
117
+ Axlsx::Workbook.send(:class_variable_set, :@@date1904, 9900)
118
+ assert(@package.validate.size > 0)
54
119
  end
55
120
 
56
121
  def test_parts
57
122
  p = @package.send(:parts)
58
- p.each do |part|
59
- #all parts must have :doc, :entry, :schema
60
- assert(part.keys.size == 3 && part.keys.reject{ |k| [:doc, :entry, :schema].include? k}.empty?)
61
- end
62
123
  #all parts have an entry
63
124
  assert_equal(p.select{ |part| part[:entry] =~ /_rels\/\.rels/ }.size, 1, "rels missing")
64
125
  assert_equal(p.select{ |part| part[:entry] =~ /docProps\/core\.xml/ }.size, 1, "core missing")
@@ -72,9 +133,11 @@ class TestPackage < Test::Unit::TestCase
72
133
  assert_equal(p.select{ |part| part[:entry] =~ /xl\/charts\/chart\d\.xml/ }.size, @package.workbook.charts.size, "one or more charts missing")
73
134
  assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/sheet\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet missing")
74
135
  assert_equal(p.select{ |part| part[:entry] =~ /xl\/worksheets\/_rels\/sheet\d\.xml\.rels/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
136
+ assert_equal(p.select{ |part| part[:entry] =~ /xl\/comments\d\.xml/ }.size, @package.workbook.worksheets.size, "one or more sheet rels missing")
137
+
75
138
 
76
139
  #no mystery parts
77
- assert_equal(p.size, 12)
140
+ assert_equal(p.size, 21)
78
141
 
79
142
  end
80
143
 
@@ -102,11 +165,24 @@ class TestPackage < Test::Unit::TestCase
102
165
  def test_content_type_added_with_shared_strings
103
166
  @package.use_shared_strings = true
104
167
  ct = @package.send(:content_types)
105
- assert(ct.select { |ct| ct.ContentType == Axlsx::SHARED_STRINGS_CT }.size == 1)
168
+ assert(ct.select { |type| type.ContentType == Axlsx::SHARED_STRINGS_CT }.size == 1)
106
169
  end
107
170
 
108
171
  def test_name_to_indices
109
172
  assert(Axlsx::name_to_indices('A1') == [0,0])
110
173
  assert(Axlsx::name_to_indices('A100') == [0,99], 'needs to axcept rows that contain 0')
111
174
  end
175
+
176
+ def test_to_stream
177
+ stream = @package.to_stream
178
+ assert(stream.is_a?(StringIO))
179
+ # this is just a roundabout guess for a package as it is build now
180
+ # in testing.
181
+ assert(stream.size > 80000)
182
+ end
183
+
184
+ def test_encrypt
185
+ # this is no where near close to ready yet
186
+ assert(@package.encrypt('your_mom.xlsxl', 'has a password') == false)
187
+ end
112
188
  end
@@ -61,5 +61,18 @@ class TestSimpleTypedList < Test::Unit::TestCase
61
61
  assert_nothing_raised { @list.delete 0 }
62
62
  assert_nothing_raised { @list.delete 9 }
63
63
  end
64
+
65
+ def test_delete
66
+ @list.push 1
67
+ assert(@list.size == 1)
68
+ @list.delete 1
69
+ assert(@list.empty?)
70
+ end
64
71
 
72
+ def test_equality
73
+ @list.push 1
74
+ @list.push 2
75
+ assert_equal(@list, [1,2])
76
+
77
+ end
65
78
  end
@@ -8,15 +8,15 @@ class TestValidators < Test::Unit::TestCase
8
8
  def test_validators
9
9
  #unsigned_int
10
10
  assert_nothing_raised { Axlsx.validate_unsigned_int 1 }
11
- assert_nothing_raised { Axlsx.validate_unsigned_int +1 }
12
- assert_raise(ArgumentError) { Axlsx.validate_unsigned_int -1 }
13
- assert_raise(ArgumentError) { Axlsx.validate_unsigned_int '1' }
11
+ assert_nothing_raised { Axlsx.validate_unsigned_int(+1) }
12
+ assert_raise(ArgumentError) { Axlsx.validate_unsigned_int(-1)}
13
+ assert_raise(ArgumentError) { Axlsx.validate_unsigned_int('1') }
14
14
 
15
15
  #int
16
- assert_nothing_raised { Axlsx.validate_int 1 }
17
- assert_nothing_raised { Axlsx.validate_int -1 }
18
- assert_raise(ArgumentError) { Axlsx.validate_int 'a' }
19
- assert_raise(ArgumentError) { Axlsx.validate_int Array }
16
+ assert_nothing_raised { Axlsx.validate_int(1) }
17
+ assert_nothing_raised { Axlsx.validate_int(-1) }
18
+ assert_raise(ArgumentError) { Axlsx.validate_int('a')}
19
+ assert_raise(ArgumentError) { Axlsx.validate_int(Array) }
20
20
 
21
21
  #boolean (as 0 or 1, :true, :false, true, false, or "true," "false")
22
22
  [0,1,:true, :false, true, false, "true", "false"].each do |v|
@@ -70,6 +70,92 @@ class TestValidators < Test::Unit::TestCase
70
70
  assert_raise(ArgumentError) { Axlsx.validate_relationship_type "http://some.url" }
71
71
  assert_raise(ArgumentError) { Axlsx.validate_relationship_type false }
72
72
 
73
- end
74
- end
73
+ #number_with_unit
74
+ assert_nothing_raised { Axlsx.validate_number_with_unit "210mm" }
75
+ assert_nothing_raised { Axlsx.validate_number_with_unit "8.5in" }
76
+ assert_nothing_raised { Axlsx.validate_number_with_unit "29.7cm" }
77
+ assert_nothing_raised { Axlsx.validate_number_with_unit "120pt" }
78
+ assert_nothing_raised { Axlsx.validate_number_with_unit "0pc" }
79
+ assert_nothing_raised { Axlsx.validate_number_with_unit "12.34pi" }
80
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit nil }
81
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "210" }
82
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit 210 }
83
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "mm" }
84
+ assert_raise(ArgumentError) { Axlsx.validate_number_with_unit "-29cm" }
75
85
 
86
+ #scale_10_400
87
+ assert_nothing_raised { Axlsx.validate_scale_10_400 10 }
88
+ assert_nothing_raised { Axlsx.validate_scale_10_400 100 }
89
+ assert_nothing_raised { Axlsx.validate_scale_10_400 400 }
90
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 9 }
91
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 10.0 }
92
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 400.1 }
93
+ assert_raise(ArgumentError) { Axlsx.validate_scale_10_400 "99" }
94
+
95
+ #scale_0_10_400
96
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 0 }
97
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 10 }
98
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 100 }
99
+ assert_nothing_raised { Axlsx.validate_scale_0_10_400 400 }
100
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 9 }
101
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 10.0 }
102
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 400.1 }
103
+ assert_raise(ArgumentError) { Axlsx.validate_scale_0_10_400 "99" }
104
+
105
+ #page_orientation
106
+ assert_nothing_raised { Axlsx.validate_page_orientation :default }
107
+ assert_nothing_raised { Axlsx.validate_page_orientation :landscape }
108
+ assert_nothing_raised { Axlsx.validate_page_orientation :portrait }
109
+ assert_raise(ArgumentError) { Axlsx.validate_page_orientation nil }
110
+ assert_raise(ArgumentError) { Axlsx.validate_page_orientation 1 }
111
+ assert_raise(ArgumentError) { Axlsx.validate_page_orientation "landscape" }
112
+
113
+ #data_validation_error_style
114
+ [:information, :stop, :warning].each do |sym|
115
+ assert_nothing_raised { Axlsx.validate_data_validation_error_style sym }
116
+ end
117
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
118
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'warning' }
119
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
120
+
121
+ #data_validation_operator
122
+ [:lessThan, :lessThanOrEqual, :equal, :notEqual, :greaterThanOrEqual, :greaterThan, :between, :notBetween].each do |sym|
123
+ assert_nothing_raised { Axlsx.validate_data_validation_operator sym }
124
+ end
125
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
126
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'lessThan' }
127
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
128
+
129
+ #data_validation_type
130
+ [:custom, :data, :decimal, :list, :none, :textLength, :time, :whole].each do |sym|
131
+ assert_nothing_raised { Axlsx.validate_data_validation_type sym }
132
+ end
133
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
134
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'decimal' }
135
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
136
+
137
+ #sheet_view_type
138
+ [:normal, :page_break_preview, :page_layout].each do |sym|
139
+ assert_nothing_raised { Axlsx.validate_sheet_view_type sym }
140
+ end
141
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style :other_symbol }
142
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 'page_layout' }
143
+ assert_raise(ArgumentError) { Axlsx.validate_data_validation_error_style 0 }
144
+
145
+ #active_pane_type
146
+ [:bottom_left, :bottom_right, :top_left, :top_right].each do |sym|
147
+ assert_nothing_raised { Axlsx.validate_pane_type sym }
148
+ end
149
+ assert_raise(ArgumentError) { Axlsx.validate_pane_type :other_symbol }
150
+ assert_raise(ArgumentError) { Axlsx.validate_pane_type 'bottom_left' }
151
+ assert_raise(ArgumentError) { Axlsx.validate_pane_type 0 }
152
+
153
+ #split_state_type
154
+ [:frozen, :frozen_split, :split].each do |sym|
155
+ assert_nothing_raised { Axlsx.validate_split_state_type sym }
156
+ end
157
+ assert_raise(ArgumentError) { Axlsx.validate_split_state_type :other_symbol }
158
+ assert_raise(ArgumentError) { Axlsx.validate_split_state_type 'frozen_split' }
159
+ assert_raise(ArgumentError) { Axlsx.validate_split_state_type 0 }
160
+ end
161
+ end
@@ -0,0 +1,41 @@
1
+ require 'tc_helper'
2
+
3
+ class TestDefinedNames < Test::Unit::TestCase
4
+ def setup
5
+ @dn = Axlsx::DefinedName.new('Sheet1!A1:A1')
6
+ end
7
+
8
+ def test_initialize
9
+ assert_equal('Sheet1!A1:A1', @dn.formula)
10
+ end
11
+
12
+ def test_string_attributes
13
+ Axlsx::DefinedName::STRING_ATTRIBUTES.each do |attr|
14
+ assert_raise(ArgumentError, 'only strings allowed in string attributes') { @dn.send("#{attr}=", 1) }
15
+ assert_nothing_raised { @dn.send("#{attr}=", '_xlnm.Sheet_Title') }
16
+ end
17
+ end
18
+
19
+ def test_boolean_attributes
20
+ Axlsx::DefinedName::BOOLEAN_ATTRIBUTES.each do |attr|
21
+ assert_raise(ArgumentError, 'only booleanish allowed in string attributes') { @dn.send("#{attr}=", 'foo') }
22
+ assert_nothing_raised { @dn.send("#{attr}=", 1) }
23
+ end
24
+
25
+ end
26
+
27
+ def test_local_sheet_id
28
+ assert_raise(ArgumentError, 'local_sheet_id must be an unsigned int') { @dn.local_sheet_id = -1 }
29
+ assert_nothing_raised { @dn.local_sheet_id = 1 }
30
+ end
31
+
32
+ def test_to_xml_string
33
+ assert_raise(ArgumentError, 'name is required for serialization') { @dn.to_xml_string }
34
+ @dn.name = '_xlnm.Print_Titles'
35
+ @dn.hidden = true
36
+ doc = Nokogiri::XML(@dn.to_xml_string)
37
+ assert(doc.xpath("//definedName[@name='_xlnm.Print_Titles']"))
38
+ assert(doc.xpath("//definedName[@hidden='true']"))
39
+ assert_equal('Sheet1!A1:A1', doc.xpath('//definedName').text)
40
+ end
41
+ end
@@ -24,7 +24,10 @@ class TestWorkbook < Test::Unit::TestCase
24
24
  assert_equal(Axlsx::Workbook.date1904, @wb.date1904)
25
25
  end
26
26
 
27
-
27
+ def test_add_defined_name
28
+ @wb.add_defined_name 'Sheet1!1:1', :name => '_xlnm.Print_Titles', :hidden => true
29
+ assert_equal(1, @wb.defined_names.size)
30
+ end
28
31
 
29
32
  def test_shared_strings
30
33
  assert_equal(@wb.use_shared_strings, nil)
@@ -72,14 +75,13 @@ class TestWorkbook < Test::Unit::TestCase
72
75
  assert(@wb.worksheets.size == 1)
73
76
  end
74
77
 
75
-
76
78
  def test_to_xml_string_defined_names
77
79
  @wb.add_worksheet do |sheet|
78
80
  sheet.add_row [1, "two"]
79
81
  sheet.auto_filter = "A1:B1"
80
82
  end
81
83
  doc = Nokogiri::XML(@wb.to_xml_string)
82
- assert_equal(doc.xpath('//xmlns:workbook/xmlns:definedNames/xmlns:definedName').inner_text, @wb.worksheets[0].abs_auto_filter)
84
+ assert_equal(doc.xpath('//xmlns:workbook/xmlns:definedNames/xmlns:definedName').inner_text, @wb.worksheets[0].auto_filter.defined_name)
83
85
  end
84
86
 
85
87
 
@@ -25,26 +25,18 @@ class TestTable < Test::Unit::TestCase
25
25
 
26
26
  end
27
27
 
28
- def test_charts
29
- assert(@ws.drawing.charts.empty?)
30
- chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
31
- assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
32
- chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
33
- assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
34
- end
35
-
36
28
  def test_pn
37
- table = @ws.add_table("A1:D5")
29
+ @ws.add_table("A1:D5")
38
30
  assert_equal(@ws.tables.first.pn, "tables/table1.xml")
39
31
  end
40
32
 
41
33
  def test_rId
42
- table = @ws.add_table("A1:D5")
34
+ @ws.add_table("A1:D5")
43
35
  assert_equal(@ws.tables.first.rId, "rId1")
44
36
  end
45
37
 
46
38
  def test_index
47
- table = @ws.add_table("A1:D5")
39
+ @ws.add_table("A1:D5")
48
40
  assert_equal(@ws.tables.first.index, @ws.workbook.tables.index(@ws.tables.first))
49
41
  end
50
42
 
@@ -33,7 +33,7 @@ class TestCell < Test::Unit::TestCase
33
33
  assert_equal(@c.index, @row.cells.index(@c))
34
34
  end
35
35
 
36
- def test_index
36
+ def test_pos
37
37
  assert_equal(@c.pos, [@c.index, @c.row.index])
38
38
  end
39
39
 
@@ -197,19 +197,17 @@ class TestCell < Test::Unit::TestCase
197
197
  end
198
198
 
199
199
  def test_merge_with_string
200
- assert_equal(@c.row.worksheet.merged_cells.size, 0)
201
200
  @c.row.add_cell 2
202
201
  @c.row.add_cell 3
203
202
  @c.merge "A2"
204
- assert_equal(@c.row.worksheet.merged_cells.last, "A1:A2")
203
+ assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:A2")
205
204
  end
206
205
 
207
206
  def test_merge_with_cell
208
- assert_equal(@c.row.worksheet.merged_cells.size, 0)
209
207
  @c.row.add_cell 2
210
208
  @c.row.add_cell 3
211
209
  @c.merge @row.cells.last
212
- assert_equal(@c.row.worksheet.merged_cells.last, "A1:C1")
210
+ assert_equal(@c.row.worksheet.send(:merged_cells).last, "A1:C1")
213
211
  end
214
212
 
215
213
  def test_ssti
@@ -244,9 +242,35 @@ class TestCell < Test::Unit::TestCase
244
242
  c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
245
243
  assert_equal(c_xml.xpath("/c[@s=1]").size, 1)
246
244
  end
245
+
246
+ def test_to_xml_string_nil
247
+ @c.value = nil
248
+ c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
249
+ assert_equal(c_xml.xpath("/c[@s=1]").size, 1)
250
+ end
251
+
252
+ def test_to_xml_string_with_run
253
+ @c.b = true
254
+ @c.type = :string
255
+ @c.value = "a"
256
+ @c.font_name = 'arial'
257
+ @c.color = 'FF0000'
258
+ c_xml = Nokogiri::XML(@c.to_xml_string(1,1))
259
+ assert(c_xml.xpath("//b"))
260
+ end
261
+ def test_to_xml_string_formula
262
+ p = Axlsx::Package.new
263
+ ws = p.workbook.add_worksheet do |sheet|
264
+ sheet.add_row ["=IF(2+2=4,4,5)"]
265
+ end
266
+ doc = Nokogiri::XML(ws.to_xml_string)
267
+ assert(doc.xpath("//f[@text()='IF(2+2=4,4,5)']"))
268
+
269
+ end
270
+
247
271
  def test_to_xml
248
272
  # TODO This could use some much more stringent testing related to the xml content generated!
249
- row = @ws.add_row [Time.now, Date.today, true, 1, 1.0, "text", "=sum(A1:A2)"]
273
+ @ws.add_row [Time.now, Date.today, true, 1, 1.0, "text", "=sum(A1:A2)"]
250
274
  schema = Nokogiri::XML::Schema(File.open(Axlsx::SML_XSD))
251
275
  doc = Nokogiri::XML(@ws.to_xml_string)
252
276
  errors = []
@@ -6,6 +6,13 @@ class TestCol < Test::Unit::TestCase
6
6
  @col = Axlsx::Col.new 1, 1
7
7
  end
8
8
 
9
+ def test_initialize
10
+ options = { :width => 12, :collapsed => true, :hidden => true, :outlineLevel => 1, :phonetic => true, :style => 1}
11
+
12
+ col = Axlsx::Col.new 0, 0, options
13
+ options.each{ |key, value| assert_equal(col.send(key.to_sym), value) }
14
+ end
15
+
9
16
  def test_min_max_required
10
17
  assert_raise(ArgumentError, 'min and max must be specified when creating a new column') { Axlsx::Col.new }
11
18
  assert_raise(ArgumentError, 'min and max must be specified when creating a new column') { Axlsx::Col.new nil, nil }
@@ -53,6 +60,8 @@ class TestCol < Test::Unit::TestCase
53
60
 
54
61
  def test_style
55
62
  assert_equal(@col.style, nil)
63
+ @col.style = 1
64
+ assert_equal(@col.style, 1)
56
65
  #TODO check that the style specified is actually in the styles xfs collection
57
66
  end
58
67
 
@@ -0,0 +1,57 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestComment < Test::Unit::TestCase
4
+ def setup
5
+ p = Axlsx::Package.new
6
+ wb = p.workbook
7
+ @ws = wb.add_worksheet
8
+ @c1 = @ws.add_comment :ref => 'A1', :text => 'penut machine', :author => 'crank'
9
+ @c2 = @ws.add_comment :ref => 'C3', :text => 'rust bucket', :author => 'PO'
10
+ end
11
+
12
+ def test_initailize
13
+ assert_raise(ArgumentError) { Axlsx::Comment.new }
14
+ end
15
+
16
+ def test_author
17
+ assert(@c1.author == 'crank')
18
+ assert(@c2.author == 'PO')
19
+ end
20
+
21
+ def test_text
22
+ assert(@c1.text == 'penut machine')
23
+ assert(@c2.text == 'rust bucket')
24
+ end
25
+
26
+ def test_author_index
27
+ assert_equal(@c1.author_index, 1)
28
+ assert_equal(@c2.author_index, 0)
29
+ end
30
+
31
+ def test_ref
32
+ assert(@c1.ref == 'A1')
33
+ assert(@c2.ref == 'C3')
34
+ end
35
+
36
+ def test_vml_shape
37
+ pos = Axlsx::name_to_indices(@c1.ref)
38
+ assert(@c1.vml_shape.is_a?(Axlsx::VmlShape))
39
+ assert(@c1.vml_shape.column == pos[0])
40
+ assert(@c1.vml_shape.row == pos[1])
41
+ assert(@c1.vml_shape.row == pos[1])
42
+ assert_equal(pos[0], @c1.vml_shape.left_column)
43
+ assert(@c1.vml_shape.top_row == pos[1])
44
+ assert_equal(pos[0] + 2 , @c1.vml_shape.right_column)
45
+ assert(@c1.vml_shape.bottom_row == pos[1]+4)
46
+ end
47
+
48
+ def to_xml_string
49
+ doc = Nokogiri::XML(@c1.to_xml_string)
50
+ assert_equal(doc.xpath("//comment[@ref='#{@c1.ref}']").size, 1)
51
+ assert_equal(doc.xpath("//comment[@authorId='#{@c1.author_index.to}']").size, 1)
52
+ assert_equal(doc.xpath("//t[text()='#{@c1.author}']").size, 1)
53
+ assert_equal(doc.xpath("//t[text()='#{@c1.text}']").size, 1)
54
+ end
55
+
56
+ end
57
+