使用PHPExcel下载时获取损坏的xls文件

4

在我的当前项目中,我使用了PHPExcel 1.7.8将数据导出到Excel中。根据建议,在我的项目中成功配置了它,并成功生成了xls文件并存储了它,但是当我尝试下载xls文件时,我得到了一个已损坏的xls文件,没有收到任何错误消息。我有以下代码。

/** Error reporting */
if (PHP_SAPI == 'cli')
     die('This example should only be run from a Web Browser');

/** Include PHPExcel */
require_once '../Classes/PHPExcel.php';

// Create new PHPExcel object
$objPHPExcel = new PHPExcel();

// Set document properties
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
      ->setLastModifiedBy("Maarten Balliauw")
      ->setTitle("PHPExcel Test Document")
      ->setSubject("PHPExcel Test Document")
      ->setDescription("Test document for PHPExcel, generated using PHP classes.")
      ->setKeywords("office PHPExcel php")
      ->setCategory("Test result file");

// Add some data
$objPHPExcel->setActiveSheetIndex(0)
         ->setCellValue('A1', 'Hello')
         ->setCellValue('B1', 'world!')
         ->setCellValue('C1', 'Hello')
         ->setCellValue('D1', 'world!');

// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A2', 'Miscellaneous glyphs')
            ->setCellValue('B2', 'This is test text by me');

// Rename worksheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');


// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);

// Redirect output to a client’s web browser (Excel5)
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"filename.xls\"");
header("Cache-Control: max-age=0");

// Save Excel 2007 file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save(str_replace('.php', '.xls', __FILE__));
$objWriter->save("php://output");
exit;

谢谢您。

1
为什么要使用 $objWriter->save("php://output"); ???头信息在哪里??? - Bogdan Burym
2
当你遇到这个错误时的第一条规则:在文本编辑器中打开生成的文件,并查找文件开头和结尾处的空格或PHP错误消息...有可能你正在将某些东西回显到php://output流中...即使是像PHP BOM这样简单的东西。 - Mark Baker
3
大家好,感谢回复。在Google搜索了一些链接后,我通过使用ob_clean()函数清理输出缓冲区解决了这个问题,现在它已经起作用了。 - Ashwin
1
@pacific 我已经在谷歌上搜索了24个小时,什么都没用,幸运的是我读到了你的评论并且它起作用了。你应该将其写成答案并接受你的答案。 - sandeepKumar
1个回答

3

你能试试这个吗?就在你的

header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=\"filename.xls\"");
header("Cache-Control: max-age=0");

使用 ob_end_clean(); 方法。

你的输出缓冲区可能出现了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接