• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Spreadsheet::WriteExcelについて教えてください。)

Spreadsheet::WriteExcelについて教えてください。

このQ&Aのポイント
  • Windows2000 IE6.0 Perl5.005_03 Spreadsheet-WriteExcel-0.33 Parse-RecDescent-1.80
  • CGIとして実行すると「サーバーが見つかりません」となってしまいます。エクセルファイルは正常に作成はできているようです。
  • use Spreadsheet::WriteExcel;をコメントにして実行すると移動したいURLに飛ぶことができるのですが、当然ながらEXCELファイルは作成されません。どのようにしたらよいのでしょうか・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • nipotan
  • ベストアンサー率59% (134/227)
回答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/Spreadsheet-WriteExcel-0.39/
taganyan
質問者

補足

早速の回答有難うございます。 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を表示させたいのですが、何かよい方法ございませんでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • nipotan
  • ベストアンサー率59% (134/227)
回答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」を表示し始めます。 この方法で、「処理待ち」→「処理完了」のページ遷移が出来上がります。

taganyan
質問者

お礼

有難うございました。 完璧に私のほしい回答でした! 本当に助かりました。 一度締め切らずに質問して大変申し訳ありませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Spreadsheet::ParseExcel+正規表現?

    Excelファイルを読み込んで、A列をずら~っと上から連続して表示するプログラムを作ったのですが(下記)、句読点の"。"が入ったセルで改行したいです。しかし、うまくいきません。文字コードが原因なのかな・・・と思ってはいるのですが・・・調べても調べてもわかりません。どうか、未熟者にアドバイスお願いします。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ #! /usr/bin/perl # モジュールの読み込み use strict; use utf8; use Spreadsheet::ParseExcel; use Spreadsheet::ParseExcel::FmtJapan; # ? binmode STDOUT, ":utf8"; # Excelファイルの処理 my $format = new Spreadsheet::ParseExcel::FmtJapan; my $excel = new Spreadsheet::ParseExcel; my $book = $excel->Parse("xlsファイルの場所"); my $sheet = $book->{"Worksheet"}[0]; my $MaxRow = $sheet->{"MaxRow"}; my $MaxCol = $sheet->{"MaxCol"}; for(my $col=0, my $row=0; $row<=$MaxRow; $row++){ my $cell = $sheet->{"Cells"}[$row][$col]; my $val = ""; if($cell){ $val = $cell->Value; } print "$val"; if($cell=~"。"){ print "\n\n"; } } print "\n";

    • ベストアンサー
    • Perl
  • PHP Spreadsheet Excel Writer

    PHP 「Spreadsheet Excel Writer」について 「Spreadsheet Excel Writer」を使ってエクセルファイルを出力したいのですが。 セルに「SUMIF関数」を入力すると、出力されたエクセルには「Syntax error: ,, lookahead: , current char: 12」と 入力されておりこの関数が使えなくて困っています。 手順の詳細は下記です。 $workbook = new Spreadsheet_Excel_Writer("./test.xls"); $worksheet =& $workbook->addWorksheet('week report'); $worksheet->write(0,0,"初月課金"); $worksheet->write(1,0,"初月無料"); $worksheet->write(2,0,"初月無料"); $worksheet->write(3,0,"初月無料"); $worksheet->write(4,0,"初月無料"); $worksheet->write(0,1,100); $worksheet->write(1,1,100); $worksheet->write(2,1,100); $worksheet->write(3,1,100); $worksheet->write(4,1,100); $worksheet->writeFormula(10, 0,"=SUMIF(A1:A5,\"=初月課金\",B1:B5)"); $workbook->close(); どうやったら正常に関数が入力できるか、どなたか教えてください。 宜しくお願いします

    • 締切済み
    • PHP
  • 【Spreadsheet_Excel_Writer】の【repeatRows】について

    Spreadsheet_Excel_Writerを使ってクライアントにデータをエクセルファイルで ダウンロードさせたいと思っているのですが【repeatRows】の設置が思うようにできません。 以下のようにするときちんと繰り返し印刷されるのですが出来上がったファイルが サーバー側に保存されてしまいます。 *********************************************************** require_once 'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer('test.xls'); $worksheet =& $workbook->addWorkSheet(); $worksheet->write(0,0,"ヘッダ"); $worksheet->repeatRows(0); *********************************************************** 以下のようにすると繰り返し印刷されないのですがクライアント側にダウンロードされます。 *********************************************************** require_once 'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer(); $worksheet =& $workbook->addWorkSheet();  $workbook->send('test.xls'); $worksheet->write(0,0,"ヘッダ"); $worksheet->repeatRows(0); *********************************************************** 検索で調べましたがわかりませんでした。 【repeatRows】が設定され、クライアント側にダウンロードされるにはどこを修正すればよろしいでしょうか? PHPのバージョンは 4.3.8 です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • utf8フラグ落してもwide character

    毎度ご迷惑をおかけしております http://idsc.nih.go.jp/idwr/CDROM/Kako/H18/Syuukei/Syu_08_1.xls というExcelファイルの全sheetを.csvに吐き出そうと思い、OKwaveでコードを教えてもらいました しかし Wide character in printという警告が出て文字化けしました。 そこでまたOKwaveで聞いたところ、 http://www.rwds.net/kuroita/program/Perl_unicode.html#widechar というURLを教えてもらいました。 これに従って(?)、理屈はわからないながら utf8フラグが立っていたら落とすというような コードにしてみましたが、やはり文字化けします。 全く原理ができておらず、誠にお恥ずかしい限りですが、 どのようなコードを書けばよいか、ご指導よろしくお願い申し上げます。 以下、だめだったコードです(改悪は私です)。 ######################################################################### use Spreadsheet::ParseExcel; #use Encode qw/ encode decode/; use Encode; my $sFN = "Syu_08_1.xls"; my $filename = $sFN; print "filename: $filename\n"; my $parser = Spreadsheet::ParseExcel->new(); my $workbook = $parser->parse( $filename ); if ( !defined $workbook ) { die "Parsing error: ", $parser->error(), ".\n"; } my $sRT = ''; ## シートの数だけ繰り返し for my $worksheet ( $workbook->worksheets() ) { print OUT "*"; my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); foreach my $nLineY ( $row_min .. $row_max ) { my $rec = ""; foreach my $nLineX ( $col_min .. $col_max ) { my $cDT = $worksheet->get_cell($nLineY,$nLineX); ## セルにデータが在ったときの処理 if ( $cDT ) { $sTMP = $cDT->value(); $sTMP =~ s/,//g; if ( utf8::is_utf8($sTMP) ){ # utf8フラグがたっていたら print "utf flag on: $sTMP\n"; utf8::encode($sTMP);  # utf8フラグを落とす } $rec .= "$sTMP,"; } } print "$rec\n"; } }

    • ベストアンサー
    • Perl
  • PHPからExcel出力について

    現在、プログラム(PHP)でデータ出力の機能を作成しているのですが、Excel出力で (1)ブックが開く (2)データを表示 (3)保存 以上の一連の動作はできるのですが、ブックを開いた際にExcel上に「ファイルへのダメージが深刻であり修復は不可能です。数式と値の回復を試みましたが、消失または破損したデータが含まれる可能性があります」といったエラーが表示されてしまいます。 コード変換もしているし、spreadsheet_excel_writerのパッチも当てましたが改善されません。 まだプログラミングが不慣れなもので、解決策が見当たらずに困っています。 どなたかご教授頂けますと助かります。よろしくお願いいたします。 ※申し訳ありません、データを添付していませんでしたので再投稿させていただきました。 ============================================================== //-----------ココから上はデータを取得する関数でデータを取得しています----------- $workbook = new Spreadsheet_Excel_Writer(); $workbook->setVersion(8); $workbook->setVersion(0x0500); $tablename = "sampletable"; $worksheet =& $workbook->addWorksheet($tablename); $worksheet->setInputEncoding("sjis"); $format =& $workbook->addFormat(); $format->_font_name = mb_convert_encoding("MS UI Gothic", "shift_jis"); $format->setBold(); $format->setFgColor(31); //Excelでいうところの見出し部分 $worksheet->write(0,0,"○○"); $worksheet->write(0,1,"○○"); $worksheet->write(0,2,"○○"); $worksheet->write(0,3,"○○"); $worksheet->write(0,4,"○○"); $worksheet->write(0,5,"○○"); $worksheet->write(0,6,"○○"); $worksheet->write(0,7,"○○"); $worksheet->write(0,8,"○○"); //-------ココから下はforeachでデータを表示($worksheet->write)させています-------

    • ベストアンサー
    • PHP
  • Spreadsheet::ParseExcelの空の行の値

    Spreadsheet::ParseExcelを使っていてよくわからないところがあったので、ご教授お願いします。 Excelの空のセルを正規表現でマッチさせるにはどうすれば良いのでしょうか? ***************************** use strict; use utf8; my cell = $sheet->{"Cells"}[$row][$col]; my val = ""; if($cell){ $val = $cell->Value; } if($val =~ "???"){ print "空のセルです"; }

    • ベストアンサー
    • Perl
  • Spreadsheet::ParseExcelを使ってみたいのですが・・・

    CPANのモジュールよりエクセルからデータを読み込むものがあったので、ぜひつかってみたかったのですが、使い方がよくわかりません。 いろいろ調べまして、とりあえず、下記のようなできあがったサンプルを実行してみたのですが、 ------------------------------------------------------------------ use strict; use Spreadsheet::ParseExcel; my $oExcel = new Spreadsheet::ParseExcel; #1.1 Normal Excel97 my $oBook = $oExcel->Parse('Excel/Test97.xls'); my($iR, $iC, $oWkS, $oWkC); print "FILE :", $oBook->{File} , "\n"; print "COUNT :", $oBook->{SheetCount} , "\n"; print "AUTHOR:", $oBook->{Author} , "\n"; for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) { $oWkS = $oBook->{Worksheet}[$iSheet]; print "--------- SHEET:", $oWkS->{Name}, "\n";S for(my $iR = $oWkS->{MinRow} ; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) { for(my $iC = $oWkS->{MinCol} ; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) { $oWkC = $oWkS->{Cells}[$iR][$iC]; print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC); } } } ------------------------------------------------------------------ 下記のエラーがでてしまいます。 Can't locate Spreadsheet/ParseExcel.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at excel.txt line 2. BEGIN failed--compilation aborted at excel.txt line 2. 現状はC:\Perl\cpan\build\Spreadsheet-ParseExcel-0.30 というディレクトリにモジュールのフォルダがインストールされるところまではできたのですが、後何が必要なのか、もしくはどこがおかしいのか、見当もつきません。 どなたか教えていただけますでしょうか。 ちなみにwindowsで動かしており、active perlをインストールして、 コマンドプロンプトでやっています。

  • エクセルへの書き出し

    サンプル本を片手に作業しています。 PHPでexcelデータを作る場合、以下のようなソースがあります。 <? //依存モジュールの読み込み require_once 'Spreadsheet/Excel/Writer.php'; //エクセルシートのオブジェクトを作成 $workbook = new Spreadsheet_Excel_Writer(); //test02.xlsとしてダウンロードを開始するようHTTPヘッダーを送信 $workbook -> send('test02.xls'); //1枚目のワークシートを作成 $worksheet1 =& $workbook -> addWorksheet('社員名簿'); //データを書き出し $worksheet1 -> write(0,0,'名前'); $worksheet1 -> write(0,1,'年齢'); $worksheet1 -> write(0,2,'出身地'); $worksheet1 -> write(1,0,'鈴木太郎'); $worksheet1 -> write(1,1,'32'); $worksheet1 -> write(1,2,'北海道'); $worksheet1 -> write(2,0,'青山辰夫'); $worksheet1 -> write(2,1,'24'); $worksheet1 -> write(2,2,'青森'); //Excelシートの送信 $workbook -> close(); ?> この場合、Excelは指定した名前で生成されるのでしょうか、 それとも、あらかじめ作成したExcelへ書き込みするのでしょうか?

    • ベストアンサー
    • PHP
  • excel mobile ファイル作成?

    いつもお世話になっております。 モバイル携帯で、「Excel Mobile」を使いたいのでgoogleで検索で 下記サンプルを実行しました。 結果、モバイル携帯上ではexcelファイルが一覧表示されましたが、 開くと「ファイル形式が正しくないため、・・・」となってしまい、 ダメでした。 何方か、「Excel Mobile」形式での作成方法をご存知でしたら、ご教授頂けるとありがたいです。 ---------サンプル------------------------- <?php require_once'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer(); $tablename = "sampletable"; $worksheet =& $workbook->addWorksheet($tablename); $format =& $workbook->addFormat(); $format->_font_name = mb_convert_encoding("MS UI Gothic", "shift_jis"); for($i=0;$i<100;$i++){ for($j=0;$j<100;$j++){ $worksheet->write($i,$j,"test"); // セルに書き込み } } $workbook->send("test.xls"); // test.xlsに書き込み。 $workbook->close(); ?> -------------------------------------------------------- 以上、よろしくお願いいたします。

    • 締切済み
    • PHP
  • 複数のExcelファイルを生成

    いつもお世話になっています。 <環境> Red Hat Enterprise Linux ES v.4 PHP 4.4.2(cli) PHPからExcelファイルを操作するのに エラーが起こってしまっています。 test.php ---------------------------------------- // 新規ワークブックを生成 $WorkBook1 = new Spreadsheet_Excel_Writer('test1.xls'); // 新規ワークシートを生成 $WorkSheet2 =& $WorkBook1->addWorksheet('sheet1'); // 一回閉じる $WorkBook1->close(); // 新規ワークブックを生成 $WorkBook2 = new Spreadsheet_Excel_Writer('test2.xls'); // 新規ワークシートを生成 $WorkSheet2 =& $WorkBook2->addWorksheet('sheet2'); // 閉じる $WorkBook2->close(); としているのですが・・・ Fatal error: Call to undefined function: close() in /usr/local/lib/php/Spreadsheet/Excel/Writer/Workbook.php on line 407 上記のようにライブラリでエラーになってしまいます。 複数のExcelファイルをtest.phpで作成することはできないのでしょうか? すみませんが、ご教授お願いいたします。

    • 締切済み
    • PHP