複数のワークブックを集める

あるフォルダにたくさんのExcelファイルがあり、各ファイル内のワークシートを一つのファイルにまとめてみる。

テンプレート

最終的には、ワークシートの目次を作りたいので、このようなワークブックを用意しておく。 このワークブックに集めたワークシートを追加していく。 吹き出しはセルにつけた名前である。

テンプレート

このテンプレートを"collect_sheet.xls"という名前で保存しておく。

ステップ1:単純に集める

まずは、単純に集めてみよう。

スクリプトの引数でフォルダを指定して、その中のExcelファイルを順に開いていき、各ファイル内のワークシートを 先ほど作ったテンプレート内にあつめてみる。

  # collect_step1.rb
  require 'excel_lib'
  excel = Excel.new
  list_book = excel.copy_book("./collect_sheet.xls")
  
  while filename = ARGV.shift              # (A)
    p [filename, File.extname(filename)]
    next if File.extname(filename).downcase != ".xls"
    src_book = excel.open_book(filename)   # (B)
    src_book.each_sheet {|sheet|           # (C)
      list_book.add_sheet(sheet)           # (D)
    }
    src_book.close
  end
  

以下のコマンドで、subフォルダ内のExcelファイル内のワークシートを集めてくれる。

  ruby -Ks collect_step1.rb sub/*.xls
  
  • (A)は引数で指定されたファイル名を取ってくるイテレータ
  • (B)は引数で指定されたExcelファイルを開いて、src_bookがそのExcelワークブックを指す
  • (C)はワークシートのイテレータ。src_book内の各ワークシートをじゅんぐりに回っていく
  • (D)はイテレータで取り出したワークシートをテンプレートブックに追加していく

ステップ2:ワークシート名に識別名をつけてみる

持ってくるワークシートの特定のセルにユニークなIDなり名前が付いているとしよう。 これを集めてくるときに、ワークシート名にそのユニークな名前を設定してみる。

  # collect_step2.rb
  require 'excel_lib'
  excel = Excel.new
  list_book = excel.copy_book("./collect_sheet.xls")
  
  while filename = ARGV.shift
    p [filename, File.extname(filename)]
    next if File.extname(filename).downcase != ".xls"
    src_book = excel.open_book(filename)
    src_book.each_sheet {|sheet|
      unique_name = sheet.range("C2").text    # (A)
      target_sheet = list_book.add_sheet(sheet)
      target_sheet.name = unique_name         # (B)
    }
    src_book.close
  end
  

解説。

  • 各シートの"C2"セルに識別名が入っているとする。(A)でその識別名を取り出している
  • (B)でその識別名をワークシートに設定している


戻る