0

これがいくつかの部分で尋ねられた可能性があることは知っていますが、問題に対する正確な答えを見つけることができませんでした. 私はPHPExcelを使用してExcelファイルを生成しています(明らかに)。コードはファイルを生成するために機能しますが、強制ダウンロードのコードを含めるとファイルが破損します。私の最新バージョンのスクリプトは次のようになります。

function make_xls_spreadsheet(){

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

/* Set the save path */
define('XLSX_SAVE_PATH', 'tmp/');

/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');

/** PHPExcel */
include 'PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
include 'PHPExcel/Writer/Excel2007.php';


/* Create a new PHPExcel Object */
$objPHPExcel = new PHPExcel();


/* Add some metadata to the file */
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");

/* Set active worksheet to first */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Segments');

/* Add some data to the worksheet */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');


/* Write to server */
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

$filename = "tony1.xlsx";

// Works fine up to here

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

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


echo "DONE!";

$objPHPExcel->disconnectWorksheets();
unset($objPHPExcel);



}

強制コード セクションを削除すると、ファイルが生成され、FTP で正常にダウンロードできることを思い出してください。ただし、ファイルの生成と強制の両方を行うと、ファイルが破損します。通常、[開く & 修復] (Office2011 MacOSX) をクリックできますが、明らかにこれは望ましくありません。

誰かが私を理解するのを手伝ってくれませんか:

  1. 破損として生成されるのはなぜですか? そして、ダウンロードを強制しないとうまく動作するのはなぜですか。
  2. 保存/強制の適切な順序は (PHP の header() 関数を使用)
  3. これを行うより良い方法があれば。

とても有難い!!

****更新**** 「修正と修復」をクリックしたときのコードは次のとおりです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>Repair Result to tony1 03178.xml</logFileName>
    <summary>Errors were detected in file 'Macintosh HD:Users:tony.diloreto:Downloads:tony1.xlsx'</summary>
    <additionalInfo><info>Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.</info></additionalInfo>
</recoveryLog>
4

3 に答える 3

2

// 回答は実際には @Dagon に属します

答えは実際には簡単で、簡単なexit();呼び出しだけが必要です。

最終的なコード ブロック:

function make_xls_spreadsheet(){

/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');

/** PHPExcel */
include 'PHPExcel.php';

/** PHPExcel_Writer_Excel2007 */
include 'PHPExcel/Writer/Excel2007.php';


/* Create a new PHPExcel Object */
$objPHPExcel = new PHPExcel();

/** Determine filename **/
$filename = "tony1.xlsx";

/** Set header information **/
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');


/* Add some metadata to the file */
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");
$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");
$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");

/* Set active worksheet to first */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Segments');

/* Add some data to the worksheet */
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('B2', 'world!');
$objPHPExcel->getActiveSheet()->SetCellValue('C1', 'Hello');
$objPHPExcel->getActiveSheet()->SetCellValue('D2', 'world!');


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

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

exit();

}
于 2014-10-08T20:46:37.300 に答える
0

次のように File.php を変更してみてください。

保護された静的 $_useUploadTempDirectory = TRUE;

フォルダー phpexcel/Classes/PHPExcel/Shared 内 (これは最善の方法ではありませんが、私にとってはうまくいきました)。

于 2015-05-11T13:18:20.307 に答える
0

これにより、Excel ファイルがブラウザーに吐き出されます。

readfile(XLSX_SAVE_PATH . $filename);  

これを吐き出すと、ブラウザによってダウンロードされた Excel ファイルの一部になります。

echo "DONE!";

本質的にあなたが送っている

[excel data]DONE!

Excelが期待しているとき

[excel data]
于 2014-10-08T19:45:18.383 に答える