たゆたふ。

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

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

集計したいデータが Excel 形式で提供されることがある。 数が少なければ ExcelLibreOffice などで 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 ファイルも問題なく読み込める。