PHPExcel Force Проблема с загрузкой

Я знаю, что это могло быть задано в нескольких частях, но я не мог найти точный ответ на вопрос. Я использую 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. Каков правильный порядок сохранения / форсирования (с использованием функции 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>

0

Решение

// ответ на самом деле принадлежит @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();

}
2

Другие решения

Это выкладывает файл Excel в браузер:

readfile(XLSX_SAVE_PATH . $filename);

а затем вы выплевываете это, которое становится частью файла Excel, загруженного браузером

echo "DONE!";

по сути вы отправляете

[excel data]DONE!

когда Excel ожидает только

[excel data]
0

Попробуйте изменить File.php следующим образом:

защищенный статический $ _useUploadTempDirectory = TRUE;

в папке phpexcel / Classes / PHPExcel / Shared (это не лучший способ, но он работал для меня).

0
По вопросам рекламы [email protected]