RubyからExcel操作をする手順について調べてみた。
RubyからExcelを操作するライブラリ
RubyからExcelやスプレットシートを操作するライブラリはいくつかあるようだ。
標準ライブラリに含まれているものは、Win32OLEというものなので、これを試す。
環境
- Windows 7 64bit
- cygwin
- Ruby 2.0
標準ライブラリ: Win32OLE
Win32OLE は、COM とか ActiveX などと呼ばれたりする技術を扱うためのライブラリ。
COM オブジェクトは WIN32OLE::new(ProgID)という形式で呼び出す。 Excelの場合は、ProgIDは’Excel.Application’となる。
利用できるメソッドは以下のコマンドで表示できる。
$ ruby -r win32ole -e “excel = WIN32OLE.new(‘Excel.Application’);puts excel.ole_methods;”
Excelオブジェクトの整理
- Application ・・・ Excelオブジェクト本体
- WookBook ・・・ Excelワークブック
- WookSheet ・・・ Excelワークシート
- Range ・・・ Excelのセルやセルの集合。
実装
やることリスト
- xlsx拡張子の既存ファイルを開く
- 既存ファイルから情報を読みこむ
- 既存ファイルから情報を書き込む
- ファイルを保存する
ファイルオープン
Win32OLEを利用するには、wiin32oleをrequireする。
require 'win32ole'
Applicationオブジェクト
# Excelオブジェクト生成
excel = WIN32OLE.new('Excel.Application')
# FileSystemObject生成
fso = WIN32OLE.new('Scripting.FileSystemObject')
# デバッグ用表示
excel.visible = DEBUG_SHOW
WorkBookオブジェクト
bookオブジェクトを作成してファイルを開く。
# 指定したファイルを開く
book = excel.Workbooks.Open(fso.GetAbsolutePathName(FILE_PATH))
WorkSheetオブジェクト
シートの取得方法は以下。コレクションに従った記法もできるところが嬉しい。
# 一番左のシートを取得
sheet = book.Worksheets(1)
# シート名が "Sheet1" のシートを取得
sheet = book.Worksheets("Sheet1")
# bookに属するそれぞれのSheetについて操作
book.Worksheets.each {|sheet|
puts sheet.Name
}
Rangeオブジェクト
セルにアクセスする方法は以下。
# D5にアクセス
cell = sheet.Cells.Item(4, 5)
cell = sheet.Cells.Item("5", "D")
cell = sheet.Range("D5")
eachを利用してうまく処理するのがRubyをつかういいところ。
# 列ごとに処理
sheet.UsedRange.Rows.each do |row|
# セルごとに処理
row.Columns.each do |cell|
end
end
# A1 ~ A5 を取得する方法
cells = sheet.Range("A1:A5")
cells.each do |cell|
end
指定したセルの読み書き
Valueメソッドで値を書き換える
# 値の読み込み
puts cell.Value
# 値の書き込み
cell.Value = "HogeHoge"
ファイルを保存する
saveメソッドで上書き保存ができる。
book.save
Excel操作中に異常終了してしまうと、プロセスが残ってしまう。 Rubyの例外処理の仕組みをつかうのがTips
# 始め処理
begin
# 行いたい処理
sheet = book.Worksheets(1)
sheet.Cells.Item(2, "C").Value = "HogeHoge"
ensure
# 終わり処理
book.Close
excel.Quit
end