我正在尝试将.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。
答案 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会话完成了这个过程,如下所示:
通过设置自定义Content-Type,您可以向浏览器提示您想要下载提示。