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