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

Posted

技术标签:

【中文标题】使用列标题使用 roo 解析 excel 工作表 - Ruby【英文标题】:Using Column headers to parse excel sheets using roo - 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 【参考方案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 有效

【讨论】:

以上是关于使用列标题使用 roo 解析 excel 工作表 - Ruby的主要内容,如果未能解决你的问题,请参考以下文章

使用列映射将 Excel 工作表导入到 Mongodb 数据库

如何使用微软互操作将工作表开头的新列添加到现有 excel

如何在python中使用pandas在现有的excel工作表中追加列

清除与多个Excel工作表中的列对应的值

当从r输出到excel工作表(使用xlsx包)时,数据框列标题中的问号为什么显示为句点?

使用 VBA 将数据从主工作表传输到基于列的多个工作表