使用roo - Ruby使用列标题解析Excel工作表

8ulbf1ek  于 2022-11-04  发布在  Ruby
关注(0)|答案(4)|浏览(134)

我们是否可以使用列标题来指定列号,以便使用roo gem解析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实现这一点吗?

ovfsdjhp

ovfsdjhp1#

您可以将整个标题行作为一个数组获取,并对标题行上的整行关键字进行哈希运算。

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]来嵌套哈希值以备将来使用。

gwbalxhn

gwbalxhn2#

上述内容的更清晰版本

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

waxmsbnn

waxmsbnn3#

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

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

drnojrws

drnojrws4#

这对我有用

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

相关问题