Использование заголовков столбцов для разбора листов Excel с использованием roo - Ruby - PullRequest
4 голосов
/ 20 июля 2011

Можем ли мы использовать заголовки столбцов, чтобы указать номер столбца, с которого мы анализируем таблицу Excel, используя roo gem?Мой текущий код выглядит следующим образом:

oo = Openoffice.new("simple_spreadsheet.ods")
oo.default_sheet = file.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

Я бы хотел проанализировать заголовки столбцов, а не указывать столбцы как 'A' 'B' 'C' ...Могу ли я добиться этого, используя Roo?

Ответы [ 3 ]

3 голосов
/ 13 апреля 2012

Более чистая / более ясная версия выше

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

оригинал потребовал от меня немного понимания, потому что я подумал, что хеш - это локальная переменная с именем hash вместо класса Hash

3 голосов
/ 22 июля 2011

Вы можете получить всю строку заголовка в виде массива и хэшировать весь ключ строки в строке заголовка.

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 oo.row[line]]
  ...
end

Вы также можете использовать row_data[line] для вложения хэшей для последующего использования.

1 голос
/ 23 июля 2013

Это будет использовать строку заголовка в качестве ключей. Полезные части - транспонирование и удаление.

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

действует через Roo gem 1.10.2

...