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

问题描述 投票:9回答:8

我遇到了这个问题,它没有显示实际的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');
php phpexcel
8个回答
47
投票

我现在就开始工作了!感谢这个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();

解决了我的问题。


5
投票

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

ob_end_clean();

我把它放在后面

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

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


2
投票

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

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

如果您要发送到浏览器进行下载,则必须没有其他输出(回声,打印语句,放入和退出PHP)而不是PHPExcel本身输出到php://输出的输出


2
投票

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

只有当您需要带有BOM的UTF-8时 - 请在输出到浏览器之前使用ob_end_clean();,如此处的其他答案所示。


0
投票

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

ob_end_clean();

之后:

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

0
投票

我认为这个问题的解决方案与此处相同:Google Chrome errors while exporting XLS file using PHP

只需在附件之间添加一个空格;和文件名,那样:

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

正如我在你自己的回答中看到的那样,你所做的就是解决你的问题。


0
投票

我有同样的问题,但调用ob_end_clean()不起作用。我的CMS(drupal 7)弄乱了我的标题,所以我在内容的开头有一个新行(hex 0A),即使我在文件输出之前调用了ob_end_clean()

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

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

 ob_clean();

0
投票

这个答案救了我的命。谢谢@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");
© www.soinside.com 2019 - 2024. All rights reserved.