MAGAZINE
ルーターマガジン
クローリング/スクレイピング
rooを使ってrubyでExcelファイルをパースする方法
2018.07.27
はじめに
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)
セルを取得する
取得したシートに対して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 # 最後の列番号表示する
セル結合されたセルを取得する方法
セル結合されたセルはデフォルトだと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に変換
最後に
以上、rooの使い方を簡単にまとめてみました。
rooを使えばこのようにrubyで簡単にexcelファイルの中身を読み取ることができることができます。
今回紹介した機能の他にも様々な機能が用意されているので、詳細はrooのgithubを見てみてください!
CONTACT
お問い合わせ・ご依頼はこちらから