Excel :: Writer :: XLSX不发送附件

时间:2014-01-24 20:54:45

标签: perl xlsx

我正在尝试将.xlsx表格作为附件发送到浏览器,使用cpan cgi.pl上的示例或以下问题:How do I avoid encoding problems with Excel::Writer::XLSX in a CGI environment?

sub generateMasterList {
    my $command   = $];
    my $workbook  = '';
    my $worksheet = '';
    my $data      = shift;
    my $cgi       = shift;
    my $error     = '';
    my $filename  = "MasterList.xlsx";


    #print "Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n";
    #print "Content-Disposition: attachment; filename=$filename\n";
    print $cgi->header(-type=>"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", -attachment=>'$filename', -expires=>'-1d');
    binmode STDOUT;
    eval {


        $workbook  = Excel::Writer::XLSX->new(\*STDOUT);
        $worksheet = $workbook->add_worksheet();
    };
    if ($!) {
        $error = "Error Error Error: $!\n";
        return $error;
    }
    else {
        foreach my $i ( 0 .. $#$data ) {
            foreach my $j ( 0 .. $#{ $data->[$i] } ) {

                #print "\n $data->[$i][$j]\n";
                $worksheet->write( $i, $j, $data->[$i][$j] );
            }
        }
        return { success => 1 };
    }

}

调用post方法的firebug控制台响应显示了以下几行中的一堆字符:

PK�����e8Da]I:O��������[Content_Types].xml���n�0E����*1tQU�E���\{B,������P[Q��M�d��sǎ<-�- �
��'2�:맥x�<�w"CR�(<�b(Fë�d3n�X��(�K���Fa"x�T!5��5MeTz�� oz�[��'�S�!��G���Q����   ��a-lY�P1:�q].��E�7��;;
�6�5��Kh+6}��3���*ыjX%M��"J��]��Ue5�Ǽ��@L�Y�e>��!����=j�O$.�DZ9�GŘ@��q�������6��9�i����ök�(�O�wb��r��?���y��7J|
\��{os��>~PK�����e8D�j%H��&�����xl/workbook.xml�Q�N�0����ij#Z5��KTB�Di�&�4V;���=�T)p�3

在同一回复中,我之前的信息是一个包含我的电子表格数据的大量数组。

任何人都使用这个模块足以知道为什么我没有收到关于附件的提示?所有角色代表什么?这是以某种方式编码的数据吗?我正在使用Firefox 12。

2 个答案:

答案 0 :(得分:4)

XLSX文件基本上是一个zip存档,其中包含一堆文件夹和XML文件。您所看到的是该ZIP存档的二进制表示。

您注释掉的代码应该可以将文件发送到浏览器,但您需要使用两个换行符关闭HTTP标头:

print "Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n";
print "Content-Disposition: attachment; filename=$filename\n";
print "\n";

当你在没有第二个\n的情况下尝试这个时,我猜不会有很多输出。

您使用$cgi->header行是明智之举,但由于您使用单引号($filename),因此提供文字文件名'。这些中没有可变插值。如果它只是你想要的变量,则根本不需要任何引号。

print $cgi->header(-type=>"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", -attachment=>$filename, -expires=>'-1d');

我现在无法测试,但这两个中的一个可能会解决问题。如果没有,我建议您使用Live HTTP Headers之类的内容来查看您要发送的标头。可能有更多错误。

答案 1 :(得分:2)

我在上面的代码中看不到任何可能导致其失败的吸烟枪,但在您与Excel::Writer::XLSX mailing group的类似问题中,您提到使用Dojo javascript库触发下载(使用Ajax / POST)我想)。

我尝试通过使用jQuery Ajax函数进行POST来启动二进制下载时遇到了类似的问题,因此值得检查您的Dojo代码,并在必要时使用其中一种解决方法通过XHR / Ajax启动下载。
我过去使用两步Ajax会话完成了这个过程,如下所示:

  1. 浏览器请求(通过Ajax / XHR)在服务器上构建Excel文件,像往常一样通过GET / POST发送所需的任何参数。
  2. 服务器以Json / XML响应,指示成功/失败,并在其响应中包含可下载新二进制文件的URL。
  3. 客户端代码创建隐藏(或视图外)iframe,将其来源设置为步骤2中指示的URL。
  4. 通过设置自定义Content-Type,您可以向浏览器提示您想要下载提示。