追記2010-06-28:
茶漬けブログのPHPのExcelモジュールは64ビットで動かないので下記を使いましょう。
PHPでEXCELを書き換える方法 - ブックマクロ開発に
http://d.hatena.ne.jp/takuya_1st/20100628/1277746610Excelがテンプレートになります。
Excelファイルをテンプレートとして使って、Excelに値を埋め込んで出力することがとても簡単に行えます。
EXCELをテンプレートにする。
茶漬けブログにアクセスしてパッケージをもらう。
http://chazuke.com/forum/index.php
茶漬けブログ・フォーラム
- フォーラムが表示されない時がある。
- ユーザー登録が必須
- フリーメールアドレスは登録に使えない。
フォーラムが表示されない。プロバイダがIPブロックされている。*1
ユーザー登録が必須である。そしてフリーメールアドレスは登録に使えない。Gmailも使い捨てメールもアウトだった。なにこれ。紆余曲折があったがなんとか登録できた。
使い方サンプル
<?php require_once('reviser_lite.php'); //インスタンス化 $reviser= new Excel_Reviser(); //fix 文字コード $reviser->setInternalCharset('utf8');#ソースコードの文字コード // 空白セルに文字列を追加する。 $reviser->addString(0,2,4, '私は'); $reviser->addString(0,2,5, 'Linuxサーバーが'); $reviser->addString(0,3,0, '大好きなエンジニアです。'); $reviser->addString(0,10,4, 'hello'); $reviser->addString(0,10,5, 'world'); $reviser->addString(0,11,4, 'こんにちは'); $reviser->addString(0,11,5, '世界'); $reviser->addString(0,12,4, 'おはよう'); $reviser->addString(0,12,5, 'せかい'); // 入力出力ファイル名の設定 $srcfile= 'template.xls'; $dstfile= "template_out.xls"; $reviser->reviseFile($srcfile,$dstfile,"./");#"./"指定必須、NULLだと標準出力に出てきます。 echo "END"; ?>
主な使い方。
EXCELファイルに値を書き込んで出力します。
EXCELを読み込んで、値を書き込んで出力する。よくあるテンプレート文字埋め込みです。EXCEL−VBAの習慣が抜けない可哀想な社内SE/社内システム受託開発に大受けです。
個人的感想を言えば、EXCELに値を書き出している時点で変じゃないかな。それWEBプログラム(PHP)じゃないよね。うん。
インスタンス化
<?php //EXCELの読み書きパッケージ読み込み require_once('reviser_lite.php'); //EXCELの読み書きパッケージをインスタンス化 $reviser= new Excel_Reviser(); //ソースコードの文字コードを設定 $reviser->setInternalCharset(mb_detect_encoding('あ'));
セルに文字列を追加
/** * addString( シート,行,カラム ) * シートも、カラムもゼロから数えます。 */ $reviser->addString(0,11,4, 'こんにちは'); $reviser->addString(0,11,5, '世界'); foreach( range(0,10) as $i ){ $reviser->addString(0, $i, $i, "$i-Debian"); }
使用上の注意。
使ってみた感想。
X86_64だと動きません。プログラム内部でビット演算を多用しててIntの桁あふれをさせてる箇所が幾つかある。
だけど、これが邪魔。32ビットなら桁あふれるが64だとあふれないので計算結果が変わってしまいエラーになる。
正直言ってつかえない。64ビットが原因だと気づくのに8時間かかった。しばらくこのライブラリは使いたくない。うち64ビット環境なの。32ビットだと問題なく動作してる。
フォーラムにも64ビット非対応の会話記録がありました。
64bitOSと32bitOSがあって32bitだけ動く場合がある。
>>
“offset: 4294967294” この表示からして使用しているOSは64ビット系システムですね。
64ビット系への考慮不足で、ソースのいくつかの部分に32ビット系システム依存部分が有りました。
申し訳ありませんがすぐには対処できませんので次回リリースまでには、恒久対策を考えてみます。しばらく時間を下さい。
貴重な情報有難うございました
手元に64ビット系システムが無いため確認はできておりませんが、お急ぎの場合は下記修正を試してみていただけないでしょうか。
463行目 修正前 while ($sStartBlk != -2) { 修正後 while ($sStartBlk != (int)0xFFFFFFFE) { 480行目 修正前 while ($block != -2) { 修正後 while ($block != (int)0xFFFFFFFE) { 505行目 修正前 while ($rootBlock != -2) { 修正後 while ($rootBlock != (int)0xFFFFFFFE) { 513行目 修正前 while ($block != -2) { 修正後 while ($block != (int)0xFFFFFFFE) { 526行目 修正前 while ($block != -2) { 修正後 while ($block != (int)0xFFFFFFFE) {
とのこと32ビットだと動くよ。でも64だと動かない。将来的なことを考えても使わない方がまし。エラーにならず結果が出ないという微妙な感じなのでマスマス迷宮にはまりこむよ。
http://chazuke.com/forum/viewtopic.php?f=3&t=37
*1:大学のIPでアクセスした。複数プロバイダをつかって固定IPも複数あるが、全滅だった。