Quantcast
Channel: Futurismo
Viewing all articles
Browse latest Browse all 91

RubyからExcelを操作する方法について

$
0
0

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

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

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

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

標準ライブラリに含まれているものは、Win32OLEというものなので、これを試す。

環境

  • Windows 7 64bit
  • cygwin
  • Ruby 2.0

Win32OLE

Win32OLE は、COM とか ActiveX などと呼ばれたりする技術を扱うためのライブラリ。

  • Rubyist Magazine – Win32OLE 活用法 【第 1 回】 Win32OLE ことはじめ
  • 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
    }
    
  • 2007-07-08 – まるぼ~の日記
  • 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
    

    結果


    Viewing all articles
    Browse latest Browse all 91

    Trending Articles