web-dev-qa-db-fra.com

Le fichier PHPExcel ne peut pas ouvrir le fichier parce que le format ou l'extension du fichier n'est pas valide

Je suis coincé avec ce problème, il n'affiche pas le fichier Excel réel. S'il vous plaît vérifier mon code ci-dessous:

/** 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');
9
user1410081

Je le fais travailler maintenant! Merci à ceci phpexcel à télécharger

J'ai changé le code en ceci:

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

Je pense que cette ligne: 

ob_end_clean();

résolu mon problème.

43
user1410081

Je ne sais pas si je peux aider, j'ai eu le même problème et j'ai résolu avec

ob_end_clean();

je le mets juste après 

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

Donc, ne changez pas l'en-tête et sauvegardez-le en tant que xslx, le problème est le tampon!

5
marco burrometo

Assurez-vous que tous les fichiers (par exemple, inclus) sont au format UTF-8 sans BOM .
Vous pouvez identifier cela de différentes manières, par exemple: voir ce link

Si vous avez besoin de UTF-8 avec BOM -, veuillez utiliser ob_end_clean(); avant la sortie des données dans le navigateur, comme indiqué dans les autres réponses fournies ici.

2
Andron

Le coupable le plus probable s’il s’agit d’un copier-coller de votre script est le 

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

Si vous envoyez le navigateur au téléchargement, il ne doit y avoir aucune autre sortie (échos, instructions d'impression, entrées et sorties de PHP) que la sortie générée en php: // sortie par PHPExcel lui-même.

1
Mark Baker

J'ai eu le même problème mais appeler ob_end_clean() n'a pas fonctionné. Mon CMS (drupal 7) avait foiré mes en-têtes. J'ai donc une nouvelle ligne (hexcode 0A) au début du contenu, même si j'ai appelé ob_end_clean() avant la sortie du fichier.

Avec le code ci-dessous, je me suis finalement débarrassé de la nouvelle ligne principale:

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

 ob_clean();
0
ARN

je pense que la solution à ce problème est la même qu'ici: Erreurs de Google Chrome lors de l'exportation d'un fichier XLS avec PHP

ajoutez simplement un espace entre attachement; et nom du fichier , de cette façon:

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

comme je peux le voir dans votre propre réponse, c'est ce que vous avez fait et c'est probablement ce qui a résolu votre problème.

0
cetipabo

J'ai le même problème, le problème est simple. Il suffit de mettre le code ci-dessous:

ob_end_clean();

après :

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