我有一个PHP文件,它使用http://pear.php.net/package/Spreadsheet_Excel_Writer/
中的模块生成xls文件我可以很好地创建示例文档,当我打开它时,它看起来很好。
我的下一步是把它变成可下载的链接。为此,我这样做了:
$mimeType = "application/vnd.ms-excel";
$file_name = "test.xls";
$file_path = "/tmp/".$file_name;
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Type: application/' . $mimeType);
header('Content-Length: '.$size);
header("Content-Disposition: attachment;filename=$file_name ");
header("Content-Transfer-Encoding: binary ");
// open the file in binary read-only mode
// display the error messages if the file can´t be opened
$file = & fopen($file_path, 'rb');
if ($file) {
// stream the file and exit the script when complete
fpassthru($file);
exit;
} else {
echo $err;
}
但是当我下载文件时,它在Excel和OpenOffice中都包含大量垃圾数据。差异说,然后/ tmp文件夹中的二进制文件和下载的文件彼此不同。我猜它与标题或fpassthru有关,但我没有太多运气调试问题。
关于问题是什么的任何想法?
答案 0 :(得分:0)
多个Content-Type标头是不必要的。你基本上是说这个文件是一个松饼,披萨和福特金牛座同时。您需要的只是application/octet-stream
版本,除非您想要提供确切的mime类型。
同样,您是否有任何理由将fopen()
返回的文件句柄转换为引用?
尝试更简单的方法:
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment;filename=$file_name");
readfile("/tmp/test.xls");
exit();
?>
并查看是否有更好的效果。
答案 1 :(得分:0)
确保在发送实际文件内容之前不向浏览器发送任何内容。
可能只是某些php'错误'或者甚至'注意'Spreadsheet_Excel_Writer正在制作而你甚至都看不到。或者它可能是一个结束'?&gt;'标记后面跟着简单空格或换行符。
我遇到了类似的错误,其中在Web文件夹中生成的文件正在运行。但是使用标题('...')的传递给了我损坏的文件。这是由于在关闭'?&gt;'之后一个php文件末尾有一个空格标签
答案 2 :(得分:0)
我正在使用相同的库,我刚刚发现库中的文件正在创建空格。
解决方案:在以下文件中删除文件末尾的空格,或删除末尾的?>
结束标记。
要编辑的文件(Spreadsheet_Excel_Writer package
中的所有文件):
Writer.php
Workbook.php
Worksheet.php
PPS.php
Parser.php
OLE.php
Parser.php
File.php
BIFFWriter.php
Validator.php
Root.php
答案 3 :(得分:0)
在生成excel文件的页面顶部添加以下代码
<强> ob_clean(); 强>
这将清除所有乱码数据。还要检查任何echo语句。如果存在echo语句,请删除它们。数据应始终以excel包指定的格式显示。