RubyでExcelを操作する

 xlsデータを読み込むためにはいくつかの方法があるらしい。

  Win32API、ParseExcelやSpreadsheetというライブラリがあるようだ。

  Win32APIはWindows環境以外だと動かないらしい。

  • 用語
    • パース:プログラムのソースコードXML文書など、一定の文法に従って記述された複雑な構造のテキスト文書を解析し、プログラムで扱えるようなデータ構造の集合体に変換することなどを指す。

Win32API

  • Excelのオブジェクトモデル
    • Application オブジェクト
    • Workbook オブジェクト
    • Worksheet オブジェクト
    • Range オブジェクト
  • 説明
    • Applicationオブジェクト⇒Excelアプリ自身、実行中の情報を取得できる
    • Workbookオブジェクト⇒開いている特定のブック
    • Worksheetオブジェクト⇒ブックの中の一枚のシート
    • Rangeオブジェクト⇒セル・行・列・1つ以上のセルのブロックを含む範囲+複数のセルにまたがるグループを表現します。目的の範囲をRangeオブジェクトとして取得することでその値や、境界線、書式などを取得、変更できる
    • Applicationオブジェクト⇒所有する⇒Workbookオブジェクト⇒所有する⇒Workbookオブジェクト⇒所有する⇒Worksheetオブジェクト⇒使用する⇒Range オブジェクト
  • Excelファイルをパースする
    • ファイルの絶対パスの取得方法・・・(1)
    • Excelファイルの開き方・・・(2)
    • 全ワークシートに対して処理を行う方法・・・(3)
    • 全行、全列に対して処理を行う方法・・・(4)
    • ブックの閉じ方、始め処理、終わり処理のイディオム・・・(5)
    • セルの値の取得の仕方・・・(6)
    • Excelのセルの型とRubyの型の関係・・・(7)
require 'win32ole'
def getAbsolutePath filename・・・(1)
  fso = WIN32OLE.new('Scripting.FileSystemObject')
  return fso.GetAbsolutePathName(filename)
end
filename = getAbsolutePath("sample.xls") #引数:任意のファイル名・・・(1)
xl = WIN32OLE.new('Excel.Application')
book = xl.Workbooks.Open(filename)・・・(2)
begin
  book.Worksheets.each do |sheet|・・・(3)
#UsedRangeは何かしら操作がされているセル(罫線やセル結合など含む)がなくなるまで全部を範囲にする。
    sheet.UsedRange.Rows.each do |row|・・・(4)
#    sheet.Range("B1:F20").Rows.each do |row| ⇒このように範囲指定も可。
      record = []
      row.Columns.each do |cell|・・・(4)
        record << cell.Value・・・(6)
      end
      puts record.join(",")
    end
  end
ensure・・・(5)
  book.Close
  xl.Quit
end
  • 処理の流れ
    • フルパスの取得⇒excelオブジェクト生成⇒excelファイルの読み込み⇒ループしながらexcelデータの出力⇒excelを閉じる

Spreadsheet

  • 参照(わかり易くまとめてあるサイトがあったので直で参照してください。)

     http://doruby.kbmj.com/yuki-Ruby/20091216/Ruby_Excel_