読者です 読者をやめる 読者になる 読者になる

だめグラマーの独り言

40過ぎのおっさんがWeb系プログラム関連のいろいろを多分に私見で綴るブログ

CakePHPでPHPExcelを使った際、データの読込でハマったこと(toArrayメソッドについて)

備忘録的にCakePHPに組み込んだPHPExcelプラグインのtoArrayメソッドの引数について。

どのページを見てもエクセルデータを読み込んだ後、toArrayメソッドで全データを読み込む場合

$data = $obj->setActiveSheetIndex(0)->toArray(null, true, true, true);

とお題目的に書かれているだけで、引数に関する説明がない( ̄▽ ̄;)
いやきっとどこかに日本語で説明されたページはあるんだろうけれど、俺には見つけ出せませんでしたil||li_| ̄|○il||li

なので忘れないように自分的備忘録。

toArrayの第一引数は
Value returned in the array entry if a cell doesn't exist.
直訳すれば、セルが存在しない場合、配列エントリに返される値。

なのでこれはnullのままでOKなはず。
これを「""」(空文字)にしたらどうなるかとかやったことないけれど、受け取った側の変数で""(空文字)になるってことなのかな?(おそらく)

第二引数は
Should formulas be calculated?
直訳すれば、数式を計算すべきか?
つまりそのまま数式として文字列的に読み込むならfalse、数式に計算された結果を読み込むならtrue。
これはその後またエクセルで出力するような二次利用が目的じゃなければ計算された結果を読み込んで利用したいのでtrueが多そう。

問題は第三引数。
Should formatting be applied to cell values?
直訳で、セル値に書式を適用する必要がありますか?
ここは利用方法によって分かれそう。
ネットで探すと、この第三引数をみんなtrueにして全セルに書式が適用されたデータとして扱っていることが多い。

例えば日付データなんかの場合だと、エクセルでは1901年1月1日を起点としてシリアル値と呼ばれるただの経過日数(数値)が入っている。
でもそれをエクセルの書式設定でxxxx年xx月xx日とかxxxx/xx/xxとか人間の目でわかる文字列に自動的に変更されているわけ。
これもそのまま表示するとか保存するとかならtrueのままでいいのだろうけれど、PHP側でそこから何日後とか、データベースに日付書式で保存するとか、二次的な利用を考えるならfalseにしてシリアル値として読み込み、PHP側で所定の書式に書き換えてあげた方が間違いない気がする。
なので、俺はPHPExcelでエクセルファイルを読み込む場合、第三引数はfalseにしている。

余談だけれど、「/」で年月を区切った場合、「-」で区切った場合は、英文だとちょっと意味が違ってくる。年数を4桁で表示するならそれほど問題はないんだろうけれど、今回コーディングしていた環境ではちょっと問題が出た。
trueにして読み込むと、例えばエクセルのあるセルに「2010/10/1」って書いてあった場合、それをPHPExcelを通してPHPにデータの引き渡しをした際、齟齬が出てしまった(´・ω・)
内部的に「/」区切りの年月日は「DD/MM/YY」の英文扱いになってしまい、妙な日付がデータベースに保存されてしまった(;´Д`)
ちなみに「-」区切りの年月日が書かれていた場合は「YY-MM-DD」扱いになり日本語的順序で読み込めた。
ここはそのエクセルファイルを作成した各人の胸先三寸になってしまう部分なので、ソース側ではどちらにしてもシリアル値で受け取り、PHP側で年月日を正しく解析して扱うことにした。
例えば仕様で「エクセルのその年月日入力欄には、必ず【-】区切りで年月日を入力する」みたいに絶対的に定義されているなら「/」の場合は?とか「,」の場合は?なんて考えなくていいんだろうけれどね(;・∀・)

んで、最後は第四引数。
False - Return a simple array of rows and columns indexed by number counting from zero.
True - Return rows and columns indexed by their actual row and column IDs.
これも直訳。
Falseの場合は0から数えてカウントされた行と列の単純な配列を返します。
Trueの場合は実際の行IDと列IDでインデックスを付けた行と列を返します。
これはそのまんま。
Trueにすると後のプログラム側でエクセルの「A1」欄に書かれたデータは、二次元配列の$変数[1]["A"]に入る。
Falseにすると、同じくエクセルの「A1」欄に書かれたデータは、二次元配列の$変数[0][0]に入る。
ここも見解の別れる所なのかもだけれど、俺的には直感的なTrueが楽でした( ´ー`)

ってことで備忘録的なメモでした・・・っとw