parseexcel 0.5.2 は結合セルに対応していない?

linux上でエクセルデータを読んでHTMLのテーブルに変換したかったので、parseexcel を試しているのだけれど、このライブラリはちょっと弱すぎるなあ。いまこのライブラリはSpreadsheetというプロジェクトに統合されている。このプロジェクトにはspreadsheet-excelとparseexcelのふたつが含まれているようだ。gemで別々にインストールできる。親切な説明はないけれど、見る限りparseexcelはエクセルを読む、spreadsheet-excelはエクセルを作成する機能を持つらしい。今回は読みたいのでparseexcelを試した。

なお、2007形式はそもそもエラーで落ちて読みさえしなかったので、97-2003形式で。

さて、いちばんやりたかったのはparseexcelで「結合されたセルの情報を取得する」ことである。ところがどうもこれに対応できないできないらしい。

結合セルの情報はマイクロソフトから展開されたエクセルの仕様書に依れば0xE5 MERGEDCELLSというバイナリ情報からとるようだ。このコードに当たる定義部がparse.rbにあるのだが、なんとUNIMPLEMENTEDという配列に入れられている。読んで名の通り、このキーワードは未実装であり読み飛ばしますよ、言うことらしい。うーん。

テストに使ったエクセルのデータは1シート内に結合セルを3つくらい持っているのだが、parse.rbの未実装箇所をスキップする部分にデバッグライトを埋めててみてもMergedCellsを通った形跡が1回しか出てこない。3回出てくると思ったのだが、どういうことなんだろう。

ん? もしかして、エクセルのバイナリでは、ひとつのMERGEDCELLSという情報中に、そのシートが持つ結合セルの情報がまとめて保存されているのか?

MSの資料を見てみる。

MERGECELLS: Merged Cells (E5h)
This record stores all merged cells.
Record Data

Offset Field Name Size Contents
4 cmcs 2 Count of REF structures
6 rgRef var Array of REF structures

やっぱりそうっぽい。セルそれぞれに結合情報があるわけではなくて、シートのほうに結合セルの情報がまとめて入っているらしい。これはたしかに実装するのが面倒そう。

うーん、どうもparse.rbにMerageArea(op, len, work)というメソッドを作ってその中で実装してやれば、対応できそうではあるが、面倒に代わりはないなぁ。メソッドを作ったときに引数に何が渡されるかくらい試してみるか?