axlsx 1.1.7 → 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 (164) hide show
  1. data/.yardopts +5 -2
  2. data/CHANGELOG.md +39 -0
  3. data/README.md +84 -46
  4. data/Rakefile +3 -2
  5. data/examples/basic_charts.rb +8 -0
  6. data/examples/chart_colors.rb +18 -3
  7. data/examples/example.rb +106 -46
  8. data/examples/example.xlsx +0 -0
  9. data/examples/example_streamed.xlsx +0 -0
  10. data/examples/extractive.pdf +0 -0
  11. data/examples/no-use_autowidth.xlsx +0 -0
  12. data/examples/scraping_html.rb +91 -0
  13. data/examples/shared_strings_example.xlsx +0 -0
  14. data/lib/axlsx/content_type/content_type.rb +2 -0
  15. data/lib/axlsx/content_type/default.rb +21 -12
  16. data/lib/axlsx/content_type/override.rb +22 -11
  17. data/lib/axlsx/doc_props/app.rb +36 -32
  18. data/lib/axlsx/doc_props/core.rb +9 -5
  19. data/lib/axlsx/drawing/ax_data_source.rb +7 -6
  20. data/lib/axlsx/drawing/axis.rb +48 -27
  21. data/lib/axlsx/drawing/bar_3D_chart.rb +49 -45
  22. data/lib/axlsx/drawing/bar_series.rb +1 -0
  23. data/lib/axlsx/drawing/cat_axis.rb +42 -38
  24. data/lib/axlsx/drawing/chart.rb +63 -52
  25. data/lib/axlsx/drawing/d_lbls.rb +100 -0
  26. data/lib/axlsx/drawing/drawing.rb +7 -4
  27. data/lib/axlsx/drawing/line_3D_chart.rb +3 -10
  28. data/lib/axlsx/drawing/num_data_source.rb +1 -1
  29. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -7
  30. data/lib/axlsx/drawing/scatter_chart.rb +2 -8
  31. data/lib/axlsx/drawing/two_cell_anchor.rb +41 -9
  32. data/lib/axlsx/drawing/view_3D.rb +41 -31
  33. data/lib/axlsx/drawing/vml_drawing.rb +1 -1
  34. data/lib/axlsx/package.rb +11 -11
  35. data/lib/axlsx/rels/relationship.rb +3 -3
  36. data/lib/axlsx/stylesheet/styles.rb +1 -1
  37. data/lib/axlsx/util/constants.rb +4 -0
  38. data/lib/axlsx/util/simple_typed_list.rb +15 -8
  39. data/lib/axlsx/util/validators.rb +2 -2
  40. data/lib/axlsx/version.rb +2 -7
  41. data/lib/axlsx/workbook/defined_name.rb +174 -0
  42. data/lib/axlsx/workbook/defined_names.rb +21 -0
  43. data/lib/axlsx/workbook/workbook.rb +39 -14
  44. data/lib/axlsx/workbook/worksheet/auto_filter.rb +34 -0
  45. data/lib/axlsx/workbook/worksheet/cell.rb +25 -2
  46. data/lib/axlsx/workbook/worksheet/col.rb +15 -0
  47. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  48. data/lib/axlsx/workbook/worksheet/comments.rb +8 -0
  49. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  50. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  51. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  52. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -0
  53. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  54. data/lib/axlsx/workbook/worksheet/page_setup.rb +9 -0
  55. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  56. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  57. data/lib/axlsx/workbook/worksheet/row.rb +1 -1
  58. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  59. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +24 -0
  60. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  61. data/lib/axlsx/workbook/worksheet/worksheet.rb +300 -293
  62. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +57 -0
  63. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +64 -0
  64. data/lib/axlsx.rb +21 -14
  65. data/test/content_type/tc_content_type.rb +1 -6
  66. data/test/doc_props/tc_core.rb +1 -1
  67. data/test/drawing/tc_axis.rb +8 -0
  68. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  69. data/test/drawing/tc_bar_series.rb +1 -2
  70. data/test/drawing/tc_chart.rb +8 -6
  71. data/test/drawing/tc_d_lbls.rb +47 -0
  72. data/test/drawing/tc_drawing.rb +5 -4
  73. data/test/drawing/tc_line_series.rb +1 -1
  74. data/test/drawing/tc_pie_3D_chart.rb +4 -8
  75. data/test/drawing/tc_pie_series.rb +1 -1
  76. data/test/drawing/tc_scatter_series.rb +1 -1
  77. data/test/drawing/tc_series.rb +1 -1
  78. data/test/drawing/tc_view_3D.rb +18 -18
  79. data/test/tc_package.rb +18 -1
  80. data/test/workbook/tc_defined_name.rb +41 -0
  81. data/test/workbook/tc_workbook.rb +5 -3
  82. data/test/workbook/worksheet/table/tc_table.rb +0 -8
  83. data/test/workbook/worksheet/tc_cell.rb +2 -4
  84. data/test/workbook/worksheet/tc_page_setup.rb +20 -3
  85. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  86. data/test/workbook/worksheet/tc_row.rb +2 -2
  87. data/test/workbook/worksheet/tc_selection.rb +1 -1
  88. data/test/workbook/worksheet/tc_worksheet.rb +53 -34
  89. metadata +93 -101
  90. data/examples/axis-titles.xlsx +0 -0
  91. data/examples/basic_charts.xlsx +0 -0
  92. data/examples/chart_colors.xlsx +0 -0
  93. data/examples/charts.xlsx +0 -0
  94. data/examples/conditional_formatting/getting_barred.xlsx +0 -0
  95. data/examples/doc/_index.html +0 -84
  96. data/examples/doc/class_list.html +0 -47
  97. data/examples/doc/css/common.css +0 -1
  98. data/examples/doc/css/full_list.css +0 -55
  99. data/examples/doc/css/style.css +0 -322
  100. data/examples/doc/file_list.html +0 -46
  101. data/examples/doc/frames.html +0 -13
  102. data/examples/doc/index.html +0 -84
  103. data/examples/doc/js/app.js +0 -205
  104. data/examples/doc/js/full_list.js +0 -173
  105. data/examples/doc/js/jquery.js +0 -16
  106. data/examples/doc/method_list.html +0 -46
  107. data/examples/doc/top-level-namespace.html +0 -95
  108. data/examples/examples_saved.xlsx +0 -0
  109. data/examples/extractive.xlsx +0 -0
  110. data/examples/fish.xlsx +0 -0
  111. data/examples/pareto.rb +0 -28
  112. data/examples/pareto.xlsx +0 -0
  113. data/examples/pie_chart_excel.xlsx +0 -0
  114. data/examples/pie_chart_saved.xlsx +0 -0
  115. data/examples/sheet_protection.xlsx +0 -0
  116. data/examples/sheet_view.xlsx +0 -0
  117. data/examples/two_cell_anchor_image.xlsx +0 -0
  118. data/examples/~$example.xlsx +0 -0
  119. data/lib/axlsx/drawing/ax_data_source.rb~ +0 -55
  120. data/lib/axlsx/drawing/data_source.rb~ +0 -51
  121. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  122. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  123. data/lib/axlsx/drawing/num_data.rb~ +0 -51
  124. data/lib/axlsx/drawing/num_data_source.rb~ +0 -54
  125. data/lib/axlsx/drawing/num_val.rb~ +0 -40
  126. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  127. data/lib/axlsx/drawing/ref.rb~ +0 -41
  128. data/lib/axlsx/drawing/str_data.rb~ +0 -58
  129. data/lib/axlsx/drawing/str_val.rb~ +0 -35
  130. data/lib/axlsx/drawing/vml_drawing.rb~ +0 -6
  131. data/lib/axlsx/drawing/vml_shape.rb~ +0 -61
  132. data/lib/axlsx/util/cbf.rb +0 -333
  133. data/lib/axlsx/util/cfb.rb~ +0 -201
  134. data/lib/axlsx/util/font_tables.rb~ +0 -0
  135. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  136. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  137. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  138. data/lib/axlsx/util/parser.rb~ +0 -6
  139. data/lib/axlsx/util/storage.rb~ +0 -0
  140. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  141. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  142. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  143. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  144. data/lib/axlsx/workbook/worksheet/comment.rb~ +0 -91
  145. data/lib/axlsx/workbook/worksheet/comments.rb~ +0 -86
  146. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  147. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  148. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  149. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  150. data/lib/schema/dc.xsd~ +0 -118
  151. data/lib/schema/dcterms.xsd~ +0 -331
  152. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  153. data/test/drawing/tc_data_source.rb~ +0 -30
  154. data/test/drawing/tc_num_data.rb~ +0 -35
  155. data/test/drawing/tc_num_val.rb~ +0 -29
  156. data/test/drawing/tc_str_data.rb~ +0 -30
  157. data/test/drawing/tc_str_val.rb~ +0 -26
  158. data/test/drawing/tc_vml_drawing.rb~ +0 -0
  159. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  160. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  161. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  162. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  163. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  164. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
@@ -0,0 +1,57 @@
1
+ module Axlsx
2
+
3
+ # A wraper class for comments that defines its on worksheet
4
+ # serailization
5
+ class WorksheetComments
6
+
7
+ # Creates a new WorksheetComments object
8
+ # param [Worksheet] worksheet The worksheet comments in thes object belong to
9
+ def initialize(worksheet)
10
+ raise ArugumentError, 'You must provide a worksheet' unless worksheet.is_a?(Worksheet)
11
+ @worksheet = worksheet
12
+ end
13
+
14
+ attr_reader :worksheet
15
+
16
+ # The comments for this worksheet.
17
+ # @return [Comments]
18
+ def comments
19
+ @comments ||= Comments.new(worksheet)
20
+ end
21
+
22
+ # Adds a comment
23
+ # @param [Hash] options
24
+ # @see Comments#add_comment
25
+ def add_comment(options={})
26
+ comments.add_comment(options)
27
+ end
28
+
29
+ # The relationships defined by this objects comments collection
30
+ # @return [Relationships]
31
+ def relationships
32
+ return [] unless has_comments?
33
+ comments.relationships
34
+ end
35
+
36
+
37
+ # Helper method to tell us if there are comments in the comments collection
38
+ # @return [Boolean]
39
+ def has_comments?
40
+ !comments.empty?
41
+ end
42
+
43
+ # The index in the worksheet's relationships for the VML drawing that will render the comments
44
+ # @return [Integer]
45
+ def index
46
+ worksheet.relationships.index { |r| r.Type == VML_DRAWING_R } + 1
47
+ end
48
+
49
+ # Seraalize the object
50
+ # @param [String] str
51
+ # @return [String]
52
+ def to_xml_string(str = '')
53
+ return unless has_comments?
54
+ str << "<legacyDrawing r:id='rId#{index}' />"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,64 @@
1
+ module Axlsx
2
+
3
+ # This is a utility class for serialing the drawing node in a
4
+ # worksheet. Drawing objects have their own serialization that exports
5
+ # a drawing document. This is only for the single node in the
6
+ # worksheet
7
+ class WorksheetDrawing
8
+
9
+ # Creates a new WorksheetDrawing
10
+ # @param [Worksheet] worksheet
11
+ def initialize(worksheet)
12
+ raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
13
+ @worksheet = worksheet
14
+ @drawing = nil
15
+ end
16
+
17
+ attr_reader :worksheet
18
+
19
+ attr_reader :drawing
20
+
21
+ # adds a chart to the drawing object
22
+ # @param [Class] chart_type The type of chart to add
23
+ # @param [Hash] options Options to pass on to the drawing and chart
24
+ # @see Worksheet#add_chart
25
+ def add_chart(chart_type, options)
26
+ @drawing ||= Drawing.new worksheet
27
+ drawing.add_chart(chart_type, options)
28
+ end
29
+
30
+ # adds an image to the drawing object
31
+ # @param [Hash] options Options to pass on to the drawing and image
32
+ # @see Worksheet#add_image
33
+ def add_image(options)
34
+ @drawing ||= Drawing.new worksheet
35
+ drawing.add_image(options)
36
+ end
37
+
38
+ # helper method to tell us if the drawing has something in it or not
39
+ # @return [Boolean]
40
+ def has_drawing?
41
+ @drawing.is_a? Drawing
42
+ end
43
+
44
+ # The relationship required by this object
45
+ # @return [Relationship]
46
+ def relationship
47
+ return unless has_drawing?
48
+ Relationship.new(DRAWING_R, "../#{drawing.pn}")
49
+ end
50
+
51
+ # returns the index of the worksheet releationship that defines this drawing.
52
+ # @return [Integer]
53
+ def index
54
+ worksheet.relationships.index{ |r| r.Type == DRAWING_R } +1
55
+ end
56
+
57
+ # Serialize the drawing for the worksheet
58
+ # @param [String] str
59
+ def to_xml_string(str = '')
60
+ return unless has_drawing?
61
+ str << "<drawing r:id='rId#{index}'/>"
62
+ end
63
+ end
64
+ end
data/lib/axlsx.rb CHANGED
@@ -1,16 +1,11 @@
1
1
  # encoding: UTF-8
2
+ require 'htmlentities'
2
3
  require 'axlsx/version.rb'
3
4
 
4
5
  require 'axlsx/util/simple_typed_list.rb'
5
6
  require 'axlsx/util/constants.rb'
6
7
  require 'axlsx/util/validators.rb'
7
8
 
8
- #not even close to being ready but it does not break anything so it stays for now.
9
- # needs a full re-write to use agile-encryption properly
10
- # require 'axlsx/util/storage.rb'
11
- # require 'axlsx/util/cbf.rb'
12
- # require 'axlsx/util/ms_off_crypto.rb'
13
-
14
9
  # to be included with parsable intitites.
15
10
  #require 'axlsx/util/parser.rb'
16
11
 
@@ -44,24 +39,36 @@ end
44
39
 
45
40
  # xlsx generation with charts, images, automated column width, customizable styles and full schema validation. Axlsx excels at helping you generate beautiful Office Open XML Spreadsheet documents without having to understand the entire ECMA specification. Check out the README for some examples of how easy it is. Best of all, you can validate your xlsx file before serialization so you know for sure that anything generated is going to load on your client's machine.
46
41
  module Axlsx
42
+
47
43
  # determines the cell range for the items provided
48
- def self.cell_range(items)
49
- return "" unless items.first.is_a? Cell
50
- ref = "'#{items.first.row.worksheet.name}'!" +
51
- "#{items.first.r_abs}"
52
- ref += ":#{items.last.r_abs}" if items.size > 1
53
- ref
44
+ def self.cell_range(cells, absolute=true)
45
+ return "" unless cells.first.is_a? Cell
46
+ sort_cells(cells)
47
+ reference = "#{cells.first.reference(absolute)}:#{cells.last.reference(absolute)}"
48
+ absolute ? "'#{cells.first.row.worksheet.name}'!#{reference}" : reference
49
+ end
50
+
51
+ # sorts the array of cells provided to start from the minimum x,y to
52
+ # the maximum x.y#
53
+ # @param [Array] cells
54
+ # @return [Array]
55
+ def self.sort_cells(cells)
56
+ cells.sort { |x, y| [x.index, x.row.index] <=> [y.index, y.row.index] }
54
57
  end
55
58
 
59
+ #global reference html entity encoding
60
+ # @return [HtmlEntities]
61
+ def self.coder
62
+ @@coder ||= ::HTMLEntities.new
63
+ end
64
+
56
65
  # returns the x, y position of a cell
57
66
  def self.name_to_indices(name)
58
67
  raise ArgumentError, 'invalid cell name' unless name.size > 1
59
68
  v = name[/[A-Z]+/].reverse.chars.reduce({:base=>1, :i=>0}) do |val, c|
60
69
  val[:i] += ((c.bytes.first - 64) * val[:base]); val[:base] *= 26; val
61
70
  end
62
-
63
71
  [v[:i]-1, ((name[/[1-9][0-9]*/]).to_i)-1]
64
-
65
72
  end
66
73
 
67
74
  # converts the column index into alphabetical values.
@@ -9,12 +9,7 @@ class TestContentType < Test::Unit::TestCase
9
9
 
10
10
  def test_valid_document
11
11
  schema = Nokogiri::XML::Schema(File.open(Axlsx::CONTENT_TYPES_XSD))
12
- errors = []
13
- schema.validate(@doc).each do |error|
14
- puts error.message
15
- errors << error
16
- end
17
- assert_equal(errors.size, 0, "[Content Types].xml Invalid" + errors.map{ |e| e.message }.to_s)
12
+ assert(schema.validate(@doc).map{ |e| puts e.message; e.message }.empty?)
18
13
  end
19
14
 
20
15
  def test_pre_built_types
@@ -5,7 +5,7 @@ class TestCore < Test::Unit::TestCase
5
5
  def setup
6
6
  @core = Axlsx::Core.new
7
7
  # could still see some false positives if the second changes between the next two calls
8
- @time = Time.now.strftime('%Y-%m-%dT%H:%M:%S')
8
+ @time = Time.now.strftime('%Y-%m-%dT%H:%M:%SZ')
9
9
  @doc = Nokogiri::XML(@core.to_xml_string)
10
10
  end
11
11
 
@@ -19,6 +19,14 @@ class TestAxis < Test::Unit::TestCase
19
19
  assert_equal('Foo', @axis.title.text)
20
20
  end
21
21
 
22
+ def test_color
23
+ @axis.color = "00FF00"
24
+ str = '<?xml version="1.0" encoding="UTF-8"?>'
25
+ str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '" xmlns:a="' << Axlsx::XML_NS_A << '">'
26
+ doc = Nokogiri::XML(@axis.to_xml_string(str))
27
+ assert(doc.xpath("//a:srgbClr[@val='00FF00']"))
28
+ end
29
+
22
30
  def test_cell_based_axis_title
23
31
  p = Axlsx::Package.new
24
32
  p.workbook.add_worksheet(:name=>'foosheet') do |sheet|
@@ -15,15 +15,15 @@ class TestBar3DChart < Test::Unit::TestCase
15
15
  def test_initialization
16
16
  assert_equal(@chart.grouping, :clustered, "grouping defualt incorrect")
17
17
  assert_equal(@chart.series_type, Axlsx::BarSeries, "series type incorrect")
18
- assert_equal(@chart.barDir, :bar, " bar direction incorrect")
19
- assert(@chart.catAxis.is_a?(Axlsx::CatAxis), "category axis not created")
20
- assert(@chart.valAxis.is_a?(Axlsx::ValAxis), "value access not created")
18
+ assert_equal(@chart.bar_dir, :bar, " bar direction incorrect")
19
+ assert(@chart.cat_axis.is_a?(Axlsx::CatAxis), "category axis not created")
20
+ assert(@chart.val_axis.is_a?(Axlsx::ValAxis), "value access not created")
21
21
  end
22
22
 
23
23
  def test_bar_direction
24
- assert_raise(ArgumentError, "require valid bar direction") { @chart.barDir = :left }
25
- assert_nothing_raised("allow valid bar direction") { @chart.barDir = :col }
26
- assert(@chart.barDir == :col)
24
+ assert_raise(ArgumentError, "require valid bar direction") { @chart.bar_dir = :left }
25
+ assert_nothing_raised("allow valid bar direction") { @chart.bar_dir = :col }
26
+ assert(@chart.bar_dir == :col)
27
27
  end
28
28
 
29
29
  def test_grouping
@@ -34,15 +34,15 @@ class TestBar3DChart < Test::Unit::TestCase
34
34
 
35
35
 
36
36
  def test_gapWidth
37
- assert_raise(ArgumentError, "require valid gap width") { @chart.gapWidth = 200 }
38
- assert_nothing_raised("allow valid gapWidth") { @chart.gapWidth = "200%" }
39
- assert(@chart.gapWidth == "200%")
37
+ assert_raise(ArgumentError, "require valid gap width") { @chart.gap_width = 200 }
38
+ assert_nothing_raised("allow valid gapWidth") { @chart.gap_width = "200%" }
39
+ assert(@chart.gap_width == "200%")
40
40
  end
41
41
 
42
42
  def test_gapDepth
43
- assert_raise(ArgumentError, "require valid gapDepth") { @chart.gapDepth = 200 }
44
- assert_nothing_raised("allow valid gapDepth") { @chart.gapDepth = "200%" }
45
- assert(@chart.gapDepth == "200%")
43
+ assert_raise(ArgumentError, "require valid gap_depth") { @chart.gap_depth = 200 }
44
+ assert_nothing_raised("allow valid gap_depth") { @chart.gap_depth = "200%" }
45
+ assert(@chart.gap_depth == "200%")
46
46
  end
47
47
 
48
48
  def test_shape
@@ -5,7 +5,7 @@ class TestBarSeries < 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::Bar3DChart, :title => "fishery"
8
+ @chart = @ws.add_chart Axlsx::Bar3DChart, :title => "fishery"
9
9
  @series = @chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :colors => ['FF0000', '00FF00', '0000FF'], :shape => :cone
10
10
  end
11
11
 
@@ -33,6 +33,5 @@ class TestBarSeries < Test::Unit::TestCase
33
33
  assert_equal(doc.xpath("//c:dPt/c:idx[@val='#{index}']").size,1)
34
34
  assert_equal(doc.xpath("//c:dPt/c:spPr/a:solidFill/a:srgbClr[@val='#{@series.colors[index]}']").size,1)
35
35
  end
36
- assert_equal(doc.xpath("//c:shape[@val='#{@series.shape.to_s}']").size, 1)
37
36
  end
38
37
  end
@@ -73,15 +73,17 @@ class TestChart < Test::Unit::TestCase
73
73
  def test_pn
74
74
  assert_equal(@chart.pn, "charts/chart1.xml")
75
75
  end
76
-
76
+
77
+ def test_d_lbls
78
+ assert_equal(nil, @chart.instance_values[:d_lbls])
79
+ @chart.d_lbls.d_lbl_pos = :t
80
+ assert(@chart.d_lbls.is_a?(Axlsx::DLbls), 'DLbls instantiated on access')
81
+ end
82
+
77
83
  def test_to_xml_string
78
84
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
79
85
  doc = Nokogiri::XML(@chart.to_xml_string)
80
- errors = []
81
- schema.validate(doc).each do |error|
82
- errors.push error
83
- puts error.message
84
- end
86
+ errors = schema.validate(doc).map { |error| puts error.message; error }
85
87
  assert(errors.empty?, "error free validation")
86
88
  end
87
89
 
@@ -0,0 +1,47 @@
1
+ require 'tc_helper'
2
+
3
+ class TestDLbls < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @d_lbls = Axlsx::DLbls.new(Axlsx::Pie3DChart)
7
+ end
8
+
9
+ def test_initialization
10
+ assert_equal(:bestFit, @d_lbls.d_lbl_pos)
11
+ Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
12
+ assert_equal(false, @d_lbls.send(attr))
13
+ end
14
+ end
15
+
16
+ def test_initialization_with_optoins
17
+ options_hash = Hash[*[Axlsx::DLbls::BOOLEAN_ATTRIBUTES.map { |name| [name, true] }] ]
18
+ d_lbls = Axlsx::DLbls.new(Axlsx::Pie3DChart, options_hash.merge( { :d_lbl_pos => :t }))
19
+ Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
20
+ assert_equal(true, d_lbls.send(attr), "boolean attributes set by options")
21
+ end
22
+ assert_equal(:t, d_lbls.d_lbl_pos, "d_lbl_pos set by options")
23
+ end
24
+ def test_d_lbl_pos
25
+ assert_raise(ArgumentError, 'invlaid label positions are rejected') { @d_lbls.d_lbl_pos = :upside_down }
26
+ assert_nothing_raised('accepts valid label position') { @d_lbls.d_lbl_pos = :ctr }
27
+ end
28
+
29
+ def test_boolean_attributes
30
+ Axlsx::DLbls::BOOLEAN_ATTRIBUTES.each do |attr|
31
+ assert_raise(ArgumentError, "rejects non boolean value for #{attr}") { @d_lbls.send("#{attr}=", :foo) }
32
+ assert_nothing_raised("accepts boolean value for #{attr}") { @d_lbls.send("#{attr}=", true) }
33
+ assert_nothing_raised("accepts boolean value for #{attr}") { @d_lbls.send("#{attr}=", false) }
34
+ end
35
+ end
36
+
37
+ def test_to_xml_string
38
+ str = '<?xml version="1.0" encoding="UTF-8"?>'
39
+ str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '" xmlns:a="' << Axlsx::XML_NS_A << '" xmlns:r="' << Axlsx::XML_NS_R << '">'
40
+ @d_lbls.to_xml_string(str)
41
+ str << '</c:chartSpace>'
42
+ doc = Nokogiri::XML(str)
43
+ @d_lbls.instance_values.each do |name, value|
44
+ assert(doc.xpath("//c:#{Axlsx::camel(name, false)}[@val='#{value}']"), "#{name} is properly serialized")
45
+ end
46
+ end
47
+ end
@@ -9,8 +9,6 @@ class TestDrawing < Test::Unit::TestCase
9
9
 
10
10
  def test_initialization
11
11
  assert(@ws.workbook.drawings.empty?)
12
- assert_equal(@ws.drawing, @ws.workbook.drawings.last, "drawing is added to workbook")
13
- assert(@ws.drawing.anchors.is_a?(Axlsx::SimpleTypedList) && @ws.drawing.anchors.empty?, "anchor list is created and empty")
14
12
  end
15
13
 
16
14
  def test_add_chart
@@ -39,7 +37,6 @@ class TestDrawing < Test::Unit::TestCase
39
37
  assert(image.is_a?(Axlsx::Pic))
40
38
  end
41
39
  def test_charts
42
- assert(@ws.drawing.charts.empty?)
43
40
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
44
41
  assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
45
42
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
@@ -47,23 +44,26 @@ class TestDrawing < Test::Unit::TestCase
47
44
  end
48
45
 
49
46
  def test_pn
47
+ @ws.add_chart(Axlsx::Pie3DChart)
50
48
  assert_equal(@ws.drawing.pn, "drawings/drawing1.xml")
51
49
  end
52
50
 
53
51
  def test_rels_pn
52
+ @ws.add_chart(Axlsx::Pie3DChart)
54
53
  assert_equal(@ws.drawing.rels_pn, "drawings/_rels/drawing1.xml.rels")
55
54
  end
56
55
 
57
56
  def test_rId
57
+ @ws.add_chart(Axlsx::Pie3DChart)
58
58
  assert_equal(@ws.drawing.rId, "rId1")
59
59
  end
60
60
 
61
61
  def test_index
62
+ @ws.add_chart(Axlsx::Pie3DChart)
62
63
  assert_equal(@ws.drawing.index, @ws.workbook.drawings.index(@ws.drawing))
63
64
  end
64
65
 
65
66
  def test_relationships
66
- assert(@ws.drawing.relationships.empty?)
67
67
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
68
68
  assert_equal(@ws.drawing.relationships.size, 1, "adding a chart adds a relationship")
69
69
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
@@ -72,6 +72,7 @@ class TestDrawing < Test::Unit::TestCase
72
72
 
73
73
  def test_to_xml
74
74
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
75
+ @ws.add_chart(Axlsx::Pie3DChart)
75
76
  doc = Nokogiri::XML(@ws.drawing.to_xml_string)
76
77
  errors = []
77
78
  schema.validate(doc).each do |error|
@@ -5,7 +5,7 @@ class TestLineSeries < 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::Line3DChart, :title => "fishery"
8
+ chart = @ws.add_chart Axlsx::Line3DChart, :title => "fishery"
9
9
  @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :color => "#FF0000"
10
10
  end
11
11
 
@@ -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,7 +5,7 @@ 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"
8
+ chart = @ws.add_chart Axlsx::Pie3DChart, :title => "fishery"
9
9
  @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :colors => ["FF0000", "00FF00", "0000FF"]
10
10
  end
11
11
 
@@ -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
 
@@ -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
 
data/test/tc_package.rb CHANGED
@@ -7,6 +7,9 @@ class TestPackage < Test::Unit::TestCase
7
7
  ws = @package.workbook.add_worksheet
8
8
  ws.add_row ['Can', 'we', 'build it?']
9
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)
10
13
  ws.add_comment :author => 'alice', :text => 'Hi Bob', :ref => 'A12'
11
14
  ws.add_comment :author => 'bob', :text => 'Hi Alice', :ref => 'F19'
12
15
  ws.sheet_view do |vs|
@@ -26,11 +29,25 @@ class TestPackage < Test::Unit::TestCase
26
29
 
27
30
  ws.add_chart(Axlsx::Pie3DChart, :title => "これは?", :start_at => [0,3]) do |chart|
28
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
29
35
  end
30
36
 
31
37
  ws.add_chart(Axlsx::Line3DChart, :title => "axis labels") do |chart|
32
38
  chart.valAxis.title = 'bob'
39
+ chart.d_lbls.show_val = true
33
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
34
51
 
35
52
  @fname = 'axlsx_test_serialization.xlsx'
36
53
  img = File.expand_path('../../examples/image1.jpeg', __FILE__)
@@ -120,7 +137,7 @@ class TestPackage < Test::Unit::TestCase
120
137
 
121
138
 
122
139
  #no mystery parts
123
- assert_equal(p.size, 19)
140
+ assert_equal(p.size, 21)
124
141
 
125
142
  end
126
143
 
@@ -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