Module: Workbook::Readers::XlsReader

Includes:
XlsShared
Included in:
Book
Defined in:
lib/workbook/readers/xls_reader.rb

Constant Summary

Constants included from XlsShared

Workbook::Readers::XlsShared::XLS_COLORS

Instance Method Summary collapse

Methods included from XlsShared

#html_color_to_xls_color, #ms_formatting_to_strftime, #num_fmt_id_to_ms_formatting, #strftime_to_ms_format, #xls_number_to_date, #xls_number_to_time

Instance Method Details

#load_xls(file_obj, options) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/workbook/readers/xls_reader.rb', line 13

def load_xls file_obj, options
  begin
    sp = Spreadsheet.open(file_obj, 'rb')
    template.add_raw sp
    parse_xls sp, options
  rescue Ole::Storage::FormatError
    begin
      # Assuming it is a tab separated txt inside .xls
      import(file_obj.path, 'txt')
    rescue Exception => ef

      raise ef
    end
  end

end

#parse_xls(xls_spreadsheet = , options = {}) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/workbook/readers/xls_reader.rb', line 91

def parse_xls xls_spreadsheet=template.raws[Spreadsheet::Excel::Workbook], options={}
  options = {:additional_type_parsing=>true}.merge options
  number_of_worksheets = xls_spreadsheet.worksheets.count
  number_of_worksheets.times do |si|
    xls_sheet = xls_spreadsheet.worksheets[si]
    if [:visible, :hidden, nil].include? xls_sheet.visibility # don't read :strong_hidden sheets, symmetrical to the writer
      begin
        number_of_rows = xls_sheet.count
        s = create_or_open_sheet_at(si)
        s.name = xls_sheet.name
        number_of_rows.times do |ri|
          parse_xls_row ri, s, xls_sheet
        end
      rescue TypeError
        puts "WARNING: Failed at worksheet (#{si})... ignored"
        #ignore SpreadsheetGem can be buggy...
      end
    end
  end
end

#parse_xls_cell(xls_cell, xls_row, ci) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/workbook/readers/xls_reader.rb', line 30

def parse_xls_cell xls_cell, xls_row, ci
  rv = Workbook::Cell.new nil
  begin
    rv = Workbook::Cell.new xls_cell
    rv.parse!
  rescue ArgumentError => e
    if e.message.match('not a Spreadsheet::Formula')
      v = xls_cell.value
      if v.class == Float and xls_row.format(ci).date?
        xls_row[ci] = v
        v = xls_row.datetime(ci)
      end
      if v.is_a? Spreadsheet::Excel::Error
        v = "----!"
      end
      rv = Workbook::Cell.new v
    elsif e.message.match('not a Spreadsheet::Link')
      rv = Workbook::Cell.new xls_cell.to_s
    elsif e.message.match('not a Spreadsheet::Link')
      rv = Workbook::Cell.new xls_cell.to_s
    elsif e.message.match('not a Spreadsheet::Excel::Error')
      rv = "._."
    else
      rv = "._."  # raise e (we're going to be silent for now)
    end
  end
  rv
end

#parse_xls_format(xls_row, ci, ri, col_widths) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/workbook/readers/xls_reader.rb', line 59

def parse_xls_format xls_row, ci, ri, col_widths
  xls_format = xls_row.format(ci)
  col_width = nil

  if ri == 0
    col_width = col_widths[ci]
  end

  f = template.create_or_find_format_by "object_id_#{xls_format.object_id}",col_width
  f[:width]= col_width
  f[:rotation] = xls_format.rotation if xls_format.rotation
  f[:background_color] = xls_color_to_html_hex(xls_format.pattern_fg_color)
  f[:number_format] = ms_formatting_to_strftime(xls_format.number_format)
  f[:text_direction] = xls_format.text_direction
  f[:font_family] = "#{xls_format.font.name}, #{xls_format.font.family}"
  f[:font_weight] = xls_format.font.weight
  f[:color] = xls_color_to_html_hex(xls_format.font.color)

  f.add_raw xls_format
  f
end

#parse_xls_row(ri, s, xls_sheet) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/workbook/readers/xls_reader.rb', line 81

def parse_xls_row ri, s, xls_sheet
  xls_row = xls_sheet.row(ri)
  r = s.table.create_or_open_row_at(ri)
  col_widths = xls_sheet.columns.collect{|c| c.width if c}
  xls_row.each_with_index do |xls_cell,ci|
    r[ci] = parse_xls_cell xls_cell, xls_row, ci
    r[ci].format = parse_xls_format xls_row, ci, ri, col_widths
  end
end