2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby で エクセルファイルを扱うインターフェイスを整える(rrxcell gem の宣伝)

Posted at

何がしたかったか?

ruby でエクセルファイルを扱うとき、代表的な gem として roorubyXL などがあります。

ただ、それぞれの gem によって書き込み・読み込み・新規作成が可能かどうかが違っていたり、扱うファイルの形式(「xls」ファイルと「xlsx」)でインターフェイスが違っていたりと、なかなか使いづらいというのが正直な感想です。

それで「それぞれの gem の得意なところを組み合わせて、インターフェイスだけ整えればいいのや」という考えになりました。

前提条件

  • エクセルファイル中のデータを値として取得する。
  • フォントや書式は考慮しない。
  • 「xls」形式も「xlsx」形式も統一的に扱う。

とりあえず gem 化

色々なプロジェクトで使えるように、便利なものは共有した方が良い。
というわけで gem にすることにしました。

rrxcell

名前は「rrxcell」としました。
由来は「Ruby Reader for eXcel Cell」・・・だったかな? 忘れてしまいました(笑)。

気持ち的には「らくさせる」と読みたいところですが、「あるあるえっくすせる」でお願いします。

gem の作り方は、他のサイトに譲ります。

など、ネット上で「gem 作り方」で検索をかけると、色々な情報が見つかります。

インターフェイスを考える

セルの値の取得

エクセルのワークブック・ワークシート・行・カラムを、メソッドチェーンでアクセスして値が読み出せれば分かりやすいと考えました。

セルの値を読み込むインターフェイス
puts book.sheet(0).row(0).column(0).value
# => "Sheet1!A1"

puts book[0][1][2].value
# => "Sheet1!C2" 

プログラマであれば、配列インデックスの開始点は「0」(ゼロ)の方がしっくりくる気がします(偏見)。
ワークシート・行・カラムのいずれも、開始点を「0」からとしました。
2つ目の例では、カラムのインデックスより先に行のインデックスが来ています。

これで、ワークシートの中の値を取得するだけなら Range#each で回すだけで OK です。

ワークブックの読み込み

ファイルの読み込み時に「xls」ファイルと「xlsx」ファイルの違いを気にしなくていいようにしたいと考えました。

ファイルを読み込むインターフェイス
path = File.expand_path("PATH/TO/FILE.xlsx") # or "PATH/TO/FILE.xls"
book = Rrxcell.load(path)

今回作成した rrxcell を作るまでは、加工前のファイルが「xls」形式か「xlsx」形式かで、rooroo-xls、場合によっては rubyXL を使い分けていました。

それぞれファイルの読み込みや新規作成のインターフェイスが違っていたので、プログラムの改変・修正するたびに利用法を調べ直したりも面倒でした。

より「直感的な」セルへのアクセス

ワークシート・セルへのアクセスを、配列的に(インデックスで)行なうのとは別に、ワークシートの名前や「A1」形式でのアクセスもできれば簡単だろうと考えました。

より「直感的な」アドレスの利用
puts book.address("Sheet1!B2").value
# => "Sheet1!B2"

puts book.sheet(0).address("B2").value
# => "Sheet1!B2"

puts book.sheet("Sheet1").address("AB3").value
# => "Sheet1!AB3"

3番目の例、文字列でワークシートのインデックスを指定する部分は、少し迷いました。
#sheet の引数を数値限定にして、#address の引数を文字列限定にする案もあったのですが、プログラム的にはあまり難しいところはないと考え、使いやすさを優先しました(v0.2.0 時点)。

今までの成果

エクセルファイルをデータソースとして捉えた時に、データの値が読み込めれば OK という前提で行けば、かなりシンプルなインターフェイスで扱えると思います。

フォントなどの書式へのアクセスや、書き出し・保存のインターフェイスに関しては、バージョンアップするか別の gem にまとめようか現在検討中ですが、何もしない可能性もあります(現状 v0.2.0 で十分なので)。

あとは、ファイルの書式・用途に合わせて専用のリーダークラスを作れば、データの変換が楽になるはずです。

例えば「毎月数社の協力業者から送られて来る、それぞれ別の書式で書かれたスケジュールのエクセルファイルから、必要なスケジュールの日付とタスクを抽出する」など。

蛇足

最後の例文を読んで薄々気づいているかと思いますが、実際には「そのため」に作った gem です(笑)。

そもそも「それ用の WEB システム」を作るなり、他の Saas などを使った方が最終的には楽なんでしょうが、協力業者の中には PC ・スマホの操作が難しい世代・事情の方々もいるし、システムの開発・操作教育(協力業者含め)にコストをかけるのが難しい企業の事情、既存システムで痒い所に手が届くか(孫の手問題)などもあります。

今の資産・手法を「できる範囲で自動化していく」という視点で見ると、システムを持っている側で変換用のサブシステム(孫の手)を作る、いうことの第一歩になったのではないかと思います。

さらに蛇足

エクセルファイル嫌い。

参照

ほか、各種サイト。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?