たゆたふ。

定まる所なく揺れ動き、いろいろやってみたメモ。など

RubyでExcelファイルをCSVの様に読み込む

集計したいデータが Excel 形式で提供されることがある。 数が少なければ Excel や LibreOffice などで CSV に変換してから扱えばよいが、ファイル数が多いと面倒。

Excel ファイルの読み込みだけで書き込みがない、しかも Ruby で扱うなら、excel2csv が便利。 Excel ファイルを CSV のように読み込むことができる。

インストール

gem で簡単にインストールできる。

gem install excel2csv

もちろん、次の様に Gemfile を作って、Bundler を使っても良い。

gem 'excel2csv'

基本的な使い方

次の様な Excel ファイルを読み込んでみる。

f:id:HeRo:20140920163022p:plain

次のように foreach メソッドで行ごとに読むことができる。

require 'excel2csv'

def read_excel(filename)
  Excel2CSV.foreach(filename) do |row|
    p row
  end
end

read_excel 'sample.xlsx'

実行結果は次の通り。

["cell-A1", "cell-B1", "cell-C1", "cell-D1"]
["cell-A2", "cell-B2", "cell-C2", "cell-D2"]
["cell-A3", "cell-B3", "cell-C3", "cell-D3"]

結合されたセルや、複数シートも読める

次の様に結合されたセルも読み込むことができる。

f:id:HeRo:20140920163121p:plain

結合されたセルは左上のセルに値が入っているものとして扱われ、実行した結果は次の様になる。

["cell-A1", "cell-B1", nil,       nil]
["cell-A2", "cell-B2", "cell-C2", "cell-D2"]
["cell-A3", nil,       "cell-C3", "cell-D3"]
[nil,       nil,       "cell-C4", "cell-D4"]

複数のシートがある場合、デフォルトでは 1 シート目を読むが、foreach メソッドに sheet オプションで指定することで 2 シート目以降も読むことができる。 次の例は 2 シート目を読むこむ例。

require 'excel2csv'

def read_excel(filename)
  Excel2CSV.foreach(filename, sheet:1) do |row|
    p row
  end
end

read_excel 'sample.xlsx'

また、例では xlsx 形式のファイルを使っているが、xls ファイルも問題なく読み込める。