COMコンポーネントを利用して、Ruby から Excel を操作する方法のまとめです。
COMコンポーネントは言語に依存せずに利用できるので、Ruby 以外の言語でもほとんど同じように Excel を操作できます。そのため、行いたい操作に対応するコードがわからない場合には、Excel の [マクロの記録] 機能によって自動生成される VBA のコードを参考にすると良いです。
改善点を見つけた場合には、コメント欄からご指摘いただけると助かります。
環境
この記事のコードは以下の環境で動作確認してあります。
OS | Windows7 |
---|---|
Excel | Microsoft Office Professional Plus 2010 |
Ruby | Version 2.0 |
多少環境が違っていても動くと思います。
Ruby から Excel を操作する方法
Excel の起動と終了
以下のコードを実行すると、Excel が非表示状態で起動します。
require 'win32ole' excel = WIN32OLE.new('Excel.Application')
続けて以下のコードを実行すると、Excel が表示されます。
必要なければ表示しなくても構いませんが、開発中は表示しておくのが無難です。excel.visible = true
Excel を終了するには次のようにします。
excel.quit
既に起動している Excel への接続
既に起動している Excel アプリケーションに接続するには WIN32OLE.new の代わりに次の様にします。
excel = WIN32OLE.connect('Excel.Application')
※Excel が複数起動している場合、どれに接続するかは選べないようです。
新規 Excel ファイルの作成
%TMP% フォルダに sample.xlsx というファイルを作成します。
require 'win32ole' excel = WIN32OLE.new('Excel.Application') excel.visible = true # 新規ブックを作成 workbook = excel.workbooks.add # 先頭シートの左上のセルに "TEST" と書き込む workbook.sheets[1].rows[1].columns[1] = "TEST" # 保存 workbook.saveAs ENV['TMP'] + '\sample.xlsx'
Excel ファイルのオープンとクローズ
%TMP%\sample.xlsx を開き、先頭シートの左上のセルの値をコンソールに表示した後ファイルを閉じます。
require 'win32ole' excel = WIN32OLE.new('Excel.Application') excel.visible = true # ファイルを開く workbook = excel.workbooks.open ENV['TMP'] + '\sample.xlsx' # 先頭シートの左上のセルの値を読み込む p workbook.sheets[1].rows[1].columns[1].value # ファイルを閉じる workbook.close excel.quit
サンプルコード
九九の表を作成
require 'win32ole' excel = WIN32OLE.new('Excel.Application') excel.visible = true # 定数のロード module Excel; end WIN32OLE.const_load(excel, Excel) # 新規ブックを作成 workbook = excel.workbooks.add # 先頭シートを選択 sheet = workbook.sheets[1] # 九九の表を作成 (1..9).each do |i| sheet.rows[1].columns[i + 1] = i sheet.rows[i + 1].columns[1] = i end sheet.range('B2:J10').value = '=$A2*B$1' # ボーダーライン sheet.range('A1:J10').borders.lineStyle = Excel::XlContinuous # 表のヘッダー range = sheet.range('A1:A10,B1:J1') # 背景色 range.interior.themeColor = Excel::XlThemeColorAccent1 # フォント range.font.themeColor = Excel::XlThemeColorDark1 range.font.bold = true # 列の幅 sheet.columns('A:J').columnWidth = 6
上で作った表を読み込み、タブ区切りに変換して表示
九九の表作成後、Excel を終了させずに実行してください。
require 'win32ole' excel = WIN32OLE.connect('Excel.Application') excel.activeWorkBook.sheets[1].usedRange.rows.each do |row| puts row.columns.each.map(&:value).map(&:to_i).join("\t") end
参考サイト
- Rubyist Magazine - Win32OLE 活用法 【第 2 回】 Excel
- Excel オブジェクト モデルを使用した Excel の自動化 | MSDN
- Microsoft.Office.Tools.Excel 名前空間 | MSDN
- win32ole | Ruby 2.0.0 リファレンスマニュアル
[amazon asin="4839926689" /]