Sha256: 9777b6854f606d0adc87b3506e6c6c353423f5e02a73da0cc50404f08c890b35

Contents?: true

Size: 1.9 KB

Versions: 4

Compression:

Stored size: 1.9 KB

Contents

require 'date'
require 'spreadsheet/row'

module Spreadsheet
  module Excel
##
# Excel-specific Row methods
class Row < Spreadsheet::Row
  ##
  # The Excel date calculation erroneously assumes that 1900 is a leap-year. All
  # Dates after 28.2.1900 are off by one.
  LEAP_ERROR = Date.new 1900, 2, 28
  ##
  # Force convert the cell at _idx_ to a Date
  def date idx
    _date at(idx)
  end
  ##
  # Force convert the cell at _idx_ to a DateTime
  def datetime idx
    _datetime at(idx)
  end
  def each &block
    size.times do |idx|
      block.call self[idx]
    end
  end
  ##
  # Access data in this Row like you would in an Array. If a cell is formatted
  # as a Date or DateTime, the decoded Date or DateTime value is returned.
  def [] idx, len=nil
    if len
      idx = idx...(idx+len)
    end
    if idx.is_a? Range
      data = []
      idx.each do |i|
        data.push enriched_data(i, at(i))
      end
      data
    else
      enriched_data idx, at(idx)
    end
  end
  private
  def _date data # :nodoc:
    return data if data.is_a?(Date)
    date = @worksheet.date_base + data.to_i
    if date > LEAP_ERROR
      date -= 1
    end
    date
  end
  def _datetime data # :nodoc:
    return data if data.is_a?(DateTime)
    date = _date data
    hour = (data % 1) * 24
    min  = (hour % 1) * 60
    sec  = ((min  % 1) * 60).round
    min = min.floor
    hour = hour.floor
    if sec > 59
      sec = 0
      min += 1
    end
    if min > 59
      hour += 1
    end
    if hour > 23
      date += 1
    end
    DateTime.new(date.year, date.month, date.day, hour, min, sec)
  end
  def enriched_data idx, data # :nodoc:
    res = nil
    if link = @worksheet.links[[@idx, idx]]
      res = link
    elsif data.is_a?(Numeric) && fmt = format(idx)
      res = if fmt.datetime? || fmt.time?
              _datetime data
            elsif fmt.date?
              _date data
            end
    end
    res || data
  end
end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
spreadsheet-0.6.2 lib/spreadsheet/excel/row.rb
spreadsheet-0.6.2.1 lib/spreadsheet/excel/row.rb
spreadsheet-0.6.3 lib/spreadsheet/excel/row.rb
spreadsheet-0.6.3.1 lib/spreadsheet/excel/row.rb