【问题标题】:Using Column headers to parse excel sheets using roo - Ruby使用列标题使用 roo 解析 excel 工作表 - Ruby
【发布时间】:2011-07-20 17:44:26
【问题描述】:

我们可以使用列标题来指定使用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 来实现这一点吗?

【问题讨论】:

  • 据我所知,只能使用数字或字母来访问单元格。
  • 为什么roo website 这么讨厌我的眼睛?
  • @mu 太短了..是的..你是对的..他们到达那里的奇妙色彩:P

标签: ruby-on-rails ruby import-from-excel ruby-roo


【解决方案1】:

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

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] 嵌套哈希以供以后使用。

【讨论】:

  • 你能告诉我如何使用 roo 写入 xlsx 和 xls 文件
  • 不能,目前 roo 只支持 Excel 读取。您可以使用 axlsx gem 进行写作。我知道 - 这并不理想,但到目前为止,我还找不到能同时兼顾这两件事的宝石。
【解决方案2】:

上述的更清晰/更清晰的版本是

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 的局部变量

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多