5

mod_perl私のWebアプリは、 CGI::Applicationを使用してApacheで実行されます。生成されたファイルのダウンロードを提供したい。以前(CGI :: Appを使用する前mod_perl)、生成されたとおりにcsvファイルをスプールしましたSTDOUT。今、私はもう少し洗練されたものを探しています-Spreadsheet :: WriteExcelを使用してExcelスプレッドシートを作成します-そして、ファイルハンドルからそれを印刷することができないようです。

sub export_list {
  my $self = shift;

  binmode(STDOUT);
  my $str;
  open my $fh, '>', \$str;
  my $workbook = Spreadsheet::WriteExcel->new($fh);
  my $worksheet = $workbook->add_worksheet();

  $worksheet->write_col(0,0, ['some','data','here']);
  warn $str;
  return $str;
}

出力は単なる空白の応答であり、警告も空白です。

スプレッドシートをファイルハンドルに書き込むために使用している方法は、ドキュメントからほとんど直接出ているので、問題は私の側のCGI ::Appnooberyが原因であると思います。ドキュメントで提案されているファイルハンドルの方法も、mod_perlかなり役に立たないことがわかりました。

私はWindowsで実行していることを言及する必要があると思います。現在の回避策は、ファイルを作成してユーザーにそのファイルへのリンクを提供することです。ただし、ディレクトリのクリアとそのタイミング、および生成されたファイルへのアクセスの認証に関しては、さらに問題が発生します。

提案?批判を傷つけますか?

4

3 に答える 3

4

スプレッドシート全体をメモリに作成する代わりに、ファイルに書き出して、終了時にストリーミングする必要があります(CGI :: Application :: Plugin :: Streamを使用するとここで役立ちますが、後でクリーンアップする必要があります、しかし実際には、すべてのWebアプリには、定期的にクリーンアップされる一時ディレクトリが必要です)、または作成時に印刷します(つまり、STDIN代わりにFHを作成しますが、mod_perlでは扱いにくい場合があります)。

そして、完了したらワークブックを閉じることを忘れないでください。

于 2009-08-28T21:41:51.653 に答える
4

いじる必要はありませんSTDOUT; CGI-App は、フードの下で適切に処理する必要があります。データを送信する前に、ファイルハンドルを閉じる必要がある場合もあります。

ただし、Excel データに適切なコンテンツ タイプを設定していないようです。text/html 以外の場合は、手動で設定する必要があります。次のようなことを試してください:

sub export_list {
    my $self = shift;

    my $str;
    open my $fh, '>', \$str or die "Can't open to var: $!";
    my $workbook = Spreadsheet::WriteExcel->new($fh);
    my $worksheet = $workbook->add_worksheet();

    $worksheet->write_col(0,0, ['some','data','here']);

    $workbook->close;
    close $fh;

    warn $str;

    $self->header_add( -type => 'application/vnd.ms-excel' );
    return $str;

}

CGI::Application::Plugin::Streamにも興味があるかもしれません

于 2009-08-28T21:39:48.007 に答える
3

ブックを閉じます。ファイルハンドルも閉じます。

warn "length 1=".length($str);
$workbook->close();
close($fh) or die "error on close: $!";
warn "length 2=".length($str);

length 1=0 at wx.pl line 16.
length 2=5632 at wx.pl line 19.
于 2009-08-28T21:38:39.617 に答える