J'essaie de générer un fichier Excel avec l'extension .xlsx à partir du code ci-dessous. Je peux très bien télécharger le fichier, mais lorsque je l'ouvre avec une feuille Excel, le message d'avertissement suivant s'affiche: Excel ne peut pas ouvrir le fichier 'dindi.xlsx' car le format ou l'extension du fichier n'est pas valide. Assurez-vous que le fichier n'est pas corrompu et que son extension correspond au format du fichier . Lorsque je l'ai ouvert avec le bloc-notes, le fichier présentait l'erreur suivante:
Avis: ob_end_clean () [ref.outcontrol]: échec de la suppression du tampon. Pas de tampon à supprimer
</ p>
Vous trouverez ci-dessous le code de ce que j'essaie de faire.
public function exportResults() {
$this -> load -> database();
$query = $this -> db -> query("
SELECT * FROM farm LIMIT 10");
$results = $query -> result_array();
$objPHPExcel = new Excel();
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load('./files/farmdetails.xlsx');
$objPHPExcel ->getActiveSheet()->setTitle('farmreport');
$objPHPExcel -> setActiveSheetIndex(0);
$i = 1;
foreach ($results as $result) {
$objPHPExcel -> getActiveSheet() -> SetCellValue('A' . $i, $result["name"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('B' . $i, $result["dateofcontract"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('C' . $i, $result["leasorname"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('D' . $i, $result["acre"]);
$objPHPExcel -> getActiveSheet() -> SetCellValue('E' . $i, $result["zone"]);
$i++;
echo $result["name"];
}
ob_end_clean();
$filename = "dindi.xlsx";
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename=' . $filename);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
ob_end_clean();
$objWriter -> save('php://output');
$objPHPExcel -> disconnectWorksheets();
unset($objPHPExcel);
}
Cette erreur indique simplement qu'il n'y avait pas de tampon à supprimer ..__ Pour l'éviter, utilisez simplement:
if (ob_get_contents()) ob_end_clean();
(vérifiez s'il y a un tampon de sortie actif) ou:
if (ob_get_length()) ob_end_clean();
(vérifie s'il y a une chaîne non vide dans le tampon) comme suggéré par @Venu.
aussi vous appelez ob_end_clean();
deux fois. Et cela ne fonctionne qu'avec des tampons empilables. Depuis le manuel PHP:
Cette fonction supprime le contenu du tampon de sortie le plus élevé et désactive cette mise en mémoire tampon de sortie.
Êtes-vous sûr de ne pas vouloir simplement utiliser ob_clean () ?
Ajoutez ce morceau de code . Se produit sur le site en direct lorsque minifyhtml est actif. Peut être connecté aux demandes advagg et httprl.
Le correctif proposé consiste à envelopper ob_clean()
avec ob_get_length()
.
if(ob_get_length() > 0) {
ob_clean();
}
De la PHP section de commentaires de la documentation , vous pouvez remercier Cornel sur scoalaweb dot com:
N'utilisez pas ob_clean()
ou ob_end_clean()
pour effacer des espaces ou tout autre contenu indésirable "accidentellement" généré par les fichiers inclus.
Les fichiers inclus ne doivent pas générer de contenu indésirable en premier lieu.
Si c'est le cas, vous faites quelque chose de mal, comme insérer un espace après "?>
" (il ne devrait pas y avoir de "?>
" à la fin de PHP fichiers), ou d'autres erreurs qui ne suivent pas le règles de syntaxe de base de PHP .
Votre code n'a pas ob_start, bien sûr, il n'y a pas de tampon à supprimer.
Veuillez passer à la caisse http://php.net/manual/en/function.ob-start.php