PHPExcel 文件无法打开文件,因为文件格式或文件扩展名无效

Posted

技术标签:

【中文标题】PHPExcel 文件无法打开文件,因为文件格式或文件扩展名无效【英文标题】:PHPExcel file cannot open file because the file format or file extension is not valid 【发布时间】:2012-12-24 12:26:19 【问题描述】:

我遇到了这个问题,它没有显示实际的 excel 文件。请检查下面的代码:

/** Error reporting */
error_reporting(E_ALL);

/** phpExcel */
require_once 'PHPExcel.php';
include 'PHPExcel/Writer/Excel2007.php';


// Create new PHPExcel object
#echo date('H:i:s') . " Create new PHPExcel object\n";
$objPHPExcel = new PHPExcel();
$excel = new PHPExcel();

$objPHPExcel->getProperties()->setTitle("Payroll");

if(!$result)
die("Error");

$col = 0; 
$row = 2; 
while($mrow = mysql_fetch_assoc($result))  
$col = 0; 
foreach($mrow as $key=>$value)  
    $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value); 
    $col++; 
 
$row++;  
 

 // Set active sheet index to the first sheet, so Excel opens this as the first sheet
 $objPHPExcel->setActiveSheetIndex(0)
        ->setCellValue('A1', 'Scholar Id')
        ->setCellValue('B1', 'Lastname')
        ->setCellValue('C1', 'Middlename')
        ->setCellValue('D1', 'Firstname')
        ->setCellValue('E1', 'Barangay')
        ->setCellValue('F1', 'Level')
        ->setCellValue('G1', 'Allowance')
        ->setCellValue('H1', 'Has claimed?');
        $objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getFont()->setBold(true);
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(12);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(18);
        $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(12);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(14);
$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getAlignment()- >setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->getActiveSheet()->setShowGridlines(true);

$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->applyFromArray(
array(
    'fill' => array(
        'type' => PHPExcel_Style_Fill::FILL_SOLID,
        'color' => array('rgb' => 'FFFF00')
    )
)
); 


// Save Excel 2007 file
echo date('H:i:s') . " Write to Excel2007 format\n";
#$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="payroll.xlsx"');
header('Cache-Control: max-age=0'); 
$writer->save('php://output');

【问题讨论】:

每当您看到此错误时,您应该做的第一件事是在文本编辑器中打开文件并在文件的开头或结尾查找空白字符(空格、制表符、换行符等),或 BOM 标记,或文件内容中任何明显的 PHP 人类可读错误消息 @MarkBaker 当我打开文件时它不包含任何代码或任何内容 【参考方案1】:

我现在开始工作了!感谢phpexcel to download

我把代码改成这样:

// Save Excel 2007 file
#echo date('H:i:s') . " Write to Excel2007 format\n";
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
// We'll be outputting an excel file
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="payroll.xlsx"');
$objWriter->save('php://output');

我认为这行:

ob_end_clean();

解决了我的问题。

【讨论】:

如果 ob_end_clean() 解决了问题,那么这意味着您的代码中的某些内容正在生成输出...最好的解决方法是找出什么,然后将其删除...查看生成的文件在文本中编辑器应该给出正在生成什么输出的线索 @bEtTyBarnes。是的。当然它(ob_end_clean)确实解决了我的问题。谢谢! 这对我也有用,我遇到了无效格式错误消息的错误,当我输入此代码时,它也对我有用。谢谢!【参考方案2】:

我不知道我是否可以帮助我遇到同样的问题,我解决了

ob_end_clean();

我把它放在后面

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

所以无论如何不要更改标题并将其保存为xslx,问题是缓冲区!

【讨论】:

【参考方案3】:

如果这是脚本的剪切和粘贴,最可能的罪魁祸首是

echo date('H:i:s') . " Write to Excel2007 format\n";

如果您要发送到浏览器进行下载,那么除了 PHPExcel 自身生成到 php://output 的输出之外,必须没有其他输出(回显、打印语句、放入和退出 PHP)

【讨论】:

我注释掉了 echo date('H:i:s') 。 " 写入 Excel2007 格式\n";但它仍然不显示excel文件?但是excel文件保存在我的php excel文件夹中。我希望用户选择他/她想要保存的位置?我该怎么做? 应该引导浏览器通过您发送的标题提供下载对话......但我对您的问题和评论感到困惑。该问题表明您正在获得下载对话,但文件已损坏。现在你说你没有得到下载对话框 是的,我自己也很困惑。对不起,但现在我的问题是浏览器正在下载 excel.php 本身,excel 文件也下载到我的文件夹中,但我希望用户选择他应该保存它的位置。【参考方案4】:

请确保所有文件(例如包含的文件)都采用 UTF-8 无 BOM 编码。 您可以通过不同的方式来识别它,例如看到这个link。

仅当您需要带有 BOM 的 UTF-8 - 请在将数据输出到浏览器之前使用ob_end_clean();,正如此处其他答案中所指出的那样。

【讨论】:

【参考方案5】:

我也有同样的问题,问题很简单。只需将代码放在下面:

ob_end_clean();

之后:

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');

【讨论】:

【参考方案6】:

我认为这个问题的解决方法和这里一样: Google Chrome errors while exporting XLS file using PHP

只需在 attachment;filename 之间添加一个空格,这样:

header("Content-Disposition: attachment; filename=\"Past_Due_Report.xls\"");

正如我在您自己的回答中看到的那样,这就是您所做的,并且可能解决了您的问题。

【讨论】:

【参考方案7】:

我遇到了同样的问题,但调用 ob_end_clean() 没有用。我的 CMS(drupal 7)弄乱了我的标题,所以即使我在文件输出之前调用了ob_end_clean(),我在内容的开头也有了一个新行(十六进制 0A)。

通过下面的代码,我终于摆脱了领先的新行:

 for ($i = 0; $i < ob_get_level(); $i++)  ob_end_flush(); 
      ob_implicit_flush(1);

 ob_clean();

【讨论】:

【参考方案8】:

这个答案救了我的命。谢谢@ARN

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, "Excel2007");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="export_result.xlsx"');
for ($i = 0; $i < ob_get_level(); $i++) 
   ob_end_flush();

ob_implicit_flush(1);
ob_clean();
$objWriter->save("php://output");

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。Read this【参考方案9】:

我有同样的问题,但我使用库phpspreadsheet

只要放这个函数:

ob_end_clean();

在这段代码之后:

$writer = new Xlsx($spreadsheet);

【讨论】:

以上是关于PHPExcel 文件无法打开文件,因为文件格式或文件扩展名无效的主要内容,如果未能解决你的问题,请参考以下文章

Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏解决办法

关于Excel无法打开,因为文件格式或文件扩展名无效的解决方法

如何用PHPExcel读取超大excel文件

PHP - Codeigniter:未捕获的异常“PHPExcel_Reader_Exception”,消息“无法打开读取,文件不存在”

Windows 照片查看器无法打开此图片,因为此文件可能已损坏、损毁或过大。

excel无法打开文件因文件格式或文件扩展名无效