Techioz Blog

Ruby gem Roo ワークブックの各行シート

概要

ここの他の投稿で述べたように、roo gem にはいくつかの複雑なドキュメントが含まれており、xlsx ワークブックのシートを反復処理してから各シートの行を反復処理する方法がわかりません。

ルージェム

各シートを反復処理すると、シート自体への参照ではなく、シートの名前のみが表示されます。だから宣言しなきゃいけないんです。すべての行を反復処理する方法はまだありません。

s = '/Users/user3/Desktop/departments.xlsx'
a = Roo::Spreadsheet.open(s)
sheets = a.sheets.reverse

sheets.each_with_index do |index, i|
  sheet = a.sheet(index)
  sheet.each_row do|row|
    puts row
  end
end

roo ドキュメントの他の例では、ワークブック ファイル内にデフォルトのシートと 1 つのシートがあることを前提としています。私の場合はそうではないので、すぐに混乱してしまいます。

テストして分析に含めるために、すべてのシートと行を反復処理するにはどうすればよいでしょうか?私が作業しているスプレッドシートには、空白の列と多くの行があり、いくつかのアートワークが含まれています…典型的なオフィス関連のものです。これらの人々はデータ担当者ではありません。スプレッドシートでの「創造性」を回避するには、すべての行を反復してテストし、空白セルを削除します。

ある程度の洞察力のある人は本当に感謝しています。

解決策

シート名をシートメソッドに渡す必要があります。このメソッドは次のように宣言します: Roo::Base#sheet

file = 'xxx/xxx.xlsx' # your file path
wb = Roo::Spreadsheet.open(file, extension: :xlsx)
sheet_names = wb.sheets # all sheet names in this workbook

sheet_names.each do |sheet_name|
  curr_sheet = wb.sheet(sheet_name) # change default sheet

  curr_sheet.each_row_streaming do |row|
     # do something 
  end
end

上記の方法はすべてのテーブルを走査できますが、シートのコンテンツを操作するときに次の問題も発生します。

などなど、問題の連続です

別の Ruby gem を使用するか、Java の poi や easyexcel などの別の言語を使用して処理することをお勧めします。