
Windows2000
IE6.0
Perl5.005_03
Spreadsheet-WriteExcel-0.33
Parse-RecDescent-1.80
質問ですが、CGIとして実行すると「サーバーが見つかりません」
になってしまいます。エクセルファイルは正常に作成はできているようです。
use Spreadsheet::WriteExcel;をコメントにして実行すると移動したいURLに
飛ぶことができるのですが、当然ながらEXCELファイルは作成されません。
どのようにしたらよいのでしょうか・・・
print "Location: 移動したいURL\n\n";
print '<html><body>';
print '<br><br>';
print'<table align = "center">';
print'<tr>';
print'<td><font size = 5 ; color = blue>';
print"EXCEL書き出し";
print'</font></td>';
print'</tr>';
print'</table>';
print '</body></html>';
use Spreadsheet::WriteExcel;
my $workbook = Spreadsheet::WriteExcel->new("perl.xls");
$worksheet = $workbook->addworksheet();
$format = $workbook->addformat();
$format->set_bold();
$format->set_color('red');
$format->set_align('center');
$col = 0;
$row = 0;
$worksheet->write($row, $col, "Hi Excel!");
$worksheet->write(1, $col, "Hi Excel!", $format);
$worksheet->write(2, $col, 1.2345);
$worksheet->write(3, $col, '=SIN(PI()/4)');
print 'Content-type: text/html' ."\n\n";
print <<EOF;
<html><head><title>test</title></head><body>Ah!</body></head></html>
No.1ベストアンサー
- 回答日時:
んー。
手元で確認した限りは、問題なく動作しますね。問題点を考えると、Spreadsheet::WriteExcel から、何らかの原因でエラーが Location ヘッダが出力される前にダンプ (標準エラー出力で) されていているのかも知れません。
ちなみに、use は上に書こうが下に書こうが、コードの実行前に対象モジュールを先に実行してオブジェクトを作ります。なのでどんなに先に Location ヘッダを出していても、エラーのダンプはトラップできません。
まずは原因の解明の為に、プログラムの先頭部分に
use CGI::Carp 'fatalsToBrowser';
を書いてエラー時のプラグマを宣言し、エラーをトラップしてみてください。そうすれば、エラーメッセージが出ていたらトラップできます。
CGI::Carp を使うのが野暮ったければ、Location ヘッダを出した後に use するように、
use Spreadsheet::WriteExcel;
の部分を、
eval q/use Spreadsheet::WriteExcel;/;
とし、use させたいステップに意図的に遅延させた上で SpreadSheet::WriteExcel を実行させるってのも手です。
その場合は、全ての出力のバッファを避けるために
$| = 1;
を明示的に書いてください (エラー出力する前に Location を出力させるため)
ちなみに、Location でフォーカスが移った後、httpd から STDOUT が開放されないので、ずっと (処理が全部終わるまで) 読み込みになってしまうかもしれません。特に出力させる Excel ファイルが膨大なほどこの問題は発生します。fork() システムコールを実装している処理系であったら、fork() させた小プロセスで Excel ファイルを生成させ、親プロセスでは close STDOUT; すれば、ブラウザは開放されます。一般的に重い処理が続く場合にそういう方法を使います。その際に wait するのを忘れると小プロセスは zombie になってしまうので注意が必要ですが。
あと指摘すべきは、Spreadsheet::WriteExcel のバージョンが古いですね。最新は 0.39 なので、今起きている問題はもしかしたら「既知のバグ」として fix されているかもしれません。
Microsoft の nmake ユーティリティで最新版をソースからインストールされたほうがいいと思います。
(と書きながら今自分の手元の version が 0.37 だという事に気付き慌てて入れなおしました。。。)
参考URL:http://search.cpan.org/author/JMCNAMARA/Spreadsh …
この回答への補足
早速の回答有難うございます。
eval q/use Spreadsheet::WriteExcel;/; に変えて実行したらできました。
ところで、
print "Location: 移動したいURL\n\n";
print '<html><body>';
print '<br><br>';
print '<table align = "center">';
print '<tr>';
print '<td><font size = 5 ; color = blue>';
print "EXCEL書き出し";
print '</font></td>';
print '</tr>';
print '</table>';
print '</body></html>';
これの"Location: 移動したいURL\n\n"; 部分を
'<meta http-equiv="Refresh" content="0;移動したいURL>';
に変えて上記のHTMLを表示させたいのですが、何かよい方法ございませんでしょうか?
No.2
- 回答日時:
解決したなら出来れば別質問にして欲しかったのですが (ボソボソ...
> ところで、
> print "Location: 移動したいURL\n\n";
> print '<html><body>';
> print '<br><br>';
> print '<table align = "center">';
> print '<tr>';
> print '<td><font size = 5 ; color = blue>';
> print "EXCEL書き出し";
> print '</font></td>';
> print '</tr>';
> print '</table>';
> print '</body></html>';
> これの"Location: 移動したいURL\n\n"; 部分を
> '<meta http-equiv="Refresh" content="0;移動したいURL>';
> に変えて上記のHTMLを表示させたいのですが、何かよい方法ございませんでしょうか?
要するに、現状であれば処理が完結する前に、Location で指定したページに行ってしまっていて、要求としては、Location で飛ばさないで、処理中は「EXCEL 書き出し」と画面に表示し、書き出しが終了し次第、別の URL を表示させたい…って事ですよね?
(違ってたり、完全に的外れならごめんなさい)
一般的には…
a. "EXCEL 書き出し" を表示し、Refresh ヘッダ (あるいは <meta http-equiv="Refresh" ... ) を出力するだけのページを出力する CGI ("リダイレクト CGI" とする)
b. Spreadsheet::WriteExcel を用いて Excel ドキュメントを生成し、生成が終わったらしかるべき HTML を表示する CGI ("Excel CGI" とする)
の二つを作ります。そして…
1. まずリダイレクト CGI で必要なデータを受け取ったり受け取らなかったりして、Refresh ヘッダで Excel CGI を呼び出します。この時、データを受け渡したいなら、QUERY_STRING や PATH_INFO あるいは、セッション ID を格納した Cookie 等を利用してデータをブラウザに渡します。
例えば
print 'Refresh: 0; url="excel.cgi?session_id=1234567890"'."\n\n";
print '<html><body>';
みたいにするとか。。。(ここで 1234567890 って名前のテンポラリファイルを出力して、Excel CGI で読み取るって方法が考えられます。リダイレクト後の URL 枠に QUERY_STRING が入るので、それを含めたくなければ Set-Cookie ヘッダを出して Cookie を Excel CGI が受け取るとか)
2. リダイレクト CGI から呼び出された Excel CGI では、データを受け取るなりの処理を行うことで、リダイレクト CGI を呼び出したデータを特定できるので、上記のいずれかの方法でデータを受け取り、処理を行います。
これで、1. からリダイレクトされた Excel CGI は、処理に時間がかかるために、「しかるべき HTML」を出力するまでの時間がかかります。これによって、ブラウザは「必要な応答が無いので、応答があるまで待つ」状態に入ります。その間は「EXCEL書き出し」とだけ、画面に表示されます。2. で Excel ファイルの生成が完了し次第、HTML が出力されるので、ブラウザは応答反応を受け取り、すぐさま「しかるべき HTML」を表示し始めます。
この方法で、「処理待ち」→「処理完了」のページ遷移が出来上がります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- その他(コンピューター・テクノロジー) Pythonの np.indicesに関する質問です。 2 2023/02/07 08:19
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・昔のあなたへのアドバイス
- ・字面がカッコいい英単語
- ・許せない心理テスト
- ・歩いた自慢大会
- ・「I love you」 をかっこよく翻訳してみてください
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・はじめての旅行はどこに行きましたか?
- ・準・究極の選択
- ・この人頭いいなと思ったエピソード
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
掲示板(kentさんの所のsunbbs...
-
CGIでテキストボックスの内容に...
-
選択式アンケート項目合計点で...
-
掲示板 imgboard のcgi改造方法
-
ブラウザによってFlashが表示さ...
-
プログラム実行中の待機ページ...
-
cgi(perl) sendmailの使い方
-
SUN BBSの改造方法
-
ラジオボタンが両方とも選択で...
-
容量がある程度大きくて、type-...
-
wordの数式について 定積分を書...
-
VB初心者。小数点以下の表示で...
-
フォームの入力内容の後ろに文...
-
VB.net データーグリッドビュー...
-
Windows7でVBScriptによるネッ...
-
チェックボックスの余白を指定...
-
日付取得のJavascriptの動作不...
-
FORMのselectの選択肢を最初か...
-
プルダウンで・・・???
-
ローカルテストサーバーと本番...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
掲示板(kentさんの所のsunbbs...
-
FlashQ&A(サンプル作品集)の...
-
CGIでCSVとしてデータ保存→検索...
-
クオートの多重入れ子をするには?
-
CGI経由でのPDFファイルをダウ...
-
metaタグについて
-
perl/cgi リダイレクトができない
-
htmlからパラメータで、cgiに渡...
-
選択式アンケート項目合計点で...
-
Spreadsheet::WriteExcelについ...
-
sendmailについて
-
ヒアドキュメントでHTMLを書い...
-
フォームメール(iモード用)で...
-
sendmailからblatjへ
-
フォルダー内を表示させるcgi
-
CGIでテキストボックスの内容に...
-
POST送信
-
DBの更新について困っています
-
プログラム実行中の待機ページ...
-
CGIファイル に JavaScript
おすすめ情報