axlsx 2.1.0.pre → 3.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +17 -20
  4. data/Rakefile +0 -1
  5. data/examples/conditional_formatting/example_conditional_formatting.rb +15 -0
  6. data/examples/example.rb +31 -1
  7. data/lib/axlsx.rb +9 -4
  8. data/lib/axlsx/drawing/area_chart.rb +99 -0
  9. data/lib/axlsx/drawing/area_series.rb +110 -0
  10. data/lib/axlsx/drawing/bar_chart.rb +143 -0
  11. data/lib/axlsx/drawing/chart.rb +8 -1
  12. data/lib/axlsx/drawing/d_lbls.rb +3 -3
  13. data/lib/axlsx/drawing/drawing.rb +3 -0
  14. data/lib/axlsx/drawing/line_series.rb +18 -1
  15. data/lib/axlsx/drawing/num_val.rb +3 -1
  16. data/lib/axlsx/drawing/one_cell_anchor.rb +2 -1
  17. data/lib/axlsx/drawing/pic.rb +24 -17
  18. data/lib/axlsx/drawing/scaling.rb +2 -2
  19. data/lib/axlsx/drawing/scatter_series.rb +16 -2
  20. data/lib/axlsx/drawing/str_val.rb +3 -1
  21. data/lib/axlsx/drawing/title.rb +19 -1
  22. data/lib/axlsx/drawing/two_cell_anchor.rb +6 -1
  23. data/lib/axlsx/drawing/view_3D.rb +2 -2
  24. data/lib/axlsx/package.rb +7 -16
  25. data/lib/axlsx/rels/relationships.rb +5 -2
  26. data/lib/axlsx/stylesheet/num_fmt.rb +9 -0
  27. data/lib/axlsx/stylesheet/styles.rb +1 -1
  28. data/lib/axlsx/util/constants.rb +8 -5
  29. data/lib/axlsx/util/mime_type_utils.rb +11 -0
  30. data/lib/axlsx/util/simple_typed_list.rb +1 -1
  31. data/lib/axlsx/util/validators.rb +14 -9
  32. data/lib/axlsx/version.rb +1 -1
  33. data/lib/axlsx/workbook/workbook.rb +19 -1
  34. data/lib/axlsx/workbook/workbook_view.rb +5 -3
  35. data/lib/axlsx/workbook/worksheet/cell.rb +26 -19
  36. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +15 -5
  37. data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -0
  38. data/lib/axlsx/workbook/worksheet/cols.rb +5 -2
  39. data/lib/axlsx/workbook/worksheet/merged_cells.rb +2 -0
  40. data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -0
  41. data/lib/axlsx/workbook/worksheet/pivot_table.rb +36 -13
  42. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +4 -1
  43. data/lib/axlsx/workbook/worksheet/rich_text.rb +23 -3
  44. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +28 -32
  45. data/lib/axlsx/workbook/worksheet/row.rb +7 -0
  46. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +21 -3
  47. data/lib/axlsx/workbook/worksheet/tables.rb +3 -0
  48. data/lib/axlsx/workbook/worksheet/worksheet.rb +8 -51
  49. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +10 -10
  50. data/test/axlsx.qcachegrind +2226 -0
  51. data/test/drawing/tc_area_chart.rb +39 -0
  52. data/test/drawing/tc_area_series.rb +71 -0
  53. data/test/drawing/tc_bar_chart.rb +71 -0
  54. data/test/drawing/tc_chart.rb +23 -10
  55. data/test/drawing/tc_drawing.rb +2 -2
  56. data/test/drawing/tc_line_series.rb +38 -5
  57. data/test/drawing/tc_pic.rb +11 -19
  58. data/test/drawing/tc_scatter_series.rb +16 -5
  59. data/test/drawing/tc_str_val.rb +9 -0
  60. data/test/drawing/tc_title.rb +5 -0
  61. data/test/stylesheet/tc_styles.rb +2 -2
  62. data/test/tc_axlsx.rb +31 -0
  63. data/test/tc_helper.rb +3 -1
  64. data/test/tc_package.rb +12 -0
  65. data/test/util/tc_mime_type_utils.rb +13 -0
  66. data/test/util/tc_simple_typed_list.rb +1 -1
  67. data/test/util/tc_validators.rb +34 -10
  68. data/test/workbook/tc_shared_strings_table.rb +16 -1
  69. data/test/workbook/tc_workbook.rb +22 -1
  70. data/test/workbook/worksheet/tc_cell.rb +53 -11
  71. data/test/workbook/worksheet/tc_outline_pr.rb +19 -0
  72. data/test/workbook/worksheet/tc_pivot_table.rb +21 -6
  73. data/test/workbook/worksheet/tc_rich_text_run.rb +11 -11
  74. data/test/workbook/worksheet/tc_row.rb +5 -0
  75. data/test/workbook/worksheet/tc_sheet_pr.rb +26 -4
  76. data/test/workbook/worksheet/tc_table.rb +2 -3
  77. data/test/workbook/worksheet/tc_worksheet.rb +53 -38
  78. metadata +72 -20
  79. data/examples/IMAGE1UP.JPEG +0 -0
  80. data/lib/axlsx/util/string.rb +0 -7
@@ -10,14 +10,17 @@ require 'axlsx/rels/relationship.rb'
10
10
  def initialize
11
11
  super Relationship
12
12
  end
13
-
13
+
14
14
  # The relationship instance for the given source object, or nil if none exists.
15
15
  # @see Relationship#source_obj
16
16
  # @return [Relationship]
17
17
  def for(source_obj)
18
18
  find{ |rel| rel.source_obj == source_obj }
19
19
  end
20
-
20
+
21
+ # serialize relationships
22
+ # @param [String] str
23
+ # @return [String]
21
24
  def to_xml_string(str = '')
22
25
  str << '<?xml version="1.0" encoding="UTF-8"?>'
23
26
  str << ('<Relationships xmlns="' << RELS_R << '">')
@@ -73,5 +73,14 @@ module Axlsx
73
73
  serialized_tag('numFmt', str)
74
74
  end
75
75
 
76
+ # Override to avoid removing underscores
77
+ def serialized_attributes(str = '', additional_attributes = {})
78
+ attributes = declared_attributes.merge! additional_attributes
79
+ attributes.each do |key, value|
80
+ str << "#{Axlsx.camel(key, false)}=\"#{Axlsx.booleanize(value)}\" "
81
+ end
82
+ str
83
+ end
84
+
76
85
  end
77
86
  end
@@ -128,7 +128,7 @@ module Axlsx
128
128
  # @option options [Boolean] i Indicates if the text should be italicised
129
129
  # @option options [Boolean] u Indicates if the text should be underlined
130
130
  # @option options [Boolean] strike Indicates if the text should be rendered with a strikethrough
131
- # @option options [Boolean] strike Indicates if the text should be rendered with a shadow
131
+ # @option options [Boolean] shadow Indicates if the text should be rendered with a shadow
132
132
  # @option options [Integer] charset The character set to use.
133
133
  # @option options [Integer] family The font family to use.
134
134
  # @option options [String] font_name The name of the font to use
@@ -67,7 +67,7 @@ module Axlsx
67
67
  APP_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties".freeze
68
68
 
69
69
  # core rels namespace
70
- CORE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/metadata/core-properties".freeze
70
+ CORE_R = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties".freeze
71
71
 
72
72
  # digital signature rels namespace
73
73
  DIGITAL_SIGNATURE_R = "http://schemas.openxmlformats.org/package/2006/relationships/digital- signature/signature".freeze
@@ -385,13 +385,16 @@ module Axlsx
385
385
  # @see http://www.codetable.net/asciikeycodes
386
386
  pattern = "\x0-\x08\x0B\x0C\x0E-\x1F"
387
387
  pattern = pattern.respond_to?(:encode) ? pattern.encode('UTF-8') : pattern
388
-
388
+
389
389
  # The regular expression used to remove control characters from worksheets
390
390
  CONTROL_CHARS = pattern.freeze
391
-
391
+
392
+ # ISO 8601 date recognition
392
393
  ISO_8601_REGEX = /\A(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])?\Z/.freeze
393
-
394
+
395
+ # FLOAT recognition
394
396
  FLOAT_REGEX = /\A[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\Z/.freeze
395
-
397
+
398
+ # Numeric recognition
396
399
  NUMERIC_REGEX = /\A[+-]?\d+?\Z/.freeze
397
400
  end
@@ -0,0 +1,11 @@
1
+ module Axlsx
2
+ # This module defines some utils related with mime type detection
3
+ module MimeTypeUtils
4
+ # Detect a file mime type
5
+ # @param [String] v File path
6
+ # @return [String] File mime type
7
+ def self.get_mime_type(v)
8
+ MimeMagic.by_magic(File.open(v)).to_s
9
+ end
10
+ end
11
+ end
@@ -147,7 +147,7 @@ module Axlsx
147
147
  # determines if the index is protected
148
148
  # @param [Integer] index
149
149
  def protected? index
150
- return false unless locked_at.is_a? Fixnum
150
+ return false unless locked_at.is_a? Integer
151
151
  index < locked_at
152
152
  end
153
153
 
@@ -56,13 +56,13 @@ module Axlsx
56
56
  raise ArgumentError, (ERR_TYPE % [v.inspect, name, types.inspect]) unless other.call(v)
57
57
  end
58
58
  v_class = v.is_a?(Class) ? v : v.class
59
- Array(types).each do |t|
59
+ Array(types).each do |t|
60
60
  return if v_class <= t
61
61
  end
62
62
  raise ArgumentError, (ERR_TYPE % [v.inspect, name, types.inspect])
63
63
  end
64
64
  end
65
-
65
+
66
66
 
67
67
  # Requires that the value can be converted to an integer
68
68
  # @para, [Any] v the value to validate
@@ -78,18 +78,19 @@ module Axlsx
78
78
  def self.validate_angle(v)
79
79
  raise ArgumentError, (ERR_ANGLE % v.inspect) unless (v.to_i >= -5400000 && v.to_i <= 5400000)
80
80
  end
81
-
81
+
82
+ # Validates an unsigned intger
82
83
  UINT_VALIDATOR = lambda { |arg| arg.respond_to?(:>=) && arg >= 0 }
83
-
84
- # Requires that the value is a Fixnum or Integer and is greater or equal to 0
84
+
85
+ # Requires that the value is a Integer and is greater or equal to 0
85
86
  # @param [Any] v The value validated
86
- # @raise [ArgumentError] raised if the value is not a Fixnum or Integer value greater or equal to 0
87
+ # @raise [ArgumentError] raised if the value is not a Integer value greater or equal to 0
87
88
  # @return [Boolean] true if the data is valid
88
89
  def self.validate_unsigned_int(v)
89
90
  DataTypeValidator.validate(:unsigned_int, Integer, v, UINT_VALIDATOR)
90
91
  end
91
92
 
92
- # Requires that the value is a Fixnum Integer or Float and is greater or equal to 0
93
+ # Requires that the value is a Integer or Float and is greater or equal to 0
93
94
  # @param [Any] v The value validated
94
95
  # @raise [ArgumentError] raised if the value is not a Fixnun, Integer, Float value greater or equal to 0
95
96
  # @return [Boolean] true if the data is valid
@@ -104,7 +105,7 @@ module Axlsx
104
105
  end
105
106
 
106
107
  # Requires that the value is a form that can be evaluated as a boolean in an xml document.
107
- # The value must be an instance of Fixnum, String, Integer, Symbol, TrueClass or FalseClass and
108
+ # The value must be an instance of String, Integer, Symbol, TrueClass or FalseClass and
108
109
  # it must be one of 0, 1, "true", "false", :true, :false, true, false, "0", or "1"
109
110
  # @param [Any] v The value validated
110
111
  def self.validate_boolean(v)
@@ -148,7 +149,7 @@ module Axlsx
148
149
  RestrictionValidator.validate "cell run style u", [:none, :single, :double, :singleAccounting, :doubleAccounting], v
149
150
  end
150
151
 
151
- # validates cell style family which must be between 1 and 5
152
+ # validates cell style family which must be between 1 and 5
152
153
  def self.validate_family(v)
153
154
  RestrictionValidator.validate "cell run style family", 1..5, v
154
155
  end
@@ -304,4 +305,8 @@ module Axlsx
304
305
  RestrictionValidator.validate :visibility, [:visible, :hidden, :very_hidden], v
305
306
  end
306
307
 
308
+ # Requires that the value is one of :default, :circle, :dash, :diamond, :dot, :picture, :plus, :square, :star, :triangle, :x
309
+ def self.validate_marker_symbol(v)
310
+ RestrictionValidator.validate :marker_symbol, [:default, :circle, :dash, :diamond, :dot, :picture, :plus, :square, :star, :triangle, :x], v
311
+ end
307
312
  end
@@ -1,5 +1,5 @@
1
1
  module Axlsx
2
2
 
3
3
  # The current version
4
- VERSION = "2.1.0.pre"
4
+ VERSION = "3.0.0.pre"
5
5
  end
@@ -11,6 +11,7 @@ require 'axlsx/workbook/worksheet/cell_serializer.rb'
11
11
  require 'axlsx/workbook/worksheet/cell.rb'
12
12
  require 'axlsx/workbook/worksheet/page_margins.rb'
13
13
  require 'axlsx/workbook/worksheet/page_set_up_pr.rb'
14
+ require 'axlsx/workbook/worksheet/outline_pr.rb'
14
15
  require 'axlsx/workbook/worksheet/page_setup.rb'
15
16
  require 'axlsx/workbook/worksheet/header_footer.rb'
16
17
  require 'axlsx/workbook/worksheet/print_options.rb'
@@ -96,6 +97,15 @@ require 'axlsx/workbook/worksheet/selection.rb'
96
97
  @use_shared_strings = v
97
98
  end
98
99
 
100
+ # If true reverse the order in which the workbook is serialized
101
+ # @return [Boolean]
102
+ attr_reader :is_reversed
103
+
104
+ def is_reversed=(v)
105
+ Axlsx::validate_boolean(v)
106
+ @is_reversed = v
107
+ end
108
+
99
109
 
100
110
  # A collection of worksheets associated with this workbook.
101
111
  # @note The recommended way to manage worksheets is add_worksheet
@@ -270,6 +280,10 @@ require 'axlsx/workbook/worksheet/selection.rb'
270
280
  worksheet
271
281
  end
272
282
 
283
+ # Adds a new WorkbookView
284
+ # @return WorkbookViews
285
+ # @option options [Hash] options passed into the added WorkbookView
286
+ # @see WorkbookView#initialize
273
287
  def add_view(options={})
274
288
  views << WorkbookView.new(options)
275
289
  end
@@ -344,7 +358,11 @@ require 'axlsx/workbook/worksheet/selection.rb'
344
358
  str << ('<workbookPr date1904="' << @@date1904.to_s << '"/>')
345
359
  views.to_xml_string(str)
346
360
  str << '<sheets>'
347
- worksheets.each { |sheet| sheet.to_sheet_node_xml_string(str) }
361
+ if is_reversed
362
+ worksheets.reverse_each { |sheet| sheet.to_sheet_node_xml_string(str) }
363
+ else
364
+ worksheets.each { |sheet| sheet.to_sheet_node_xml_string(str) }
365
+ end
348
366
  str << '</sheets>'
349
367
  defined_names.to_xml_string(str)
350
368
  unless pivot_tables.empty?
@@ -33,7 +33,7 @@ module Axlsx
33
33
 
34
34
 
35
35
  # Creates a new BookView object
36
- # @params [Hash] options A hash of key/value pairs that will be mapped to this instances attributes.
36
+ # @param [Hash] options A hash of key/value pairs that will be mapped to this instances attributes.
37
37
  # @option [Symbol] visibility Specifies visible state of the workbook window. The default value for this attribute is :visible.
38
38
  # @option [Boolean] minimized Specifies a boolean value that indicates whether the workbook window is minimized.
39
39
  # @option [Boolean] show_horizontal_scroll Specifies a boolean value that indicates whether to display the horizontal scroll bar in the user interface.
@@ -41,7 +41,7 @@ module Axlsx
41
41
  # @option [Boolean] show_sheet_tabs Specifies a boolean value that indicates whether to display the sheet tabs in the user interface.
42
42
  # @option [Integer] tab_ratio Specifies ratio between the workbook tabs bar and the horizontal scroll bar.
43
43
  # @option [Integer] first_sheet Specifies the index to the first sheet in this book view.
44
- # @option [Integer] active_tab Specifies an unsignedInt that contains the index to the active sheet in this book view.
44
+ # @option [Integer] active_tab Specifies an unsignedInt that contains the index to the active sheet in this book view.
45
45
  # @option [Integer] x_window Specifies the X coordinate for the upper left corner of the workbook window. The unit of measurement for this value is twips.
46
46
  # @option [Integer] y_window Specifies the Y coordinate for the upper left corner of the workbook window. The unit of measurement for this value is twips.
47
47
  # @option [Integer] window_width Specifies the width of the workbook window. The unit of measurement for this value is twips.
@@ -68,7 +68,9 @@ module Axlsx
68
68
  :show_sheet_tabs, :auto_filter_date_grouping
69
69
 
70
70
 
71
-
71
+ # Serialize the WorkbookView
72
+ # @param [String] str
73
+ # @return [String]
72
74
  def to_xml_string(str = '')
73
75
  str << '<workbookView '
74
76
  serialized_attributes str
@@ -37,14 +37,14 @@ module Axlsx
37
37
  # to get less GC cycles
38
38
  type = options.delete(:type) || cell_type_from_value(value)
39
39
  self.type = type unless type == :string
40
-
40
+
41
41
 
42
42
  val = options.delete(:style)
43
43
  self.style = val unless val.nil? || val == 0
44
44
  val = options.delete(:formula_value)
45
45
  self.formula_value = val unless val.nil?
46
-
47
- parse_options(options)
46
+
47
+ parse_options(options)
48
48
 
49
49
  self.value = value
50
50
  value.cell = self if contains_rich_text?
@@ -64,9 +64,10 @@ module Axlsx
64
64
  :family, :b, :i, :strike, :outline,
65
65
  :shadow, :condense, :extend, :u,
66
66
  :vertAlign, :sz, :color, :scheme].freeze
67
-
67
+
68
+ # An array of valid cell types
68
69
  CELL_TYPES = [:date, :time, :float, :integer, :richtext,
69
- :string, :boolean, :iso_8601].freeze
70
+ :string, :boolean, :iso_8601, :text].freeze
70
71
 
71
72
  # The index of the cellXfs item to be applied to this cell.
72
73
  # @return [Integer]
@@ -79,7 +80,7 @@ module Axlsx
79
80
  # @return [Row]
80
81
  attr_reader :row
81
82
 
82
- # The cell's data type. Currently only six types are supported, :date, :time, :float, :integer, :string and :boolean.
83
+ # The cell's data type.
83
84
  # Changing the type for a cell will recast the value into that type. If no type option is specified in the constructor, the type is
84
85
  # automatically determed.
85
86
  # @see Cell#cell_type_from_value
@@ -93,7 +94,7 @@ module Axlsx
93
94
  def type
94
95
  defined?(@type) ? @type : :string
95
96
  end
96
-
97
+
97
98
  # @see type
98
99
  def type=(v)
99
100
  RestrictionValidator.validate :cell_type, CELL_TYPES, v
@@ -104,7 +105,7 @@ module Axlsx
104
105
  # The value of this cell.
105
106
  # @return [String, Integer, Float, Time, Boolean] casted value based on cell's type attribute.
106
107
  attr_reader :value
107
-
108
+
108
109
  # @see value
109
110
  def value=(v)
110
111
  #TODO: consider doing value based type determination first?
@@ -115,15 +116,15 @@ module Axlsx
115
116
  # @return [Boolean]
116
117
  def is_text_run?
117
118
  defined?(@is_text_run) && @is_text_run && !contains_rich_text?
118
- end
119
-
119
+ end
120
+
120
121
  def contains_rich_text?
121
122
  type == :richtext
122
123
  end
123
-
124
+
124
125
  # Indicates if the cell is good for shared string table
125
126
  def plain_string?
126
- type == :string && # String typed
127
+ (type == :string || type == :text) && # String typed
127
128
  !is_text_run? && # No inline styles
128
129
  !@value.nil? && # Not nil
129
130
  !@value.empty? && # Not empty
@@ -347,7 +348,9 @@ module Axlsx
347
348
 
348
349
  # returns the name of the cell
349
350
  attr_reader :name
350
-
351
+
352
+ # Attempts to determine the correct width for this cell's content
353
+ # @return [Float]
351
354
  def autowidth
352
355
  return if is_formula? || value.nil?
353
356
  if contains_rich_text?
@@ -363,12 +366,12 @@ module Axlsx
363
366
  string_width(value, font_size)
364
367
  end
365
368
  end
366
-
369
+
367
370
  # Returns the sanatized value
368
371
  # TODO find a better way to do this as it accounts for 30% of
369
372
  # processing time in benchmarking...
370
373
  def clean_value
371
- if type == :string && !Axlsx::trust_input
374
+ if (type == :string || type == :text) && !Axlsx::trust_input
372
375
  Axlsx::sanitize(::CGI.escapeHTML(@value.to_s))
373
376
  else
374
377
  @value.to_s
@@ -376,17 +379,17 @@ module Axlsx
376
379
  end
377
380
 
378
381
  private
379
-
382
+
380
383
  def styles
381
384
  row.worksheet.styles
382
385
  end
383
-
386
+
384
387
  # Returns the width of a string according to the current style
385
388
  # This is still not perfect...
386
389
  # - scaling is not linear as font sizes increase
387
390
  def string_width(string, font_size)
388
391
  font_scale = font_size / 10.0
389
- (string.to_s.count(Worksheet::THIN_CHARS) + 3.0) * (font_size/10.0)
392
+ (string.to_s.count(Worksheet::THIN_CHARS) + 3.0) * font_scale
390
393
  end
391
394
 
392
395
  # we scale the font size if bold style is applied to either the style font or
@@ -452,7 +455,11 @@ module Axlsx
452
455
  v
453
456
  when :time
454
457
  self.style = STYLE_DATE if self.style == 0
455
- v.respond_to?(:to_time) ? v.to_time : v
458
+ if !v.is_a?(Time) && v.respond_to?(:to_time)
459
+ v.to_time
460
+ else
461
+ v
462
+ end
456
463
  when :float
457
464
  v.to_f
458
465
  when :integer
@@ -14,7 +14,7 @@ module Axlsx
14
14
  method = cell.type
15
15
  self.send(method, cell, str)
16
16
  str << '</c>'
17
- end
17
+ end
18
18
 
19
19
  # builds an xml text run based on this cells attributes.
20
20
  # @param [String] str The string instance this run will be concated to.
@@ -22,7 +22,7 @@ module Axlsx
22
22
  def run_xml_string(cell, str = '')
23
23
  if cell.is_text_run?
24
24
  valid = RichTextRun::INLINE_STYLES - [:value, :type]
25
- data = Hash[cell.instance_values.map{ |k, v| [k.to_sym, v] }]
25
+ data = Hash[cell.instance_values.map{ |k, v| [k.to_sym, v] }]
26
26
  data = data.select { |key, value| valid.include?(key) && !value.nil? }
27
27
  RichText.new(cell.value.to_s, data).to_xml_string(str)
28
28
  elsif cell.contains_rich_text?
@@ -124,7 +124,7 @@ module Axlsx
124
124
  inline_string_serialization cell, str
125
125
  end
126
126
  end
127
-
127
+
128
128
  # Serializes cells that are of the type richtext
129
129
  # @param [Cell] cell The cell that is being serialized
130
130
  # @param [String] str The string the serialized content will be appended to.
@@ -137,6 +137,18 @@ module Axlsx
137
137
  end
138
138
  end
139
139
 
140
+ # Serializes cells that are of the type text
141
+ # @param [Cell] cell The cell that is being serialized
142
+ # @param [String] str The string the serialized content will be appended to.
143
+ # @return [String]
144
+ def text(cell, str)
145
+ if cell.ssti.nil?
146
+ inline_string_serialization cell, str
147
+ else
148
+ value_serialization 's', cell.ssti, str
149
+ end
150
+ end
151
+
140
152
  private
141
153
 
142
154
  def numeric(cell, str = '')
@@ -147,8 +159,6 @@ module Axlsx
147
159
  str << ('t="' << serialization_type.to_s << '"') if serialization_type
148
160
  str << ('><v>' << serialization_value.to_s << '</v>')
149
161
  end
150
-
151
-
152
162
  end
153
163
  end
154
164
  end
@@ -8,6 +8,9 @@ module Axlsx
8
8
  super(Cfvo)
9
9
  end
10
10
 
11
+ # Serialize the Cfvo object
12
+ # @param [String] str
13
+ # @return [String]
11
14
  def to_xml_string(str='')
12
15
  each { |cfvo| cfvo.to_xml_string(str) }
13
16
  end
@@ -1,6 +1,6 @@
1
1
  module Axlsx
2
2
 
3
- # The cols class manages the col object used to manage column widths.
3
+ # The cols class manages the col object used to manage column widths.
4
4
  # This is where the magic happens with autowidth
5
5
  class Cols < SimpleTypedList
6
6
 
@@ -10,11 +10,14 @@ module Axlsx
10
10
  @worksheet = worksheet
11
11
  end
12
12
 
13
+ # Serialize the Cols object
14
+ # @param [String] str
15
+ # @return [String]
13
16
  def to_xml_string(str = '')
14
17
  return if empty?
15
18
  str << '<cols>'
16
19
  each { |item| item.to_xml_string(str) }
17
- str << '</cols>'
20
+ str << '</cols>'
18
21
  end
19
22
  end
20
23
  end