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
@@ -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,10 @@
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
- require 'axlsx/util/storage.rb'
8
-
9
- #not even close to being ready but it does not break anything so it stays for now.
10
- # needs a full re-write to use agile-encryption properly
11
- require 'axlsx/util/cbf.rb'
12
- require 'axlsx/util/ms_off_crypto.rb'
13
-
14
8
 
15
9
  # to be included with parsable intitites.
16
10
  #require 'axlsx/util/parser.rb'
@@ -45,23 +39,36 @@ end
45
39
 
46
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.
47
41
  module Axlsx
42
+
48
43
  # determines the cell range for the items provided
49
- def self.cell_range(items)
50
- return "" unless items.first.is_a? Cell
51
- ref = "'#{items.first.row.worksheet.name}'!" +
52
- "#{items.first.r_abs}"
53
- ref += ":#{items.last.r_abs}" if items.size > 1
54
- 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
55
49
  end
56
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] }
57
+ end
58
+
59
+ #global reference html entity encoding
60
+ # @return [HtmlEntities]
61
+ def self.coder
62
+ @@coder ||= ::HTMLEntities.new
63
+ end
64
+
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.
@@ -84,4 +91,12 @@ module Axlsx
84
91
  Axlsx::col_ref(c_index).to_s << (r_index+1).to_s
85
92
  end
86
93
 
94
+ # performs the increadible feat of changing snake_case to CamelCase
95
+ # @param [String] s The snake case string to camelize
96
+ # @return [String]
97
+ def self.camel(s="", all_caps = true)
98
+ s = s.capitalize if all_caps
99
+ s.gsub(/_(.)/){ $1.upcase }
100
+ end
101
+
87
102
  end
@@ -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
@@ -1,9 +1,39 @@
1
1
  require 'tc_helper.rb'
2
2
 
3
3
  class TestApp < Test::Unit::TestCase
4
+ def setup
5
+ options = {
6
+ :'Template' => 'Foo.xlt',
7
+ :'Manager' => 'Penny',
8
+ :'Company' => "Bob's Repair",
9
+ :'Pages' => 1,
10
+ :'Words' => 2,
11
+ :'Characters' => 7,
12
+ :'PresentationFormat' => 'any',
13
+ :'Lines' => 1,
14
+ :'Paragraphs' => 1,
15
+ :'Slides' => 4,
16
+ :'Notes' => 1,
17
+ :'TotalTime' => 2,
18
+ :'HidddenSlides' => 3,
19
+ :'MMClips' => 10,
20
+ :'ScaleCrop' => true,
21
+ :'LinksUpToDate' => true,
22
+ :'CharactersWithSpaces' => 9,
23
+ :'SharedDoc' => false,
24
+ :'HyperlinkBase' => 'foo',
25
+ :'HyperlInksChanged' => false,
26
+ :'Application' => 'axlsx',
27
+ :'AppVersion' => '1.1.5',
28
+ :'DocSecurity' => 0
29
+ }
30
+
31
+ @app = Axlsx::App.new options
32
+
33
+ end
4
34
  def test_valid_document
5
35
  schema = Nokogiri::XML::Schema(File.open(Axlsx::APP_XSD))
6
- doc = Nokogiri::XML(Axlsx::App.new.to_xml_string)
36
+ doc = Nokogiri::XML(@app.to_xml_string)
7
37
  errors = []
8
38
  schema.validate(doc).each do |error|
9
39
  errors << error
@@ -4,6 +4,8 @@ class TestCore < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @core = Axlsx::Core.new
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:%SZ')
7
9
  @doc = Nokogiri::XML(@core.to_xml_string)
8
10
  end
9
11
 
@@ -18,7 +20,7 @@ class TestCore < Test::Unit::TestCase
18
20
  end
19
21
 
20
22
  def test_populates_created
21
- assert_equal(@doc.xpath('//dcterms:created').text, Time.now.strftime('%Y-%m-%dT%H:%M:%S'), "dcterms:created incorrect")
23
+ assert_equal(@doc.xpath('//dcterms:created').text, @time, "dcterms:created incorrect")
22
24
  end
23
25
 
24
26
  def test_populates_default_name
@@ -2,8 +2,10 @@ require 'tc_helper.rb'
2
2
 
3
3
  class TestAxis < Test::Unit::TestCase
4
4
  def setup
5
- @axis = Axlsx::Axis.new 12345, 54321
5
+
6
+ @axis = Axlsx::Axis.new 12345, 54321, :gridlines => false, :title => 'Foo'
6
7
  end
8
+
7
9
  def teardown
8
10
  end
9
11
 
@@ -13,7 +15,30 @@ class TestAxis < Test::Unit::TestCase
13
15
  assert_equal(@axis.tickLblPos, :nextTo, "tick label position default incorrect")
14
16
  assert_equal(@axis.crosses, :autoZero, "tick label position default incorrect")
15
17
  assert(@axis.scaling.is_a?(Axlsx::Scaling) && @axis.scaling.orientation == :minMax, "scaling default incorrect")
16
- assert_raise(ArgumentError) { Axlsx::Axis.new -1234, 'abcd' }
18
+ assert_raise(ArgumentError) { Axlsx::Axis.new( -1234, 'abcd') }
19
+ assert_equal('Foo', @axis.title.text)
20
+ end
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
+
30
+ def test_cell_based_axis_title
31
+ p = Axlsx::Package.new
32
+ p.workbook.add_worksheet(:name=>'foosheet') do |sheet|
33
+ sheet.add_row ['battle victories']
34
+ sheet.add_row ['bird', 1, 2, 1]
35
+ sheet.add_row ['cat', 7, 9, 10]
36
+ sheet.add_chart(Axlsx::Line3DChart) do |chart|
37
+ chart.add_series :data => sheet['B2:D2'], :labels => sheet['B1']
38
+ chart.valAxis.title = sheet['A1']
39
+ assert_equal('battle victories', chart.valAxis.title.text)
40
+ end
41
+ end
17
42
  end
18
43
 
19
44
  def test_axis_position
@@ -48,5 +73,15 @@ class TestAxis < Test::Unit::TestCase
48
73
  assert_raise(ArgumentError, "requires valid gridlines") { @axis.gridlines = 'alice' }
49
74
  assert_nothing_raised("accepts valid crosses") { @axis.gridlines = false }
50
75
  end
51
-
76
+
77
+ def test_to_xml_string
78
+ str = '<?xml version="1.0" encoding="UTF-8"?>'
79
+ str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '" xmlns:a="' << Axlsx::XML_NS_A << '">'
80
+ doc = Nokogiri::XML(@axis.to_xml_string(str))
81
+ assert(doc.xpath('//a:noFill'))
82
+ assert(doc.xpath("//c:crosses[@val='#{@axis.crosses.to_s}']"))
83
+ assert(doc.xpath("//c:crossAx[@val='#{@axis.crossAx.to_s}']"))
84
+ assert(doc.xpath("//a:bodyPr[@rot='#{@axis.label_rotation.to_s}']"))
85
+ assert(doc.xpath("//a:t[text()='Foo']"))
86
+ end
52
87
  end
@@ -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,29 +5,33 @@ 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"
9
- @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob"
8
+ @chart = @ws.add_chart Axlsx::Bar3DChart, :title => "fishery"
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
 
12
12
  def test_initialize
13
13
  assert_equal(@series.title.text, "bob", "series title has been applied")
14
- assert_equal(@series.data, [0,1,2], "data option applied")
15
- assert_equal(@series.labels, ["zero", "one","two"], "labels option applied")
16
- assert_equal(@series.shape, :box, "series shape has been applied")
14
+ assert_equal(@series.data.class, Axlsx::NumDataSource, "data option applied")
15
+ assert_equal(@series.shape, :cone, "series shape has been applied")
16
+ assert(@series.data.is_a?(Axlsx::NumDataSource))
17
+ assert(@series.labels.is_a?(Axlsx::AxDataSource))
17
18
  end
18
19
 
19
- def test_data
20
- assert_equal(@series.data, [0,1,2])
21
- end
22
-
23
- def test_labels
24
- assert_equal(@series.labels, ["zero", "one", "two"])
20
+ def test_colors
21
+ assert_equal(@series.colors.size, 3)
25
22
  end
26
23
 
27
24
  def test_shape
28
25
  assert_raise(ArgumentError, "require valid shape") { @series.shape = :teardropt }
29
- assert_nothing_raised("allow valid shape") { @series.shape = :cone }
30
- assert(@series.shape == :cone)
26
+ assert_nothing_raised("allow valid shape") { @series.shape = :box }
27
+ assert(@series.shape == :box)
31
28
  end
32
29
 
30
+ def test_to_xml_string
31
+ doc = Nokogiri::XML(@chart.to_xml_string)
32
+ @series.colors.each_with_index do |color, index|
33
+ assert_equal(doc.xpath("//c:dPt/c:idx[@val='#{index}']").size,1)
34
+ assert_equal(doc.xpath("//c:dPt/c:spPr/a:solidFill/a:srgbClr[@val='#{@series.colors[index]}']").size,1)
35
+ end
36
+ end
33
37
  end
@@ -10,7 +10,7 @@ class TestCatAxis < Test::Unit::TestCase
10
10
  def test_initialization
11
11
  assert_equal(@axis.auto, 1, "axis auto default incorrect")
12
12
  assert_equal(@axis.lblAlgn, :ctr, "label align default incorrect")
13
- assert_equal(@axis.lblOffset, "100%", "label offset default incorrect")
13
+ assert_equal(@axis.lblOffset, "100", "label offset default incorrect")
14
14
  end
15
15
 
16
16
  def test_auto
@@ -24,8 +24,8 @@ class TestCatAxis < Test::Unit::TestCase
24
24
  end
25
25
 
26
26
  def test_lblOffset
27
- assert_raise(ArgumentError, "requires valid label offset") { @axis.lblOffset = 100 }
28
- assert_nothing_raised("accepts valid label offset") { @axis.lblOffset = "20%" }
27
+ assert_raise(ArgumentError, "requires valid label offset") { @axis.lblOffset = 'foo' }
28
+ assert_nothing_raised("accepts valid label offset") { @axis.lblOffset = "20" }
29
29
  end
30
30
 
31
31
  end
@@ -1,17 +1,27 @@
1
- require 'tc_helper.rb'
1
+ # require 'tc_helper.rb'
2
2
 
3
- class TestCatAxisData < Test::Unit::TestCase
3
+ # class TestCatAxisData < Test::Unit::TestCase
4
4
 
5
- def setup
6
- p = Axlsx::Package.new
7
- @ws = p.workbook.add_worksheet
8
- chart = @ws.drawing.add_chart Axlsx::Bar3DChart
9
- @series = chart.add_series :labels=>["zero", "one", "two"]
10
- end
5
+ # def setup
6
+ # p = Axlsx::Package.new
7
+ # @ws = p.workbook.add_worksheet
8
+ # @chart = @ws.drawing.add_chart Axlsx::Bar3DChart
9
+ # @series = @chart.add_series :labels=>["zero", "one", "two"]
10
+ # end
11
11
 
12
- def test_initialize
13
- assert(@series.labels.is_a?Axlsx::SimpleTypedList)
14
- assert_equal(@series.labels, ["zero", "one", "two"])
15
- end
12
+ # def test_initialize
13
+ # assert(@series.labels.is_a?Axlsx::SimpleTypedList)
14
+ # assert_equal(@series.labels, ["zero", "one", "two"])
15
+ # end
16
16
 
17
- end
17
+ # def test_to_xml_string
18
+ # doc = Nokogiri::XML(@chart.to_xml_string)
19
+ # assert_equal(doc.xpath("//c:cat/c:strRef/c:f").size,1)
20
+ # assert_equal(doc.xpath("//c:strCache/c:ptCount[@val='#{@series.labels.size}']").size,1)
21
+ # @series.labels.each_with_index do |label, index|
22
+ # assert_equal(doc.xpath("//c:strCache/c:pt[@idx='#{index}']").size,1)
23
+ # assert_equal(doc.xpath("//c:strCache/c:pt/c:v[text()='#{label}']").size,1)
24
+ # end
25
+ # end
26
+
27
+ # end
@@ -22,11 +22,16 @@ class TestChart < Test::Unit::TestCase
22
22
  @chart.title.text = 'wowzer'
23
23
  assert_equal(@chart.title.text, "wowzer", "the title text via a string")
24
24
  assert_equal(@chart.title.cell, nil, "the title cell is nil as we set the title with text.")
25
- @chart.title.cell = @row.cells.first
25
+ @chart.title = @row.cells.first
26
26
  assert_equal(@chart.title.text, "one", "the title text was set via cell reference")
27
27
  assert_equal(@chart.title.cell, @row.cells.first)
28
28
  end
29
29
 
30
+ def test_to_from_marker_access
31
+ assert(@chart.to.is_a?(Axlsx::Marker))
32
+ assert(@chart.from.is_a?(Axlsx::Marker))
33
+ end
34
+
30
35
  def test_style
31
36
  assert_raise(ArgumentError) { @chart.style = 49 }
32
37
  assert_nothing_raised { @chart.style = 2 }
@@ -34,38 +39,51 @@ class TestChart < Test::Unit::TestCase
34
39
  end
35
40
 
36
41
  def test_start_at
37
- @chart.start_at 15,25
42
+ @chart.start_at 15, 25
38
43
  assert_equal(@chart.graphic_frame.anchor.from.col, 15)
39
44
  assert_equal(@chart.graphic_frame.anchor.from.row, 25)
40
-
45
+ @chart.start_at @row.cells.first
46
+ assert_equal(@chart.graphic_frame.anchor.from.col, 0)
47
+ assert_equal(@chart.graphic_frame.anchor.from.row, 0)
48
+ @chart.start_at [5,6]
49
+ assert_equal(@chart.graphic_frame.anchor.from.col, 5)
50
+ assert_equal(@chart.graphic_frame.anchor.from.row, 6)
51
+
41
52
  end
42
53
 
43
54
  def test_end_at
44
55
  @chart.end_at 25, 90
45
56
  assert_equal(@chart.graphic_frame.anchor.to.col, 25)
46
57
  assert_equal(@chart.graphic_frame.anchor.to.row, 90)
58
+ @chart.end_at @row.cells.last
59
+ assert_equal(@chart.graphic_frame.anchor.to.col, 2)
60
+ assert_equal(@chart.graphic_frame.anchor.to.row, 0)
61
+ @chart.end_at [10,11]
62
+ assert_equal(@chart.graphic_frame.anchor.to.col, 10)
63
+ assert_equal(@chart.graphic_frame.anchor.to.row, 11)
64
+
47
65
  end
48
66
 
49
67
  def test_add_series
50
68
  s = @chart.add_series :data=>[0,1,2,3], :labels => ["one", 1, "anything"], :title=>"bob"
51
69
  assert_equal(@chart.series.last, s, "series has been added to chart series collection")
52
70
  assert_equal(s.title.text, "bob", "series title has been applied")
53
- assert_equal(s.data, [0,1,2,3], "data option applied")
54
- assert_equal(s.labels, ["one",1,"anything"], "labels option applied")
55
71
  end
56
72
 
57
73
  def test_pn
58
74
  assert_equal(@chart.pn, "charts/chart1.xml")
59
75
  end
60
-
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
+
61
83
  def test_to_xml_string
62
84
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
63
85
  doc = Nokogiri::XML(@chart.to_xml_string)
64
- errors = []
65
- schema.validate(doc).each do |error|
66
- errors.push error
67
- puts error.message
68
- end
86
+ errors = schema.validate(doc).map { |error| puts error.message; error }
69
87
  assert(errors.empty?, "error free validation")
70
88
  end
71
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
@@ -0,0 +1,17 @@
1
+ require 'tc_helper.rb'
2
+
3
+ class TestNumDataSource < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @data_source = Axlsx::NumDataSource.new :data => ["1", "2", "3"]
7
+ end
8
+
9
+ def test_to_xml_string_strLit
10
+ str = '<?xml version="1.0" encoding="UTF-8"?>'
11
+ str << '<c:chartSpace xmlns:c="' << Axlsx::XML_NS_C << '">'
12
+ str << @data_source.to_xml_string
13
+ doc = Nokogiri::XML(str)
14
+ assert_equal(doc.xpath("//c:val").size, 1)
15
+ end
16
+
17
+ end