【问题标题】:PHP Excel file downloaded via browser not opened by MS-Excel/OpenOffice通过浏览器下载的 PHP Excel 文件未被 MS-Excel/OpenOffice 打开
【发布时间】:2012-11-30 06:02:34
【问题描述】:

PHPExcelsimple exmple 在我的本地机器设置上正常工作。它正在下载 .xlsx 文件,MS-Excel 程序会愉快地打开它。

现在我将此代码复制到我的 WordPress 插件中,以允许从 WordPress 管理部分下载 Excel

if ( file_exists(CHECKIN_PLUGIN_DIR . '/lib/PHPExcel.php') ) {
    ob_end_clean();
    ob_start();

/** Include PHPExcel */
require (CHECKIN_PLUGIN_DIR . "/lib/PHPExcel.php");
require (CHECKIN_PLUGIN_DIR . "/lib/PHPExcel/Writer/Excel2007.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('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');

// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A4', 'Miscellaneous glyphs')
            ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

// 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);

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="myfile.xlsx"');
header('Cache-Control: max-age=0');

// Save Excel 2007 file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
//$objWriter->save("/home/user/ExcelTests/test01.xlsx");
$objWriter->save('php://output');  

exit;
}
?>
<div class="wrap">
....

但是下载的文件不能被excel打开,上面写着Different format than specified by the file extension....,打开的时候显示一堆hexa chars

PKU~AG�D�X�[Content_Types].xml��MN�0��"�%nY ��vAa �(0��ؖg�w{&i�@�nbE�{��y��d۸l m�����X�(���)���F��;@1_�����c)j�x/%��E��y� �QĿi!��K�

当我更改代码以将其保存为硬盘中的文件时,可以毫无问题地打开它。

if ( file_exists(CHECKIN_PLUGIN_DIR . '/lib/PHPExcel.php') ) {
    ob_end_clean();
    ob_start();

/** Include PHPExcel */
require (CHECKIN_PLUGIN_DIR . "/lib/PHPExcel.php");
require (CHECKIN_PLUGIN_DIR . "/lib/PHPExcel/Writer/Excel2007.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('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');

// Miscellaneous glyphs, UTF-8
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A4', 'Miscellaneous glyphs')
            ->setCellValue('A5', 'éàèùâêîôûëïüÿäöüç');

// 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);
/*
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="myfile.xlsx"');
header('Cache-Control: max-age=0');
*/

// Save Excel 2007 file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save("/home/user/ExcelTests/test01.xlsx");
//$objWriter->save('php://output');

exit;
}
?>
<div class="wrap">
....

Excel5 格式也是如此。

但是通过浏览器下载的CSV没有问题。

有什么帮助吗?

更新

vi浏览器下载的文件是here

保存到文件系统的文件是here

在 Hexa 编辑器中查看时,在下载文件中的 PK 之前发现一个额外的换行符 0A

我尝试使用 trim 删除该换行符

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

// Save Excel 2007 file
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');

$ob_content = ob_get_contents();
ob_end_clean();
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="export.xlsx"');
header('Cache-Control: max-age=0');
echo trim($ob_content);
exit;

但即使在那之后0A 仍然在文件的开头。

【问题讨论】:

    标签: php wordpress excel-2007 phpexcel


    【解决方案1】:

    这几乎可以肯定意味着您正在输出 xls 文件内容的附加内容,例如空格或 BOM 标头。在文本编辑器中打开文件,查找文件开头(PK 字符之前)或结尾处的任何空白字符,例如制表符、空格、换行符等,或文件中是否有任何明显的 PHP 错误消息自己。

    【讨论】:

    • 是的,在 Hexa 编辑器中查看时,在下载文件中的 PK 之前,这是一个额外的 0A 换行符
    • 在这种情况下,在你的脚本中的某个地方,有一个空行在 ?>
    【解决方案2】:

    我在我的项目中使用了这段代码,效果很好:

    $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);   
    
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="' . $filename . '.xlsx"');
    
    $objWriter->save('php://output');
    

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      相关资源
      最近更新 更多