はじめに

RubyからExcelファイルを読み込む方法を解説します。
Excelファイルを扱えるgemはいくつかありますが、今回はxlsとxlsx両方に対応している「roo」を使います。

動作環境

  • OS X El Capitan 10.12.6
  • ruby 2.3.4
  • roo 2.7.1

rooのインストール

xlsxはroo、xlsはroo-xlsで扱える。

gem install roo
gem install roo-xls

Excelファイルを読み込む

  • xlsxの場合
require 'roo'

xlsx = Roo::Excelx.new('sample.xlsx')
  • xlsの場合
require 'roo-xls'

xls = Roo::Excel.new('sample.xls')

シートを指定する

sheet(シート番号 or シート名)でシートを指定できる。

xlsx = Roo::Excelx.new('sample.xlsx')

xlsx.sheet('Sheet1')
xlsx.sheet(0)

行を取得する

取得したシートに対してrow(行数で)で任意の行を取得できる。

xlsx = Roo::Excelx.new('sample.xlsx')

xlsx.sheet('Sheet1').row(1)
xlsx.sheet(0).row(1)

セルを取得する

excel

取得したシートに対してcell(行、列)で値を取得できる。

xlsx = Roo::Excelx.new('sample.xlsx')
sheet = xlsx.sheet(0)

#セルを行列で指定する
p sheet.cell(1,1)
# => "id"
p sheet.cell('A',1)
# => "id"
p sheet.cell(1,'A')
# => "id"
p sheet.a1
# => "id"

最後の行・列番号の取得方法。

xlsx = Roo::Excelx.new('sample2.xlsx')
sheet = xlsx.sheet(0)

p sheet.last_row
# => 5           # 最後の行番号を表示する
p sheet.last_column
# => 3            # 最後の列番号表示する

セル結合されたセルを取得する方法

excel

セル結合されたセルはデフォルトだと1セルしか取得されず、残りのセルはnilになる。

xlsx = Roo::Excelx.new('sample2.xlsx')
sheet = xlsx.sheet(0)

p sheet.row(2)
=> ["aaa", 20, nil]

以下のようにExcel取り込み時に指定をしてあげると、結合されたセル全てで値が取得される。

xlsx = Roo::Excelx.new('sample2.xlsx', {:expand_merged_ranges => true})
sheet = xlsx.sheet(0)

p sheet.row(2)
=> ["aaa", 20, 20]

ただし、expand_merged_rangesはrooのみ、つまりxlsxのみ対応で、
roo-xlsの場合は対応していないので注意。

色々な形式に変換する

CSV、行列、XML、YAMLへの変換ができる。

sheet.to_csv #csvに変換
sheet.to_matrix #行列に変換
sheet.to_xml #xmlに変換
sheet.to_yaml #yamlに変換

excel

最後に

以上、rooの使い方を簡単にまとめてみました。
rooを使えばこのようにrubyで簡単にexcelファイルの中身を読み取ることができることができます。

今回紹介した機能の他にも様々な機能が用意されているので、詳細はrooのgithubを見てみてください!

https://github.com/roo-rb/roo