axlsx 1.1.4 → 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 (196) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +39 -0
  3. data/README.md +108 -31
  4. data/Rakefile +11 -3
  5. data/examples/basic_charts.rb +54 -0
  6. data/examples/chart_colors.rb +17 -2
  7. data/examples/data_validation.rb +50 -0
  8. data/examples/example.rb +130 -47
  9. data/examples/example.xlsx +0 -0
  10. data/examples/example_streamed.xlsx +0 -0
  11. data/examples/extractive.pdf +0 -0
  12. data/examples/extractive.rb +3 -0
  13. data/examples/no-use_autowidth.xlsx +0 -0
  14. data/examples/scraping_html.rb +91 -0
  15. data/examples/shared_strings_example.xlsx +0 -0
  16. data/examples/sheet_protection.rb +10 -0
  17. data/examples/sheet_view.rb +34 -0
  18. data/examples/two_cell_anchor_image.rb +11 -0
  19. data/lib/axlsx/content_type/content_type.rb +2 -0
  20. data/lib/axlsx/content_type/default.rb +30 -15
  21. data/lib/axlsx/content_type/override.rb +29 -14
  22. data/lib/axlsx/doc_props/app.rb +161 -104
  23. data/lib/axlsx/doc_props/core.rb +9 -5
  24. data/lib/axlsx/drawing/ax_data_source.rb +7 -6
  25. data/lib/axlsx/drawing/axis.rb +82 -36
  26. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  27. data/lib/axlsx/drawing/bar_series.rb +2 -1
  28. data/lib/axlsx/drawing/cat_axis.rb +43 -39
  29. data/lib/axlsx/drawing/chart.rb +65 -54
  30. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  31. data/lib/axlsx/drawing/drawing.rb +20 -8
  32. data/lib/axlsx/drawing/graphic_frame.rb +2 -1
  33. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  34. data/lib/axlsx/drawing/num_data.rb +2 -2
  35. data/lib/axlsx/drawing/num_data_source.rb +4 -1
  36. data/lib/axlsx/drawing/pic.rb +44 -4
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  38. data/lib/axlsx/drawing/scatter_chart.rb +2 -8
  39. data/lib/axlsx/drawing/title.rb +21 -9
  40. data/lib/axlsx/drawing/two_cell_anchor.rb +46 -9
  41. data/lib/axlsx/drawing/view_3D.rb +41 -31
  42. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  43. data/lib/axlsx/drawing/vml_shape.rb +125 -0
  44. data/lib/axlsx/package.rb +44 -16
  45. data/lib/axlsx/rels/relationship.rb +3 -3
  46. data/lib/axlsx/rels/relationships.rb +1 -11
  47. data/lib/axlsx/stylesheet/gradient_fill.rb +1 -1
  48. data/lib/axlsx/stylesheet/styles.rb +1 -1
  49. data/lib/axlsx/stylesheet/table_style.rb +3 -3
  50. data/lib/axlsx/util/constants.rb +28 -0
  51. data/lib/axlsx/util/simple_typed_list.rb +15 -21
  52. data/lib/axlsx/util/validators.rb +80 -7
  53. data/lib/axlsx/version.rb +2 -7
  54. data/lib/axlsx/workbook/defined_name.rb +174 -0
  55. data/lib/axlsx/workbook/defined_names.rb +21 -0
  56. data/lib/axlsx/workbook/workbook.rb +65 -13
  57. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  58. data/lib/axlsx/workbook/worksheet/cell.rb +35 -7
  59. data/lib/axlsx/workbook/worksheet/col.rb +15 -0
  60. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  61. data/lib/axlsx/workbook/worksheet/comment.rb +101 -0
  62. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  63. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  64. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  65. data/lib/axlsx/workbook/worksheet/data_validation.rb +245 -0
  66. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  67. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  68. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  69. data/lib/axlsx/workbook/worksheet/page_setup.rb +113 -0
  70. data/lib/axlsx/workbook/worksheet/pane.rb +144 -0
  71. data/lib/axlsx/workbook/worksheet/print_options.rb +63 -0
  72. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  73. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  74. data/lib/axlsx/workbook/worksheet/row.rb +36 -20
  75. data/lib/axlsx/workbook/worksheet/selection.rb +111 -0
  76. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  77. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  78. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +224 -0
  79. data/lib/axlsx/workbook/worksheet/sheet_view.rb +379 -0
  80. data/lib/axlsx/workbook/worksheet/table.rb +2 -2
  81. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  82. data/lib/axlsx/workbook/worksheet/worksheet.rb +377 -255
  83. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  84. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  85. data/lib/axlsx.rb +30 -15
  86. data/test/content_type/tc_content_type.rb +1 -6
  87. data/test/doc_props/tc_app.rb +31 -1
  88. data/test/doc_props/tc_core.rb +3 -1
  89. data/test/drawing/tc_axis.rb +38 -3
  90. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  91. data/test/drawing/tc_bar_series.rb +1 -2
  92. data/test/drawing/tc_cat_axis.rb +3 -3
  93. data/test/drawing/tc_chart.rb +29 -9
  94. data/test/drawing/tc_d_lbls.rb +47 -0
  95. data/test/drawing/tc_drawing.rb +11 -5
  96. data/test/drawing/tc_hyperlink.rb +4 -5
  97. data/test/drawing/tc_line_series.rb +7 -3
  98. data/test/drawing/tc_num_data.rb +5 -1
  99. data/test/drawing/tc_pic.rb +22 -2
  100. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  101. data/test/drawing/tc_pie_series.rb +7 -2
  102. data/test/drawing/tc_scatter_chart.rb +6 -1
  103. data/test/drawing/tc_scatter_series.rb +1 -1
  104. data/test/drawing/tc_series.rb +1 -1
  105. data/test/drawing/tc_title.rb +16 -0
  106. data/test/drawing/tc_two_cell_anchor.rb +1 -2
  107. data/test/drawing/tc_view_3D.rb +18 -18
  108. data/test/drawing/tc_vml_drawing.rb +25 -0
  109. data/test/drawing/tc_vml_shape.rb +100 -0
  110. data/test/rels/tc_relationship.rb +1 -0
  111. data/test/stylesheet/tc_gradient_fill.rb +8 -0
  112. data/test/stylesheet/tc_pattern_fill.rb +7 -1
  113. data/test/stylesheet/tc_styles.rb +3 -4
  114. data/test/stylesheet/tc_table_style.rb +8 -0
  115. data/test/stylesheet/tc_table_style_element.rb +10 -1
  116. data/test/tc_helper.rb +1 -0
  117. data/test/tc_package.rb +93 -17
  118. data/test/util/tc_simple_typed_list.rb +13 -0
  119. data/test/util/tc_validators.rb +95 -9
  120. data/test/workbook/tc_defined_name.rb +41 -0
  121. data/test/workbook/tc_workbook.rb +5 -3
  122. data/test/workbook/worksheet/table/tc_table.rb +3 -11
  123. data/test/workbook/worksheet/tc_cell.rb +30 -6
  124. data/test/workbook/worksheet/tc_col.rb +9 -0
  125. data/test/workbook/worksheet/tc_comment.rb +57 -0
  126. data/test/workbook/worksheet/tc_comments.rb +57 -0
  127. data/test/workbook/worksheet/tc_conditional_formatting.rb +44 -0
  128. data/test/workbook/worksheet/tc_data_bar.rb +1 -1
  129. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  130. data/test/workbook/worksheet/tc_page_setup.rb +138 -0
  131. data/test/workbook/worksheet/tc_pane.rb +94 -0
  132. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  133. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  134. data/test/workbook/worksheet/tc_row.rb +32 -14
  135. data/test/workbook/worksheet/tc_selection.rb +94 -0
  136. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  137. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  138. data/test/workbook/worksheet/tc_worksheet.rb +138 -48
  139. metadata +140 -80
  140. data/examples/#extractive.csv# +0 -0
  141. data/examples/#extractive.rb# +0 -45
  142. data/examples/chart_colors.rb~ +0 -0
  143. data/examples/chart_colors.xlsx +0 -0
  144. data/examples/colored_series_data.xlsx +0 -0
  145. data/examples/conditional_formatting/getting_barred.xlsx +0 -0
  146. data/examples/example.csv +0 -1000
  147. data/examples/extractive.csv +0 -1
  148. data/examples/extractive.csv~ +0 -1
  149. data/examples/extractive.rb~ +0 -3
  150. data/examples/extractive.xlsx +0 -0
  151. data/examples/stack.rb +0 -21
  152. data/examples/stack.rb~ +0 -27
  153. data/examples/stack.xlsx +0 -0
  154. data/examples/~$chart_colors.xlsx +0 -0
  155. data/examples/~$extractive.xlsx +0 -0
  156. data/lib/axlsx/drawing/ax_data_source.rb~ +0 -55
  157. data/lib/axlsx/drawing/data_source.rb~ +0 -51
  158. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  159. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  160. data/lib/axlsx/drawing/num_data.rb~ +0 -51
  161. data/lib/axlsx/drawing/num_data_source.rb~ +0 -54
  162. data/lib/axlsx/drawing/num_val.rb~ +0 -40
  163. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  164. data/lib/axlsx/drawing/ref.rb~ +0 -41
  165. data/lib/axlsx/drawing/str_data.rb~ +0 -58
  166. data/lib/axlsx/drawing/str_val.rb~ +0 -35
  167. data/lib/axlsx/util/cbf.rb +0 -333
  168. data/lib/axlsx/util/cfb.rb~ +0 -201
  169. data/lib/axlsx/util/font_tables.rb~ +0 -0
  170. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  171. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  172. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  173. data/lib/axlsx/util/parser.rb~ +0 -6
  174. data/lib/axlsx/util/storage.rb~ +0 -0
  175. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  176. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  177. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  178. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  179. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  180. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  181. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  182. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  183. data/lib/schema/dc.xsd~ +0 -118
  184. data/lib/schema/dcterms.xsd~ +0 -331
  185. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  186. data/test/drawing/tc_data_source.rb~ +0 -30
  187. data/test/drawing/tc_num_data.rb~ +0 -35
  188. data/test/drawing/tc_num_val.rb~ +0 -29
  189. data/test/drawing/tc_str_data.rb~ +0 -30
  190. data/test/drawing/tc_str_val.rb~ +0 -26
  191. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  192. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  193. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  194. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  195. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  196. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
@@ -6,7 +6,7 @@ class TestPic < Test::Unit::TestCase
6
6
  @p = Axlsx::Package.new
7
7
  ws = @p.workbook.add_worksheet
8
8
  @test_img = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
9
- @image = ws.add_image :image_src => @test_img
9
+ @image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?"
10
10
  end
11
11
 
12
12
  def teardown
@@ -14,11 +14,31 @@ class TestPic < Test::Unit::TestCase
14
14
 
15
15
  def test_initialization
16
16
  assert_equal(@p.workbook.images.first, @image)
17
+ assert_equal(@image.file_name, 'image1.jpeg')
17
18
  assert_equal(@image.image_src, @test_img)
18
19
  end
19
20
 
21
+ def test_anchor_swapping
22
+ #swap from one cell to two cell when end_at is specified
23
+ assert(@image.anchor.is_a?(Axlsx::OneCellAnchor))
24
+ start_at = @image.anchor.from
25
+ @image.end_at 10,5
26
+ assert(@image.anchor.is_a?(Axlsx::TwoCellAnchor))
27
+ assert_equal(start_at.col, @image.anchor.from.col)
28
+ assert_equal(start_at.row, @image.anchor.from.row)
29
+ assert_equal(10,@image.anchor.to.col)
30
+ assert_equal(5, @image.anchor.to.row)
31
+
32
+ #swap from two cell to one cell when width or height are specified
33
+ @image.width = 200
34
+ assert(@image.anchor.is_a?(Axlsx::OneCellAnchor))
35
+ assert_equal(start_at.col, @image.anchor.from.col)
36
+ assert_equal(start_at.row, @image.anchor.from.row)
37
+ assert_equal(200, @image.width)
38
+
39
+ end
20
40
  def test_hyperlink
21
- assert_equal(@image.hyperlink, nil)
41
+ assert_equal(@image.hyperlink.href, "https://github.com/randym")
22
42
  @image.hyperlink = "http://axlsx.blogspot.com"
23
43
  assert_equal(@image.hyperlink.href, "http://axlsx.blogspot.com")
24
44
  end
@@ -6,26 +6,22 @@ class TestPie3DChart < Test::Unit::TestCase
6
6
  p = Axlsx::Package.new
7
7
  ws = p.workbook.add_worksheet
8
8
  @row = ws.add_row ["one", 1, Time.now]
9
- @chart = ws.drawing.add_chart Axlsx::Pie3DChart, :title => "fishery"
9
+ @chart = ws.add_chart Axlsx::Pie3DChart, :title => "fishery"
10
10
  end
11
11
 
12
12
  def teardown
13
13
  end
14
14
 
15
15
  def test_initialization
16
- assert_equal(@chart.view3D.rotX, 30, "view 3d default rotX incorrect")
17
- assert_equal(@chart.view3D.perspective, 30, "view 3d default perspective incorrect")
16
+ assert_equal(@chart.view_3D.rot_x, 30, "view 3d default rot_x incorrect")
17
+ assert_equal(@chart.view_3D.perspective, 30, "view_3d default perspective incorrect")
18
18
  assert_equal(@chart.series_type, Axlsx::PieSeries, "series type incorrect")
19
19
  end
20
20
 
21
21
  def test_to_xml
22
22
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
23
23
  doc = Nokogiri::XML(@chart.to_xml_string)
24
- errors = []
25
- schema.validate(doc).each do |error|
26
- errors.push error
27
- puts error.message
28
- end
24
+ errors = schema.validate(doc).map {|error| puts error.message; error }
29
25
  assert(errors.empty?, "error free validation")
30
26
  end
31
27
 
@@ -5,8 +5,8 @@ class TestPieSeries < Test::Unit::TestCase
5
5
  def setup
6
6
  p = Axlsx::Package.new
7
7
  @ws = p.workbook.add_worksheet :name=>"hmmm"
8
- chart = @ws.drawing.add_chart Axlsx::Pie3DChart, :title => "fishery"
9
- @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob"
8
+ chart = @ws.add_chart Axlsx::Pie3DChart, :title => "fishery"
9
+ @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :colors => ["FF0000", "00FF00", "0000FF"]
10
10
  end
11
11
 
12
12
  def test_initialize
@@ -22,6 +22,11 @@ class TestPieSeries < Test::Unit::TestCase
22
22
  assert(@series.explosion == 20)
23
23
  end
24
24
 
25
+ def test_to_xml_string
26
+ doc = Nokogiri::XML(@series.to_xml_string)
27
+ assert(doc.xpath("//srgbClr[@val='#{@series.colors[0]}']"))
28
+
29
+ end
25
30
  #TODO test unique serialization parts
26
31
 
27
32
  end
@@ -4,7 +4,7 @@ class TestScatterChart < Test::Unit::TestCase
4
4
  def setup
5
5
  @p = Axlsx::Package.new
6
6
  @chart = nil
7
- ws = @p.workbook.add_worksheet do |sheet|
7
+ @p.workbook.add_worksheet do |sheet|
8
8
  sheet.add_row ["First", 1, 5, 7, 9]
9
9
  sheet.add_row ["", 1, 25, 49, 81]
10
10
  sheet.add_row ["Second", 5, 2, 14, 9]
@@ -22,6 +22,11 @@ class TestScatterChart < Test::Unit::TestCase
22
22
  def teardown
23
23
  end
24
24
 
25
+ def test_scatter_style
26
+ @chart.scatterStyle = :marker
27
+ assert(@chart.scatterStyle == :marker)
28
+ assert_raise(ArgumentError) { @chart.scatterStyle = :buckshot }
29
+ end
25
30
  def test_initialization
26
31
  assert_equal(@chart.scatterStyle, :lineMarker, "scatterStyle defualt incorrect")
27
32
  assert_equal(@chart.series_type, Axlsx::ScatterSeries, "series type incorrect")
@@ -5,7 +5,7 @@ class TestScatterSeries < Test::Unit::TestCase
5
5
  def setup
6
6
  p = Axlsx::Package.new
7
7
  @ws = p.workbook.add_worksheet :name=>"hmmm"
8
- @chart = @ws.drawing.add_chart Axlsx::ScatterChart, :title => "Scatter Chart"
8
+ @chart = @ws.add_chart Axlsx::ScatterChart, :title => "Scatter Chart"
9
9
  @series = @chart.add_series :xData=>[1,2,4], :yData=>[1,3,9], :title=>"exponents", :color => 'FF0000'
10
10
  end
11
11
 
@@ -5,7 +5,7 @@ class TestSeries < Test::Unit::TestCase
5
5
  def setup
6
6
  p = Axlsx::Package.new
7
7
  @ws = p.workbook.add_worksheet :name=>"hmmm"
8
- chart = @ws.drawing.add_chart Axlsx::Chart, :title => "fishery"
8
+ chart = @ws.add_chart Axlsx::Chart, :title => "fishery"
9
9
  @series = chart.add_series :title=>"bob"
10
10
  end
11
11
 
@@ -1,3 +1,5 @@
1
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../"
2
+
1
3
  require 'tc_helper.rb'
2
4
 
3
5
  class TestTitle < Test::Unit::TestCase
@@ -30,4 +32,18 @@ class TestTitle < Test::Unit::TestCase
30
32
  assert(@title.text == "one")
31
33
  end
32
34
 
35
+ def test_to_xml_string_text
36
+ @chart.title.text = 'foo'
37
+ doc = Nokogiri::XML(@chart.to_xml_string)
38
+ assert_equal(1, doc.xpath('//c:rich').size)
39
+ assert_equal(1, doc.xpath("//a:t[text()='foo']").size)
40
+ end
41
+
42
+ def test_to_xml_string_cell
43
+ @chart.title.cell = @row.cells.first
44
+ doc = Nokogiri::XML(@chart.to_xml_string)
45
+ assert_equal(1, doc.xpath('//c:strCache').size)
46
+ assert_equal(1, doc.xpath('//c:v[text()="one"]').size)
47
+ end
48
+
33
49
  end
@@ -5,8 +5,7 @@ class TestTwoCellAnchor < Test::Unit::TestCase
5
5
  def setup
6
6
  p = Axlsx::Package.new
7
7
  @ws = p.workbook.add_worksheet
8
- row = @ws.add_row ["one", 1, Time.now]
9
- title = Axlsx::Title.new
8
+ @ws.add_row ["one", 1, Time.now]
10
9
  chart = @ws.add_chart Axlsx::Bar3DChart
11
10
  @anchor = chart.graphic_frame.anchor
12
11
  end
@@ -9,33 +9,33 @@ class TestView3D < Test::Unit::TestCase
9
9
  end
10
10
 
11
11
  def test_options
12
- v = Axlsx::View3D.new :rotX => 10, :rotY => 5, :hPercent => "30%", :depthPercent => "45%", :rAngAx => false, :perspective => 10
13
- assert_equal(v.rotX, 10)
14
- assert_equal(v.rotY, 5)
15
- assert_equal(v.hPercent, "30%")
16
- assert_equal(v.depthPercent, "45%")
17
- assert_equal(v.rAngAx, false)
12
+ v = Axlsx::View3D.new :rot_x => 10, :rot_y => 5, :h_percent => "30%", :depth_percent => "45%", :r_ang_ax => false, :perspective => 10
13
+ assert_equal(v.rot_x, 10)
14
+ assert_equal(v.rot_y, 5)
15
+ assert_equal(v.h_percent, "30%")
16
+ assert_equal(v.depth_percent, "45%")
17
+ assert_equal(v.r_ang_ax, false)
18
18
  assert_equal(v.perspective, 10)
19
19
  end
20
20
 
21
- def test_rotX
22
- assert_raise(ArgumentError) {@view.rotX = "bob"}
23
- assert_nothing_raised {@view.rotX = -90}
21
+ def test_rot_x
22
+ assert_raise(ArgumentError) {@view.rot_x = "bob"}
23
+ assert_nothing_raised {@view.rot_x = -90}
24
24
  end
25
25
 
26
- def test_rotY
27
- assert_raise(ArgumentError) {@view.rotY = "bob"}
28
- assert_nothing_raised {@view.rotY = 90}
26
+ def test_rot_y
27
+ assert_raise(ArgumentError) {@view.rot_y = "bob"}
28
+ assert_nothing_raised {@view.rot_y = 90}
29
29
  end
30
30
 
31
- def test_hPercent
32
- assert_raise(ArgumentError) {@view.hPercent = "bob"}
33
- assert_nothing_raised {@view.hPercent = "500%"}
31
+ def test_h_percent
32
+ assert_raise(ArgumentError) {@view.h_percent = "bob"}
33
+ assert_nothing_raised {@view.h_percent = "500%"}
34
34
  end
35
35
 
36
- def test_depthPercent
37
- assert_raise(ArgumentError) {@view.depthPercent = "bob"}
38
- assert_nothing_raised {@view.depthPercent = "20%"}
36
+ def test_depth_percent
37
+ assert_raise(ArgumentError) {@view.depth_percent = "bob"}
38
+ assert_nothing_raised {@view.depth_percent = "20%"}
39
39
  end
40
40
 
41
41
 
@@ -0,0 +1,25 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestVmlDrawing < Test::Unit::TestCase
4
+
5
+ def setup
6
+ p = Axlsx::Package.new
7
+ wb = p.workbook
8
+ @ws = wb.add_worksheet
9
+ @ws.add_comment :ref => 'A1', :text => 'penut machine', :author => 'crank'
10
+ @ws.add_comment :ref => 'C3', :text => 'rust bucket', :author => 'PO'
11
+ @vml_drawing = @ws.comments.vml_drawing
12
+ end
13
+
14
+ def test_initialize
15
+ assert_raise(ArgumentError) { Axlsx::VmlDrawing.new }
16
+ end
17
+
18
+ def test_to_xml_string
19
+ str = @vml_drawing.to_xml_string()
20
+ doc = Nokogiri::XML(str)
21
+ assert_equal(doc.xpath("//v:shape").size, 2)
22
+ assert(doc.xpath("//o:idmap[@o:data='#{@ws.index+1}']"))
23
+ end
24
+
25
+ end
@@ -0,0 +1,100 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestVmlShape < Test::Unit::TestCase
4
+
5
+ def setup
6
+ p = Axlsx::Package.new
7
+ wb = p.workbook
8
+ @ws = wb.add_worksheet
9
+ @ws.add_comment :ref => 'A1', :text => 'penut machine', :author => 'crank'
10
+ @ws.add_comment :ref => 'C3', :text => 'rust bucket', :author => 'PO'
11
+ @comments = @ws.comments
12
+ end
13
+
14
+ def test_initialize
15
+ assert_raise(ArgumentError) { Axlsx::VmlDrawing.new }
16
+ end
17
+
18
+ def test_row
19
+ shape = @comments.first.vml_shape
20
+ assert_equal(shape.row, 0)
21
+ shape = @comments.last.vml_shape
22
+ assert_equal(shape.row, 2)
23
+ end
24
+
25
+ def test_column
26
+ shape = @comments.first.vml_shape
27
+ assert_equal(shape.column, 0)
28
+ shape = @comments.last.vml_shape
29
+ assert_equal(shape.column, 2)
30
+ end
31
+
32
+ def test_left_column
33
+ shape = @comments.first.vml_shape
34
+ shape.left_column = 3
35
+ assert(shape.left_column == 3)
36
+ assert_raise(ArgumentError) { shape.left_column = [] }
37
+ end
38
+
39
+ def test_left_offset
40
+ shape = @comments.first.vml_shape
41
+ shape.left_offset = 3
42
+ assert(shape.left_offset == 3)
43
+ assert_raise(ArgumentError) { shape.left_offset = [] }
44
+ end
45
+
46
+ def test_right_column
47
+ shape = @comments.first.vml_shape
48
+ shape.right_column = 3
49
+ assert(shape.right_column == 3)
50
+ assert_raise(ArgumentError) { shape.right_column = [] }
51
+ end
52
+
53
+ def test_right_offset
54
+ shape = @comments.first.vml_shape
55
+ shape.right_offset = 3
56
+ assert(shape.right_offset == 3)
57
+ assert_raise(ArgumentError) { shape.right_offset = [] }
58
+ end
59
+
60
+ def test_top_offset
61
+ shape = @comments.first.vml_shape
62
+ shape.top_offset = 3
63
+ assert(shape.top_offset == 3)
64
+ assert_raise(ArgumentError) { shape.top_offset = [] }
65
+ end
66
+
67
+ def test_bottom_offset
68
+ shape = @comments.first.vml_shape
69
+ shape.bottom_offset = 3
70
+ assert(shape.bottom_offset == 3)
71
+ assert_raise(ArgumentError) { shape.bottom_offset = [] }
72
+ end
73
+
74
+ def test_bottom_row
75
+ shape = @comments.first.vml_shape
76
+ shape.bottom_row = 3
77
+ assert(shape.bottom_row == 3)
78
+ assert_raise(ArgumentError) { shape.bottom_row = [] }
79
+ end
80
+
81
+ def test_top_row
82
+ shape = @comments.first.vml_shape
83
+ shape.top_row = 3
84
+ assert(shape.top_row == 3)
85
+ assert_raise(ArgumentError) { shape.top_row = [] }
86
+ end
87
+
88
+ def test_to_xml_string
89
+ str = @comments.vml_drawing.to_xml_string()
90
+ doc = Nokogiri::XML(str)
91
+ assert_equal(doc.xpath("//v:shape").size, 2)
92
+ @comments.each do |comment|
93
+ shape = comment.vml_shape
94
+ assert(doc.xpath("//v:shape/x:ClientData/x:Row[text()='#{shape.row}']").size == 1)
95
+ assert(doc.xpath("//v:shape/x:ClientData/x:Column[text()='#{shape.column}']").size == 1)
96
+ assert(doc.xpath("//v:shape/x:ClientData/x:Anchor[text()='#{shape.left_column}, #{shape.left_offset}, #{shape.top_row}, #{shape.top_offset}, #{shape.right_column}, #{shape.right_offset}, #{shape.bottom_row}, #{shape.bottom_offset}']").size == 1)
97
+ end
98
+ end
99
+
100
+ end
@@ -10,6 +10,7 @@ class TestRelationships < Test::Unit::TestCase
10
10
  def test_type
11
11
  assert_raise(ArgumentError) { Axlsx::Relationship.new 'type', 'target' }
12
12
  assert_nothing_raised { Axlsx::Relationship.new Axlsx::WORKSHEET_R, 'target' }
13
+ assert_nothing_raised { Axlsx::Relationship.new Axlsx::COMMENT_R, 'target' }
13
14
  end
14
15
 
15
16
  def test_target_mode
@@ -61,4 +61,12 @@ class TestGradientFill < Test::Unit::TestCase
61
61
  assert(@item.stop.size == 1)
62
62
  assert(@item.stop.last.is_a?(Axlsx::GradientStop))
63
63
  end
64
+
65
+ def test_to_xml_string
66
+ @item.stop << Axlsx::GradientStop.new(Axlsx::Color.new(:rgb => "000000"), 0.5)
67
+ @item.stop << Axlsx::GradientStop.new(Axlsx::Color.new(:rgb => "FFFFFF"), 0.5)
68
+ @item.type = :path
69
+ doc = Nokogiri::XML(@item.to_xml_string)
70
+ assert(doc.xpath("//color[@rgb='FF000000']"))
71
+ end
64
72
  end
@@ -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