我试图获得一张桌子,例如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
手动切割?
答案 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] }
这很整洁。