7

Can we use column headers to specify the column number from which we are parsing the excel sheet using roo gem? My current code is like this now:

oo = Openoffice.new("simple_spreadsheet.ods")
oo.default_sheet = oo.sheets.first
(2..oo.last_row).each do |line|
  date       = oo.cell(line,'A')
  start_time = oo.cell(line,'B')
  end_time   = oo.cell(line,'C')
  pause      = oo.cell(line,'D')
  ...
end

I would like to parse from column headers instead of specifying columns as 'A' 'B' 'C' ... Can I acheive this using Roo?

3
  • as I know only digits or alphabet can be used to access a cell. Commented Jul 20, 2011 at 18:05
  • 3
    Why does the roo website hate my eyes so much? Commented Jul 20, 2011 at 18:44
  • @mu is too short..yeah..u r right..marvellous colors they got there :P Commented Jul 20, 2011 at 18:46

4 Answers 4

3

You can grab the entire header row as an array and hash the entire row key'd on the header row.

oo = Openoffice.new("simple_spreadsheet.ods") 
oo.default_sheet = oo.sheets.first 
header = oo.row(1) 
2.upto(oo.last_row) do |line|  
  row_data =  Hash[header.zip oo.row(line)]
  ...
end

You could also use row_data[line] to nest the hashes for later use.

Sign up to request clarification or add additional context in comments.

2 Comments

could you tell me how to write to xlsx and xls file using roo
You can't, at the moment roo only supports read for Excel. You can use axlsx gem to do writing. I know - it's not ideal, but so far I cant' find a gem that does both things well.
3

A cleaner/clearer version of the above is

oo = Openoffice.new("simple_spreadsheet.ods") 
oo.default_sheet = file.sheets.first 
header = oo.first_row 
2.upto(oo.last_row) do |line|  
  row_data =  Hash[*header.zip(row).flatten]
  ...
end

the original took me a bit to understand because especially as i thought hash was a local variable named hash instead of the class Hash

Comments

2

This will use the header row as the keys. The helpful parts are transpose and strip.

def self.excel_to_hash(folder_name, file_name, tab_name)
    # Takes an excel file name and a tab name, and returns an array of stripped, transposed rows
    # Sample call:  my_data = excel_to_hash File.join(Rails.root,'db/data/data_to_import.xlsx'), 'models'
    rows = []
    file = File.open(File.join(folder_name, file_name), mode = 'r')
    excel = Excelx.new(file.path, nil, :ignore)
    excel.default_sheet = excel.sheets.index(tab_name) + 1
    header = excel.row(1)
    (2..excel.last_row).each do |i|
      next unless excel.row(i)[0]
      row = Hash[[header, excel.row(i)].transpose]      
      row.each_key{|x| row[x] = row[x].to_s.strip if row[x]}
      rows << row
    end
    return rows
  end

valid through Roo gem 1.10.2

Comments

0

This works for me

 require 'roo'
    # open excel file
    excel_file = Roo::Spreadsheet.open(file_path)
      # iterate on each sheet
      excel_file.each_with_pagename do |name, sheet|
        # iterate on each sheet
        sheet.parse(headers: true, pad_cells: true) do |row|
          # data should be access by column header if we have column header Name we can access like this
          row['Name']
        end
      end
    end

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.