1

我正在尝试获取一张桌子,例如 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

4

1 回答 1

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] }

所以这很整洁。

于 2014-09-29T20:40:26.987 回答