7

PHPExcel が生成した Excel ファイルが機能しない。(ファイル形式または拡張子が無効です)

PHPExcel のサンプル コードはローカル PC で正常に実行され、ファイルはローカルにダウンロードされ、Excel 2007 で正常に開かれます。しかし、私のサーバーで同じコードを使用すると、無効なファイルが Excel に表示されます。開いて修復すると、正常に開きます。

[開いて修復] オプションは使用せず、[開く] オプションのみを使用します。

問題を見つけることができませんでしたか?助けてください。

$objPHPExcel->setActiveSheetIndex(0);

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

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

exit;
4

7 に答える 7

28

ob_end_clean();行の前に、プログラムの最後に行を追加します$objWriter->save('php://output');

コードは次のようになります: //XLSX の場合

$objPHPExcel->setActiveSheetIndex(0);

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');


header('Content-Disposition: attachment;filename="item_list.xlsx"');

header('Cache-Control: max-age=0');


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

ob_end_clean();
$objWriter->save('php://output');


exit;
于 2015-07-16T07:36:30.787 に答える
19

投稿したファイルには、PHPExcel 出力の前に単一のスペース文字があります...スクリプトをチェックして、これが php://output ストリームのどこに送信されるかを確認してください。<?php最初の開始タグの前にスペースがないことを確認してください。特に、?> <?phpまたは同様の終了/開始タグに注意してください。includedまた、スクリプトによる可能性のあるファイルも確認してください

于 2013-05-30T08:21:35.230 に答える
6

ファイルをテキスト エディタで開いて、偽の文字がファイルにエコーされていないかどうかを確認します。ある場合は、おそらくどこで導入されているかを把握できます。スペースや改行は明らかな原因です。

<?phpまた、どのファイルでも、タグの前またはタグの後にスペースや改行がないことを確認して?>ください。

このxlsx形式は、実際には圧縮されたxmlファイルのコレクションであるため、テキスト エディターに明らかなテキスト文字列 (PK 署名以外) が表示されない場合は、解凍してみてください。これにより、問題の他の手がかりが得られる可能性があります。

Windows プラットフォームで実行している場合、ZipArchivephp_zip.dllリンク ライブラリのバグのあるバージョンがいくつかあり、このエラーが発生する可能性があります。ZipArchive の代わりに PCLZip を使用できます。

于 2013-05-29T05:18:14.580 に答える
0

私は同じ問題に直面し、目的のデータの先頭から来る改行文字があり、このエラーを引き起こしていることがわかりました。後で、終了タグを持つphpファイルがあることがわかりました

"?>" 

通常、PHP の終了タグは出力バッファにも移動するため、使用を避けることをお勧めします。ob_end_clean() を使用することも良いオプションです。

詳細については、こちらを参照してください。なぜ終了タグを省略するのでしょうか?

于 2016-07-06T20:13:35.740 に答える