読者です 読者をやめる 読者になる 読者になる

「ステュディオス」な生活

「ステュディオス」=何かを面白がり、熱中することにより生き生きしている状態。 日々の「ステュディオス」を求めて…

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 ファイルも問題なく読み込める。