Class: Roo::Excel

Inherits:
Base
  • Object
show all
Defined in:
lib/roo/excel.rb

Overview

Class for handling Excel-Spreadsheets

Defined Under Namespace

Modules: ExcelFontExtensions

Constant Summary collapse

FORMULAS_MESSAGE =
'the spreadsheet gem does not support forumulas, so roo can not.'
CHARGUESS =
begin
  require 'charguess'
  true
rescue LoadError
  false
end

Constants inherited from Base

Base::TEMP_PREFIX

Instance Attribute Summary collapse

Attributes inherited from Base

#default_sheet, #header_line, #headers

Instance Method Summary collapse

Methods inherited from Base

#column, #each, #each_with_pagename, #empty?, #find, #first_column, #first_column_as_letter, #first_row, #info, #last_column, #last_column_as_letter, #last_row, #method_missing, #parse, #reload, #row, #row_with, #set, #sheet, #to_csv, #to_matrix, #to_xml, #to_yaml

Constructor Details

#initialize(filename, options = {}, deprecated_file_warning = :error) ⇒ Excel

Creates a new Excel spreadsheet object. Parameter packed: :zip - File is a zip-file


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/roo/excel.rb', line 18

def initialize(filename, options = {}, deprecated_file_warning = :error)
  if Hash === options
    packed = options[:packed]
    file_warning = options[:file_warning] || :error
    mode = options[:mode] || "rb+"
  else
    warn 'Supplying `packed` or `file_warning` as separate arguments to `Roo::Excel.new` is deprecated. Use an options hash instead.'
    packed = options
    mode = "rb+"
    file_warning = deprecated_file_warning
  end

  file_type_check(filename,'.xls','an Excel', file_warning, packed)
  make_tmpdir do |tmpdir|
    filename = download_uri(filename, tmpdir) if uri?(filename)
    filename = open_from_stream(filename[7..-1], tmpdir) if filename[0,7] == "stream:"
    filename = unzip(filename, tmpdir) if packed == :zip

    @filename = filename
    unless File.file?(@filename)
      raise IOError, "file #{@filename} does not exist"
    end
    @workbook = Spreadsheet.open(filename, mode)
  end
  super(filename, options)
  @formula = Hash.new
  @fonts = Hash.new
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Roo::Base

Instance Attribute Details

#workbookObject (readonly)

Returns the value of attribute workbook


14
15
16
# File 'lib/roo/excel.rb', line 14

def workbook
  @workbook
end

Instance Method Details

#cell(row, col, sheet = nil) ⇒ Object

returns the content of a cell. The upper left corner is (1,1) or ('A',1)


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/roo/excel.rb', line 64

def cell(row,col,sheet=nil)
  sheet ||= @default_sheet
  validate_sheet!(sheet)

  read_cells(sheet)
  raise "should be read" unless @cells_read[sheet]
  row,col = normalize(row,col)
  if celltype(row,col,sheet) == :date
    yyyy,mm,dd = @cell[sheet][[row,col]].split('-')
    return Date.new(yyyy.to_i,mm.to_i,dd.to_i)
  end
  if celltype(row,col,sheet) == :string
    return platform_specific_encoding(@cell[sheet][[row,col]])
  else
    if @cell[sheet] and @cell[sheet][[row,col]]
      return @cell[sheet][[row,col]]
    else
      return nil
    end
  end
end

#celltype(row, col, sheet = nil) ⇒ Object

returns the type of a cell:

  • :float

  • :string,

  • :date

  • :percentage

  • :formula

  • :time

  • :datetime


94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/roo/excel.rb', line 94

def celltype(row,col,sheet=nil)
  sheet ||= @default_sheet
  read_cells(sheet)
  row,col = normalize(row,col)
  begin
    if @formula[sheet] and @formula[sheet][[row,col]]
      :formula
    elsif @cell_type[sheet]
      @cell_type[sheet][[row,col]]
    end
  rescue
    puts "Error in sheet #{sheet}, row #{row}, col #{col}"
    raise
  end
end

#encoding=(codepage) ⇒ Object


47
48
49
# File 'lib/roo/excel.rb', line 47

def encoding=(codepage)
  @workbook.encoding = codepage
end

#font(row, col, sheet = nil) ⇒ Object

Given a cell, return the cell's font


122
123
124
125
126
127
# File 'lib/roo/excel.rb', line 122

def font(row, col, sheet=nil)
  sheet ||= @default_sheet
  read_cells(sheet)
  row,col = normalize(row,col)
  @fonts[sheet][[row,col]]
end

#formula(row, col, sheet = nil) ⇒ Object Also known as: formula?

returns NO formula in excel spreadsheets

Raises:

  • (NotImplementedError)

111
112
113
# File 'lib/roo/excel.rb', line 111

def formula(row,col,sheet=nil)
  raise NotImplementedError, FORMULAS_MESSAGE
end

#formulas(sheet = nil) ⇒ Object

returns NO formulas in excel spreadsheets

Raises:

  • (NotImplementedError)

117
118
119
# File 'lib/roo/excel.rb', line 117

def formulas(sheet=nil)
  raise NotImplementedError, FORMULAS_MESSAGE
end

#longest_sheetObject

this method lets you find the worksheet with the most data


57
58
59
60
61
# File 'lib/roo/excel.rb', line 57

def longest_sheet
  sheet(@workbook.worksheets.inject {|m,o|
    o.row_count > m.row_count ? o : m
  }.name)
end

#sheetsObject

returns an array of sheet names in the spreadsheet


52
53
54
# File 'lib/roo/excel.rb', line 52

def sheets
  @workbook.worksheets.collect {|worksheet| normalize_string(worksheet.name)}
end

#to_s(sheet = nil) ⇒ Object

shows the internal representation of all cells mainly for debugging purposes


131
132
133
134
135
# File 'lib/roo/excel.rb', line 131

def to_s(sheet=nil)
  sheet ||= @default_sheet
  read_cells(sheet)
  @cell[sheet].inspect
end