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

时间:2010-09-13 20:54:54

标签: php download xls garbage

我有一个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有关,但我没有太多运气调试问题。

关于问题是什么的任何想法?

4 个答案:

答案 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包指定的格式显示。