Ruby から Excel を操作する方法


COMコンポーネントを利用して、Ruby から Excel を操作する方法のまとめです。

COMコンポーネントは言語に依存せずに利用できるので、Ruby 以外の言語でもほとんど同じように Excel を操作できます。そのため、行いたい操作に対応するコードがわからない場合には、Excel の [マクロの記録] 機能によって自動生成される VBA のコードを参考にすると良いです。

改善点を見つけた場合には、コメント欄からご指摘いただけると助かります。

環境

この記事のコードは以下の環境で動作確認してあります。

OSWindows7
ExcelMicrosoft Office Professional Plus 2010
RubyVersion 2.0

多少環境が違っていても動くと思います。

Ruby から Excel を操作する方法

  1. Excel の起動と終了

    以下のコードを実行すると、Excel が非表示状態で起動します。

    require 'win32ole'

    excel = WIN32OLE.new('Excel.Application')

    続けて以下のコードを実行すると、Excel が表示されます。
    必要なければ表示しなくても構いませんが、開発中は表示しておくのが無難です。

    excel.visible = true

    Excel を終了するには次のようにします。

    excel.quit
  2. 既に起動している Excel への接続

    既に起動している Excel アプリケーションに接続するには WIN32OLE.new の代わりに次の様にします。

    excel = WIN32OLE.connect('Excel.Application')

    ※Excel が複数起動している場合、どれに接続するかは選べないようです。

  3. 新規 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'
  4. 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

参考サイト

[amazon asin=”4839926689″ /]

カテゴリー: 記事 タグ: , パーマリンク

コメントを残す