Class: Axlsx::Cell

Inherits:
Object
  • Object
show all
Defined in:
lib/axlsx/workbook/worksheet/cell.rb

Overview

Note:

The recommended way to generate cells is via Worksheet#add_row

A cell in a worksheet. Cell stores inforamation requried to serialize a single worksheet cell to xml. You must provde the Row that the cell belongs to and the cells value. The data type will automatically be determed if you do not specify the :type option. The default style will be applied if you do not supply the :style option. Changing the cell's type will recast the value to the type specified. Altering the cell's value via the property accessor will also automatically cast the provided value to the cell's type.

See Also:

Constant Summary collapse

INLINE_STYLES =

An array of available inline styes. TODO change this to a hash where each key defines attr name and validator (and any info the validator requires) then move it out to a module so we can re-use in in other classes. needs to define bla=(v) and bla methods on the class that hook into a set_attr method that kicks the suplied validator and updates the instance_variable for the key

['value', 'type', 'font_name', 'charset',
'family', 'b', 'i', 'strike','outline',
'shadow', 'condense', 'extend', 'u',
'vertAlign', 'sz', 'color', 'scheme']

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(row, value = "", options = {}) ⇒ Cell

Returns a new instance of Cell.

Options Hash (options):

  • type (Symbol)

    The intended data type for this cell. If not specified the data type will be determined internally based on the vlue provided.

  • style (Integer)

    The index of the cellXfs item to be applied to this cell. If not specified, the default style (0) will be applied.

  • font_name (String)
  • charset (Integer)
  • family (String)
  • b (Boolean)
  • i (Boolean)
  • strike (Boolean)
  • outline (Boolean)
  • shadow (Boolean)
  • condense (Boolean)
  • extend (Boolean)
  • u (Boolean)
  • vertAlign (Symbol)

    must be one of :baseline, :subscript, :superscript

  • sz (Integer)
  • color (String)

    an 8 letter rgb specification

  • scheme (Symbol)

    must be one of :none, major, :minor



196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 196

def initialize(row, value="", options={})
  self.row=row
  @value = @font_name = @charset = @family = @b = @i = @strike = @outline = @shadow = nil
  @condense = @u = @vertAlign = @sz = @color = @scheme = @extend = @ssti = nil
  @styles = row.worksheet.workbook.styles
  @row.cells << self
  options.each do |o|
    self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
  end
  @style ||= 0
  @type ||= cell_type_from_value(value)
  @value = cast_value(value)
end

Instance Attribute Details

#bBoolean

The inline bold property for the cell



96
97
98
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 96

def b
  @b
end

#charsetString

The inline charset property for the cell



84
85
86
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 84

def charset
  @charset
end

#colorColor

The inline color property for the cell



144
145
146
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 144

def color
  @color
end

#condenseBoolean

The inline condense property for the cell



126
127
128
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 126

def condense
  @condense
end

#extendBoolean

The inline extend property for the cell



132
133
134
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 132

def extend
  @extend
end

#familyString

The inline family property for the cell



90
91
92
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 90

def family
  @family
end

#font_nameString

The inline font_name property for the cell



78
79
80
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 78

def font_name
  @font_name
end

#iBoolean

The inline italic property for the cell



102
103
104
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 102

def i
  @i
end

#outlineBoolean

The inline outline property for the cell



114
115
116
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 114

def outline
  @outline
end

#rowRow

The row this cell belongs to.



30
31
32
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 30

def row
  @row
end

#schemeSymbol

The inline scheme property for the cell this must be one of [:none, major, minor]



170
171
172
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 170

def scheme
  @scheme
end

#shadowBoolean

The inline shadow property for the cell



120
121
122
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 120

def shadow
  @shadow
end

#sstiInteger

The Shared Strings Table index for this cell



212
213
214
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 212

def ssti
  @ssti
end

#strikeBoolean

The inline strike property for the cell



108
109
110
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 108

def strike
  @strike
end

#styleInteger

The index of the cellXfs item to be applied to this cell.

See Also:



26
27
28
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 26

def style
  @style
end

#szBoolean

The inline sz property for the cell



153
154
155
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 153

def sz
  @sz
end

#typeSymbol

Note:

If the value provided cannot be cast into the type specified, type is changed to :string and the following logic is applied. :string to :integer or :float, type conversions always return 0 or 0.0 :string, :integer, or :float to :time conversions always return the original value as a string and set the cells type to :string. No support is currently implemented for parsing time strings.

The cell's data type. Currently only six types are supported, :date, :time, :float, :integer, :string and :boolean. 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 automatically determed.

Raises:

  • (ArgumentExeption)

    Cell.type must be one of [:date, time, :float, :integer, :string, :boolean]

See Also:

  • #cell_type_from_value


43
44
45
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 43

def type
  @type
end

#uBoolean

The inline underline property for the cell



138
139
140
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 138

def u
  @u
end

#valueString, ...

The value of this cell.



54
55
56
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 54

def value
  @value
end

#vertAlignSymbol

The inline vertical alignment property for the cell this must be one of [:baseline, :subscript, :superscript]



160
161
162
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 160

def vertAlign
  @vertAlign
end

Instance Method Details

#autowidthObject

This is still not perfect...

  • scaling is not linear as font sizes increst
  • different fonts have different mdw and char widths


327
328
329
330
331
332
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 327

def autowidth
  return if is_formula? || value == nil
  mdw = 1.78 #This is the widest width of 0..9 in arial@10px)
  font_scale = (font_size/10.0).to_f
  ((value.to_s.count(Worksheet.thin_chars) * mdw + 5) / mdw * 256) / 256.0 * font_scale
end

#indexInteger



215
216
217
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 215

def index
  @row.cells.index(self)
end

#is_formula?Boolean



320
321
322
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 320

def is_formula?
  @type == :string && @value.to_s.start_with?('=')
end

#is_text_run?Boolean

Indicates that the cell has one or more of the custom cell styles applied.



63
64
65
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 63

def is_text_run?
  @is_text_run ||= false
end

#merge(target) ⇒ Object

Merges all the cells in a range created between this cell and the cell or string name for a cell provided

See Also:

  • Axlsx::Cell.worksheetworksheet.merge_cells


250
251
252
253
254
255
256
257
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 250

def merge(target)
  range_end = if target.is_a?(String)
                target
              elsif(target.is_a?(Cell))
                target.r
              end
  self.row.worksheet.merge_cells "#{self.r}:#{range_end}" unless range_end.nil?
end

#plain_string?Boolean

Indicates if the cell is good for shared string table



68
69
70
71
72
73
74
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 68

def plain_string?
  @type == :string &&         # String typed
    !is_text_run? &&          # No inline styles
    !@value.nil? &&           # Not nil
    !@value.empty? &&         # Not empty
    !@value.start_with?('=')  # Not a formula
end

#posArray



243
244
245
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 243

def pos
  [index, row.index]
end

#rString

Returns The alpha(column)numeric(row) reference for this sell.

Examples:

Relative Cell Reference

ws.rows.first.cells.first.r #=> "A1"


222
223
224
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 222

def r
  Axlsx::cell_r index, @row.index
end

#r_absString

Returns The absolute alpha(column)numeric(row) reference for this sell.

Examples:

Absolute Cell Reference

ws.rows.first.cells.first.r #=> "$A$1"


229
230
231
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 229

def r_abs
  "$#{r.match(%r{([A-Z]+)([0-9]+)})[1,2].join('$')}"
end

#reference(absolute = true) ⇒ String

returns the absolute or relative string style reference for this cell. returned.



339
340
341
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 339

def reference(absolute=true)
  absolute ? r_abs : r
end

#run_xml_string(str = '') ⇒ String

builds an xml text run based on this cells attributes.



262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 262

def run_xml_string(str = '')
  if is_text_run?
    data = instance_values.reject{|key, value| value == nil || key == 'value' || key == 'type' }
    keys = data.keys & INLINE_STYLES
    str << "<r><rPr>"
    keys.each do |key|
      case key
      when 'font_name'
        str << "<rFont val='"<< @font_name << "'/>"
      when 'color'
        str << data[key].to_xml_string
      else
        str << "<" << key.to_s << " val='" << data[key].to_s << "'/>"
      end
    end
    str << "</rPr>" << "<t>" << value.to_s << "</t></r>"
  else
    str << "<t>" << value.to_s << "</t>"
  end
  str
end

#to_xml_string(r_index, c_index, str = '') ⇒ String

Serializes the cell



289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
# File 'lib/axlsx/workbook/worksheet/cell.rb', line 289

def to_xml_string(r_index, c_index, str = '')
  str << '<c r="' << Axlsx::cell_r(c_index, r_index) << '" s="' << @style.to_s << '" '
  return str << '/>' if @value.nil?

  case @type

  when :string
    #parse formula
    if @value.start_with?('=')
      str  << 't="str"><f>' << @value.to_s.sub('=', '') << '</f>'
    else
      #parse shared
      if @ssti
        str << 't="s"><v>' << @ssti.to_s << '</v>'
      else
        str << 't="inlineStr"><is>' << run_xml_string << '</is>'
      end
    end
  when :date
    # TODO: See if this is subject to the same restriction as Time below
    str << '><v>' << DateTimeConverter::date_to_serial(@value).to_s << '</v>'
  when :time
    str << '><v>' << DateTimeConverter::time_to_serial(@value).to_s << '</v>'
  when :boolean
    str << 't="b"><v>' << @value.to_s << '</v>'
  else
    str << '><v>' << @value.to_s << '</v>'
  end
  str << '</c>'
end