使用RubyXL解析Excel电子表格的特定部分

时间:2014-09-29 19:45:05

标签: ruby rubyxl

我试图获得一张桌子,例如A1:A9到G1:G9。

我的问题是,表格中还有其他元素我不想迭代。

workbook = RubyXL::Parser.parse("excelFIle.xlsm")
worksheet = workbook[0]
data = worksheet.extract_data
# => [ [ x, x, x, x, x, x, x, x, x, y, y, y, y, y, y, y, y, y, y ],
#      [ x, x, x, x, x, x, x, x, x, y, y, y, y, y, y, y, y, y, y ],
#      ...
#    ]

有没有办法只解析" x" A1部分:A9到G1:G9,还是需要从data手动切割?

1 个答案:

答案 0 :(得分:2)

做你要求的最直接的方法就是切每行:

data[0..8].map {|row| row[0..6] }

如果你想根据单元格引用(A1等)动态计算行和列范围,你需要做更多的工作(这是未经测试的,但你明白了):

top_left_ref = 'A1'
bottom_right_ref = 'G9'

# Convert the cell references to row and column indexes
row_start, col_start = RubyXL::Reference.ref2ind(top_left_ref)     # => [ 0, 0 ]
row_end,   col_end   = RubyXL::Reference.ref2ind(bottom_right_ref) # => [ 8, 6 ]

row_range = row_start..row_end # => 0..8
col_range = col_start..col_end # => 0..6

puts data[row_range].map {|row| row[col_range] }

当然,你可以将最后三行变成一行。

更新

仔细观察RubyXL :: Reference文档,看起来我们可以将单元格引用直接传递给Reference#initialize,这基本上与前面的前六行完全相同:

ref = RubyXL::Reference.new('A1:G9')
puts data[ref.row_range].map {|row| row[ref.col_range] }

这很整洁。