axlsx 2.1.0.pre → 3.0.0.pre

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 (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