• このエントリーをはてなブックマークに追加

RubyからExcel操作をする手順について調べてみた。

スポンサードリンク

RubyからExcelを操作するライブラリ

RubyからExcelやスプレットシートを操作するライブラリはいくつかあるようだ。

RubyでExcelファイルを扱うライブラリの比較 – Qiita

標準ライブラリに含まれているものは、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のセルやセルの集合。
  • Excelのクラスの説明

やることリスト

  • xlsx拡張子の既存ファイルを開く
  • 既存ファイルから情報を読みこむ
  • 既存ファイルから情報を書き込む
  • ファイルを保存する

ファイルオープン

Win32OLEを利用するには、wiin32oleをrequireする。

require 'win32ole'

Applicationオブジェクト

excelオブジェクト

# 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