それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PHPでEXCELを書き換える方法。(ボツ)

追記2010-06-28:

茶漬けブログのPHPのExcelモジュールは64ビットで動かないので下記を使いましょう。

PHPでEXCELを書き換える方法 - ブックマクロ開発に

Excelがテンプレートになります。

Excelファイルをテンプレートとして使って、Excelに値を埋め込んで出力することがとても簡単に行えます。

http://d.hatena.ne.jp/takuya_1st/20100628/1277746610

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も複数あるが、全滅だった。