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

セル参照 ( et al) に基づいて行と列の範囲を動的に計算したい場合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] }

もちろん、最後の 3 行をワンライナーにすることもできます。

アップデート:

RubyXL::Reference ドキュメントを詳しく見ると、セル参照を に直接渡すことができるように見えますReference#initialize。これは基本的に、上記の最初の 6 行とまったく同じことを行います。

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

それはいいですね。

于 2014-09-29T20:40:26.987 に答える