[PHP-users 14450]EXCELが終わらない
K.satoru
satoru_kumagai @ mjs.co.jp
2003年 4月 4日 (金) 14:48:30 JST
サーバー側でEXCELを動的に作成し,クライアントのブラウザに
作成されたファイルを表示させるアプリを作成しています.
簡単に仕組みを書きますと,
1. トップの検索画面で条件を指定し,【出力】ボタンを押す.
2. 処理に時間がかかるためShowModalDialogウィンドウを表示させ
(しばらくお待ちください.),そのウィンドウからEXCEL作成のPHPファイルを
呼出す.
3. comを使用し,SQLの検索結果を元に,動的にEXCELファイルを作成.
(ファイル名は,セッションID.xlsで作成.)この名前をセッション変数へセッ
ト.
4. EXCELの作成が完了し,サーバ側のテンポラリフォルダに保存.
この時点で,EXCELのcomオブジェクトを解放しています.
5. 手順の4が終えた時点で,showModalDialogに処理が終了したことを
知らせるフラグを返し,4で作成されたファイルを表示するためのPHP
ファイルを呼出す.
以上の手順で問題なくブラウザにEXCELが表示されています.
(Excelを表示させているページのURLアドレスの拡張子はphpで,
hogehoge.xlsではありません.)
しかしここで,ブラウザの名前を付けて保存を選択し,ブラウザに
表示されているEXCELを保存しようとすると,「サーバ使用中」という
windowsのメッセージが出て,処理が終了していません.切替え,
再試行のボタンが表示されてしまいます.
MLの過去ログにcom_release()を書き加えれば終了するのでは・・・?
という記事を見つけ,手順4のEXCELを解放させるコードの次に
書き加えてみましたが結果は変わりませんでした.
タスクマネージャーで見てもEXCEL.EXEが起動したままになっています.
EXCELを作成するファイルの記述は以下です.
<?php
#Excelの新規作成
$exapp = new COM("Excel.Application");
$exapp -> DisplayAlerts = False;
$wkb= $exapp -> Workbooks->add();
$sheets = $wkb -> Worksheets(1);
途中省略
$id = session_id() ;
$file_name = "{$id}.xls" ;
$_SESSION['fname'] = $file_name ;
$wkb->SaveAs("E:/temp/{$file_name}");
#Excelの解放
$wkb->Close() ;
$exapp->Quit() ;
unset($exapp) ;
com_release() ;
?>
実際のEXCELを表示させる部分の記述は以下です.
<?php
session_start() ;
header("Content-type: application/vnd.ms-excel");
header("Content-Transfer-Encoding: base64");
header("Content-Disposition: inline;filename={$_SESSION['fname']}");
#Excelファイルのオープン
$fd = fopen("E:/temp/{$_SESSION['fname']}", "rb");
#Excelの標準出力
fpassthru($fd);
#Excelファイルの削除
unlink("E:/temp/{$_SESSION['fname']}");
?>
環境
php 4.4.2
Apache 1.3.26
WindowsNT 4.0 です.
EXCELのプロセスを終了させる方法をご教授いただければと思います.
宜しくお願いします.
PHP-users メーリングリストの案内