PHP生成的Excel文件在下载时不同

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")

我有一个PHP文件,它使用在中找到的模块生成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中都包含大量垃圾数据。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