[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 メーリングリストの案内