著作一覧 |
POIは0から始まる。これはJavaの配列のインデックスとも一致している。
しかし、VBAの配列のインデックスは本当は1から始めるのが文法を作った人の意図のはず。だからExcelを初めとしたOffice系のオートメーションではインデクサの引数は1から始まるのではないだろうか。
というかExcelそのもののロウが1から始まってるからかも。0じゃないよ。表計算ソフトの行表示としても1と書いてあるのは多分、正しい(しょせん多分に過ぎないけど。しかし自然数を採用するのは自然ではあると思う)。
だからVBAでの(というかCOMで表されているExcelのAPIとしての)Cells(1,1)というのは、POIのRow=0、Cell=0になるのだが、これってどうなのかな。少なくてもRange("A1")というのは判りやすいし、そこからCells(1, 1)もわかりにくくは無いような気もする。とすればPOIがわかりにくいということだ。でも、最初から0として試し始めていたから直観的なのかも知れないけど、わからん。
同じJavaのAPIでもJDBCは1から始めてる。これはとってもイヤで、getString(0)とか書いて実行時に例外を食らったことが無いわけでは無い。とは言え、SQLの発想としては正しいのかな、と思うし、(実はADOは知っているけどODBCは知らないし、今更調べても役に立たないから調べないけど)多分ODBCも1から始めてるんじゃなかろうか。
っていうか調べてしまった。
ColumnNumber
[Input]
Number of the column for which to return data. Result set columns are numbered in increasing column order starting at 1. The bookmark column is column number 0; this can be specified only if bookmarks are enabled.
——SQLGetDataのAPIリファレンスから引用
そうかカラム番号なのか。なら、1から始まるのはExcelのセルと同じで(多分)正しい発想だろう。
このあたりがPOIの注意点かな。Excelのオブジェクトモデルとは全然異なるということで。
ジェズイットを見習え |
0始まりは先頭からのオフセットを数えていて,1始まりは実体の数を数えているということで,値型と参照型の話に結びつけるのはちょっと苦しいでしょうか...
なるほど。オフセットでみるか要素をたどるかで区別するのはありかも。前者が参照で後者が値というのは直感的(観じゃないかも)な気がします。