1

我正在使用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 进行迭代时,它会返回一个以列名作为键的哈希。

怎么做。

4

3 回答 3

2

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
于 2018-10-05T12:12:05.920 回答
0

如果您想从第二个开始迭代行,只需使用Enumerable#drop

plans_sheet.each(column_1: 'column_1', column_2: 'column_2').drop(1) do |hash|
  # ...
end
于 2018-10-05T11:30:35.850 回答
-1

做就是了

whatever_sheet.row(2)

查看文档总是好的,它在 Gem 的 README.md 中进行了解释,请参阅https://github.com/roo-rb/roo#accessing-rows-and-columns

于 2018-10-05T09:09:48.003 回答