PHP生成的Excel文件在下载时不同
我有一个PHP文件,它使用在中找到的模块生成xls文件 我可以很好地创建示例文档,当我打开它时,它看起来很好 我的下一步是把它变成一个可下载的链接。为此,我做了以下工作:PHP生成的Excel文件在下载时不同,php,download,xls,garbage,Php,Download,Xls,Garbage,我有一个PHP文件,它使用在中找到的模块生成xls文件 我可以很好地创建示例文档,当我打开它时,它看起来很好 我的下一步是把它变成一个可下载的链接。为此,我做了以下工作: $mimeType = "application/vnd.ms-excel"; $file_name = "test.xls"; $file_path = "/tmp/".$file_name; header("Pragma: public"); header("Expires: 0")
$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中都包含大量垃圾数据。diff表示/tmp文件夹中的二进制文件和下载的文件彼此不同。我猜它与头文件或fpassthru有关,但我在调试这个问题上运气不太好
有什么问题吗?多内容类型标题是不必要的。你基本上是说,文件是一个松饼,一个比萨饼和一个福特金牛座所有在同一时间。您只需要
应用程序/octet流
版本,除非您想提供确切的mime类型
另外,您是否有任何理由试图将fopen()
返回的文件句柄转换为引用
尝试更简单的方法:
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment;filename=$file_name");
readfile("/tmp/test.xls");
exit();
?>
看看这样做是否更好。只需确保在实际文件内容被发送之前,没有向浏览器发送任何内容即可 这可能只是一些php的“错误”或者甚至是“注意到”电子表格Excel编写器正在生成,而您甚至看不到。或者它可能是一个结尾“?>”标记,后跟s简单空格或换行符
在web文件夹中生成的文件工作时,我遇到了类似的错误。但是,使用头(“…”)的传递给了我损坏的文件。这是因为关闭“?>”标记后的一个php文件末尾有一个空格。我使用的是同一个库,我刚刚发现库中的文件本身正在创建空白 解决方案:在以下文件中,删除文件末尾的空白,或删除文件末尾的
?>
结束标记
要编辑的文件(电子表格中的所有文件)
在生成excel文件的页面顶部添加以下代码 ob_clean()强>
这将清除所有乱七八糟的数据。还要检查是否有任何echo语句。如果存在echo语句,请删除它们。数据应始终以excel软件包指定的格式显示。如果您只是简单地读取文件内容并将其发送到浏览器,我将使用file\u get\u contents()而不是fpassthru。
readfile()
更好,因为它将流式传输文件,而不是将整个内容存储在内存中。你可以很容易地用文件内容超过PHP内存限制。你能得到解决方案吗?我试着用给定的替换我的代码,但它仍然存在同样的问题。而且,我只是复制了作为引用传递它的代码部分,所以我承认我自己不确定为什么会这样做。我试过在有和没有符号的情况下使用它,但输出结果没有什么不同。你有没有用文本编辑器查看文件内部,看看垃圾是什么?可能是来自PHP的错误消息/警告,一个愚蠢的浏览器插件,等等。。。
Writer.php
Workbook.php
Worksheet.php
PPS.php
Parser.php
OLE.php
Parser.php
File.php
BIFFWriter.php
Validator.php
Root.php