22 Mar 2014, 05:56

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

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

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

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

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

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

環境

<div id="text-1-1" class="outline-text-3">
  <ul class="org-ul">
    <li>
      Windows 7 64bit
    </li>
    <li>
      cygwin
    </li>
    <li>
      Ruby 2.0
    </li>
  </ul>
</div>

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拡張子の既存ファイルを開く
  • 既存ファイルから情報を読みこむ
  • 既存ファイルから情報を書き込む
  • ファイルを保存する

ファイルオープン

<div id="text-2-1" class="outline-text-3">
  <p>
    Win32OLEを利用するには、wiin32oleをrequireする。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby">require <span style="color: #e6db74;">'win32ole'</span>

<div id="outline-container-sec-2-1-1" class="outline-4">
  <h4 id="sec-2-1-1">
    Applicationオブジェクト
  </h4>

  <div id="text-2-1-1" class="outline-text-4">
    <p>
      excelオブジェクト
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">Excelオブジェクト生成</span>

excel = WIN32OLE.new(‘Excel.Application’) # FileSystemObject生成 fso = WIN32OLE.new(‘Scripting.FileSystemObject’) # デバッグ用表示 excel.visible = DEBUG_SHOW

<div id="outline-container-sec-2-1-2" class="outline-4">
  <h4 id="sec-2-1-2">
    WorkBookオブジェクト
  </h4>

  <div id="text-2-1-2" class="outline-text-4">
    <p>
      bookオブジェクトを作成してファイルを開く。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">指定したファイルを開く</span>

book = excel.Workbooks.Open(fso.GetAbsolutePathName(FILE_PATH))

<div id="outline-container-sec-2-1-3" class="outline-4">
  <h4 id="sec-2-1-3">
    WorkSheetオブジェクト
  </h4>

  <div id="text-2-1-3" class="outline-text-4">
    <p>
      シートの取得方法は以下。コレクションに従った記法もできるところが嬉しい。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">一番左のシートを取得</span>

sheet = book.Worksheets(1)

# シート名が “Sheet1” のシートを取得 sheet = book.Worksheets(“Sheet1”)

# bookに属するそれぞれのSheetについて操作 book.Worksheets.each {|sheet| puts sheet.Name }

    <ul>
      <li>
        <a href="http://d.hatena.ne.jp/maluboh/20070708#p1">2007-07-08 &#8211; まるぼ~の日記</a>
      </li>
    </ul>
  </div>
</div>

<div id="outline-container-sec-2-1-4" class="outline-4">
  <h4 id="sec-2-1-4">
    Rangeオブジェクト
  </h4>

  <div id="text-2-1-4" class="outline-text-4">
    <p>
      セルにアクセスする方法は以下。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">D5にアクセス</span>

cell = sheet.Cells.Item(4, 5) cell = sheet.Cells.Item(“5”, “D”) cell = sheet.Range(“D5”)

    <p>
      eachを利用してうまく処理するのがRubyをつかういいところ。
    </p>

    <div class="org-src-container">
      <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">列ごとに処理</span>

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

指定したセルの読み書き

<div id="text-2-2" class="outline-text-3">
  <p>
    Valueメソッドで値を書き換える
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby"><span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">値の読み込み</span>

puts cell.Value

# 値の書き込み cell.Value = “HogeHoge”

ファイルを保存する

<div id="text-2-3" class="outline-text-3">
  <p>
    saveメソッドで上書き保存ができる。
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby">book.save

  <p>
    Excel操作中に異常終了してしまうと、プロセスが残ってしまう。 Rubyの例外処理の仕組みをつかうのがTips
  </p>

  <div class="org-src-container">
    <pre class="src src-ruby">  <span style="color: #8f8f8f;"># </span><span style="color: #8f8f8f;">始め処理</span>

begin # 行いたい処理 sheet = book.Worksheets(1) sheet.Cells.Item(2, “C”).Value = “HogeHoge” ensure # 終わり処理 book.Close excel.Quit end

結果

Links