6

我们可以使用列标题来指定我们使用roogem 解析 excel 表的列号吗?我现在的代码是这样的:

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

我想从列标题解析,而不是将列指定为'A' 'B' 'C' ... 我可以使用它来实现Roo吗?

4

3 回答 3

3

您可以将整个标题行作为数组抓取,并对标题行上的整个行键进行哈希处理。

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

您还可以使用row_data[line]嵌套散列以供以后使用。

于 2011-07-22T15:11:16.387 回答
3

以上的更清洁/更清晰的版本是

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 而不是类 Hash 的局部变量

于 2012-04-13T19:37:13.833 回答
1

这将使用标题行作为键。有用的部分是转置和剥离。

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 有效

于 2013-07-23T07:00:23.080 回答