使用Roo仅读取xlsx文件的第二行

时间:2018-10-05 08:23:04

标签: ruby roo

我正在使用roo来读取xlsx文件。

book = Roo::Spreadsheet.open("codes.xlsx")
sheet = book.sheet('Sheet1')

这将读取文件中的所有行。

我可以使用

遍历此工作表
plans_sheet.each(column_1: 'column_1', column_2: 'column_2') do |hash|

但是此迭代从第一行开始,该行也具有所有列名。 我只需要 第二行数据。

更新- 当您执行row(2)时,它将返回一个数组。当您使用.each进行迭代时,它将返回一个以列名作为键的哈希值。

操作方法。

3 个答案:

答案 0 :(得分:1)

Roo::Excelx#each方法返回标准的Ruby枚举器:

enum = sheet.each(column_1: 'column_1', column_2: 'column_2')
enum.class # => Enumerator

因此,有两种方法可以实现您的目标:

1)使用drop方法:

enum.drop(1).each do |hash| 
  # do something with the hash    
end

如果仅需要第二行:

  hash = enum.drop(1).first

2)移动迭代器的内部位置:

enum.next # move 1 step forward to skip the first row

# continue moving
loop do
  hash = enum.next
  # do something with the hash
end

如果仅需要第二行:

  enum.next # skip the first row
  hash = enum.next # second row

还请考虑:

有一个Roo::Excelx::Sheet类,它也代表一个工作表,并具有接收each_row参数的:offset方法。但是不幸的是,它没有选项可以将行转换为具有给定键的哈希。

book = Roo::Spreadsheet.open("codes.xlsx")
sheet = book.sheet_for('Sheet1')

sheet.each_row(offset: 1) do |row| # skip first row
  # do something with the row
end

答案 1 :(得分:0)

如果要遍历从第二个开始的行,只需使用Enumerable#drop

plans_sheet.each(column_1: 'column_1', column_2: 'column_2').drop(1) do |hash|
  # ...
end

答案 2 :(得分:-1)

就做

whatever_sheet.row(2)

看看文档总是一件好事,它在Gem的README.md中进行了说明,请参见https://github.com/roo-rb/roo#accessing-rows-and-columns