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