ExcelScanとは
ExcelScan ( https://github.com/miura1729/excelscan )は、RubyからExcelを簡単に使うためのライブラリです。出来ることや効率を犠牲にすることで、お手軽さを得ています。ExcelScanは基本的にExcelのシートの上から下へ行をスキャンする形で処理を書くためにこう名付けました。
このチュートリアルでは、いくつかの例を元に使い方の概要を説明したいと思います。
材料の集計
あなたは水道屋さんだとします。現場で使った材料とその量を日報に書き込んで行って、毎日家で集計しないといけません。日報の内容はこんな感じでExcelに入力されるでしょう。
これを集計しようと思います。ピボットテーブルとか駆使すれば簡単かもしれませんが、年寄りにはなかなか覚えられません。そこで、ExcelScanとRubyを使って、こんな感じのプログラムを書きます。
ruby:mat.rb
require 'excelscan'
es = ExcelScan.new("sample/material.xlsx")
table = Hash.new(0)
es.each do |row|
if row[0] then
name = "#{row[1]} #{row[2]}"
table[name] += row[3]
end
end
es.quit
table.keys.sort.each do |name|
printf "%-20s %g\n", name, table[name]
end
これで、集計が出来て、こんな感じでコンソールに出力されます。もちろん、Excelに書きだすこともできますが、ちょっと複雑なのでまた後から説明します。
エルボ φ20 8
エルボ φ25 5
チーズ φ20 2
パイプ φ20 3.5
パイプ φ25 4.3
プログラムが何をやっているのか?Ruby(Excel VBAじゃないのがミソ)になれた人ならすぐ分かるかもしれませんが、改めて説明します。
```ruby
require 'excelscan'
es = ExcelScan.new("sample/material.xlsx")
requireはExcelScanを使うためのおまじないですね。ExcelScanクラスをnewしてExcelScanオブジェクトを作ります。引数にファイル名を入れるとそのファイルを読み込んでくれます。
他にもシート名とかExcelを画面に表示するかの指定が出来るのですが、今の所は説明しません。
table = Hash.new(0)
es.each do |row|
if row[0] then
name = "#{row[1]} #{row[2]}"
table[name] += row[3]
end
end
ExcelScanオブジェクトはあたかも二次元配列のように使うことが出来ます。ExcelScan#eachメソッドは各行ごとに順番にその行の行オブジェクトを引数にブロックを実行します。このプログラムではrow変数がそうです。row変数は配列のようなインターフェースでセルの中身をアクセスできます。ちなみに、Excel VBAでは1オリジンですが、ExcelScanではRubyと同じ0オリジンです。セルが数値なら数値が得られますし、文字なら文字が得られます。この辺は変数に型の無いRubyにぴったりですね。
元データのExcelファイルは先頭にヘッダ行があるので、これを集計しないようにしなければなりません。ここでは行番号(1カラム目)が空かどうかで判別します。このあたりは煩雑と言えば煩雑ですが、単純なインタフェースを選択しました。
es.quit
立ち上げたExcelを終了します。何もしなければではRubyのプログラムが終わっても立ち上がったExcelは終了しません。
table.keys.sort.each do |name|
printf "%-20s %g\n", name, table[name]
end
集計した結果を出力します。これは、ExcelScan関係ないですね。