« へあげんだっつ | トップページ | 御湖鶴 »

2009年6月 2日 (火)

PHP-ExcelReader の日付

Excelを読まなければならなくなりまして。色々手があるのですが、今回は PHP-ExcelReader を利用。
SourceForge.net: PHP-ExcelReader

いきなり動かない。サンプルすら動かない。ひどい
仕方がないのでソースをのぞき込むと、include するファイルパスとパッケージ展開して出来るパスが違う。酷すぎる。
reader.php の31行目

require_once 'Spreadsheet/Excel/Reader/OLERead.php';

require_once 'Excel/oleread.inc';

に。これで問題なく動くのだけど、色々いじってたら日付がおかしい。6/29 を読み込んでも 6/30 だと言う。オイラのプログラムがおかしいかとどんどん遡っていったら、そもそも読み取った文字列が 06/30 だと言う。他の日付も同じで1日ずれる。うーがー、とパッケージの中をのぞき込むと utcValue なるものの計算の辺りが怪しい。
ああ、そういえば Excel は日付をシリアル値で持ってるんだよな。それ自体は普通だけど、何故かモノによって1900年からのものと1904年からのものがあったりする辺りが普通の脳みそとは思えないところなんだけど。
Excel の 1900 年を基準とした日付方式と 1904 年を基準とした日付方式の違いについて

んで、Excelreader と utcValue をキーワードに調べていくと見つけました。
Issue 2 - php-excel-reader - Dates are off - Google Code

結局日付計算にバグがありますと。969行目(かな?)辺りの計算を

$utcValue = round(($utcDays+1) * SPREADSHEET_EXCEL_READER_MSINADAY - 86400);

と 86400 引いてやればちゃんとした日付が得られます。っていうか、SPREADSHEET_EXCEL_READER_MSINADAY って内部的に 86400 なので、だったら最初から1足さなきゃ良さそうなもんだけど。最初のパスの問題も含めてちゃんと最新版を sourceforge に置いておいて欲しい…

そんなこと思ってたら PHP Excel で旧来のExcelも読めるようになっていた。ちょっと前まで Excel2007 しか読めなかったと思ったのに。

$objReader = PHPExcel_IOFactory::createReader('Excel2007');

みたいにすれば Excel2007 形式(.xlsx)が

$objReader = PHPExcel_IOFactory::createReader('Excel5');

とすれば旧来の95以降のExcelを読み込める。ドキュメントは貧弱だけどこの辺見れば何とかなるかと。
オイラの環境でちょっと試したところ日本語も問題なく読める模様。但し ExcelReader と違って自動的に内部Encoding かな?CP932からUTF-8に変換される。
後、パフォーマンスが如実に悪い。ので、旧来のExcelを読み込むだけなら PHP-ExcelReader がいいのではないかな。PHPExcel はインストール環境も色々うるさいし(PHP5.2.5以上 + zip + gd2 + jpeg + mbstring + 多分 png + zlib)
あーめんどくせ。

|

« へあげんだっつ | トップページ | 御湖鶴 »

てっく」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/232324/37750084

この記事へのトラックバック一覧です: PHP-ExcelReader の日付:

« へあげんだっつ | トップページ | 御湖鶴 »