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
@@ -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,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
@@ -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
@@ -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,16 +39,29 @@ 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
@@ -55,15 +73,17 @@ class TestChart < Test::Unit::TestCase
55
73
  def test_pn
56
74
  assert_equal(@chart.pn, "charts/chart1.xml")
57
75
  end
58
-
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
+
59
83
  def test_to_xml_string
60
84
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
61
85
  doc = Nokogiri::XML(@chart.to_xml_string)
62
- errors = []
63
- schema.validate(doc).each do |error|
64
- errors.push error
65
- puts error.message
66
- end
86
+ errors = schema.validate(doc).map { |error| puts error.message; error }
67
87
  assert(errors.empty?, "error free validation")
68
88
  end
69
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
@@ -32,9 +30,13 @@ class TestDrawing < Test::Unit::TestCase
32
30
  assert_equal(600, image.width)
33
31
  assert_equal(400, image.height)
34
32
  end
35
-
33
+ def test_add_two_cell_anchor_image
34
+ src = File.dirname(__FILE__) + "/../../examples/image1.jpeg"
35
+ image = @ws.add_image(:image_src => src, :start_at=>[0,0], :end_at => [15,0])
36
+ assert(@ws.drawing.anchors.last.is_a?(Axlsx::TwoCellAnchor))
37
+ assert(image.is_a?(Axlsx::Pic))
38
+ end
36
39
  def test_charts
37
- assert(@ws.drawing.charts.empty?)
38
40
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
39
41
  assert_equal(@ws.drawing.charts.last, chart, "add chart is returned")
40
42
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
@@ -42,23 +44,26 @@ class TestDrawing < Test::Unit::TestCase
42
44
  end
43
45
 
44
46
  def test_pn
47
+ @ws.add_chart(Axlsx::Pie3DChart)
45
48
  assert_equal(@ws.drawing.pn, "drawings/drawing1.xml")
46
49
  end
47
50
 
48
51
  def test_rels_pn
52
+ @ws.add_chart(Axlsx::Pie3DChart)
49
53
  assert_equal(@ws.drawing.rels_pn, "drawings/_rels/drawing1.xml.rels")
50
54
  end
51
55
 
52
56
  def test_rId
57
+ @ws.add_chart(Axlsx::Pie3DChart)
53
58
  assert_equal(@ws.drawing.rId, "rId1")
54
59
  end
55
60
 
56
61
  def test_index
62
+ @ws.add_chart(Axlsx::Pie3DChart)
57
63
  assert_equal(@ws.drawing.index, @ws.workbook.drawings.index(@ws.drawing))
58
64
  end
59
65
 
60
66
  def test_relationships
61
- assert(@ws.drawing.relationships.empty?)
62
67
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"bob", :start_at=>[0,0], :end_at=>[1,1])
63
68
  assert_equal(@ws.drawing.relationships.size, 1, "adding a chart adds a relationship")
64
69
  chart = @ws.add_chart(Axlsx::Pie3DChart, :title=>"nancy", :start_at=>[1,5], :end_at=>[5,10])
@@ -67,6 +72,7 @@ class TestDrawing < Test::Unit::TestCase
67
72
 
68
73
  def test_to_xml
69
74
  schema = Nokogiri::XML::Schema(File.open(Axlsx::DRAWING_XSD))
75
+ @ws.add_chart(Axlsx::Pie3DChart)
70
76
  doc = Nokogiri::XML(@ws.drawing.to_xml_string)
71
77
  errors = []
72
78
  schema.validate(doc).each do |error|
@@ -19,11 +19,6 @@ class TestHyperlink < Test::Unit::TestCase
19
19
  assert_equal(@hyperlink.href, "http://axlsx.blogspot.com")
20
20
  end
21
21
 
22
- def test_invalidUrl
23
- assert_nothing_raised { @hyperlink.invalidUrl = "http://axlsx.blogspot.com" }
24
- assert_equal(@hyperlink.invalidUrl, "http://axlsx.blogspot.com")
25
- end
26
-
27
22
  def test_tgtFrame
28
23
  assert_nothing_raised { @hyperlink.tgtFrame = "http://axlsx.blogspot.com" }
29
24
  assert_equal(@hyperlink.tgtFrame, "http://axlsx.blogspot.com")
@@ -66,4 +61,8 @@ class TestHyperlink < Test::Unit::TestCase
66
61
  assert_equal(@hyperlink.history, false )
67
62
  end
68
63
 
64
+ def test_to_xml_string
65
+ doc = Nokogiri::XML(@p.workbook.worksheets.first.drawing.to_xml_string)
66
+ assert(doc.xpath("//a:hlinkClick"))
67
+ end
69
68
  end
@@ -5,8 +5,8 @@ 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"
9
- @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob"
8
+ chart = @ws.add_chart Axlsx::Line3DChart, :title => "fishery"
9
+ @series = chart.add_series :data=>[0,1,2], :labels=>["zero", "one", "two"], :title=>"bob", :color => "#FF0000"
10
10
  end
11
11
 
12
12
  def test_initialize
@@ -15,6 +15,10 @@ class TestLineSeries < Test::Unit::TestCase
15
15
  assert_equal(@series.data.class, Axlsx::NumDataSource)
16
16
 
17
17
  end
18
-
18
+
19
+ def test_to_xml_string
20
+ doc = Nokogiri::XML(@series.to_xml_string)
21
+ assert(doc.xpath("//srgbClr[@val='#{@series.color}']"))
22
+ end
19
23
  #TODO serialization testing
20
24
  end
@@ -9,7 +9,11 @@ class TestNumData < Test::Unit::TestCase
9
9
  def test_initialize
10
10
  assert_equal(@num_data.format_code, "General")
11
11
  end
12
-
12
+
13
+ def test_formula_based_cell
14
+
15
+ end
16
+
13
17
  def test_format_code
14
18
  assert_raise(ArgumentError) {@num_data.format_code = 7}
15
19
  assert_nothing_raised {@num_data.format_code = 'foo_bar'}