2015-12-30 5 views
2

Я генерирую файлы .xlsx, .ods, .pdf и .cvs на некоторых больших массивах данных, используя PHPExcel (с DomPDF для .pdf). Я следил за примерами на их странице github и сообщениях stackoverflow, если были проблемы. Мне удалось получить экспорт .csv, но остальное - нет.PHPExcel: Создание неправильных двоичных файлов для .xlsx, .ods и .pdf

При запуске экспорта .xlsx я получаю файл .xlsx, который нельзя открыть на моем Mac, и ни в документах Google. Поэтому я прокомментировал все вызовы header() в php out, чтобы следить за сообщениями об ошибках PHP. Оказывается, их нет, и я получаю двоичные файлы .xlsx, .pdf или .ods, как и ожидалось в браузере, хотя я не могу их открыть позже. Кажется, мои скрипты работают, но как-то производят поврежденные двоичные файлы.

Что я здесь делаю неправильно? Следующий код для моего экспорта .xlsx, для экспорта .pdf/.ods почти аналогичен.

$excel = new PHPExcel(); 
// Now set some meta data for that object 
// ... 

     $cellRow = 2; 
     $cellColumn = "B"; 

     // Add data to the excel file 
     foreach($entries as $entry) { 
      // ... 

      $cellColumn = "B"; 
      $cellRow += 1; 

     } 

     // Export 
     header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
     header('Content-Disposition: attachment;filename="export_' . $dateGenerated . '.xlsx"'); 
     header('Cache-Control: max-age=0'); 
     header('Cache-Control: max-age=1'); 
     header('Expires: ' . gmdate('D, d M Y H:i:s')); 
     header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); 
     header('Cache-Control: cache, must-revalidate'); 
     header('Pragma: public'); 
     $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); 
     saveViaTempFile($writer); 

Функция saveViaTempFile() берется из этого StackOverflow сообщение: PHPExcel_Writer_Exception with message "Could not close zip file php://output." избежать некоторых других проблем.

TLDR: Я генерирую файлы .xlsx, .ods, .pdf, код должен быть правильным. Бинарники как-то испорчены. Что я делаю не так? Благодаря!

EDIT: по просьбе дополнительной информации: Я использую PHPExcel 1.8.1. Устанавливается вместе с композитором и импортируется в моем локальном скрипте с require "vendor/autoload.php"; Я использую error_reporting(E_ALL); и не отжимаю ничего. Тем не менее, нет ни одного уведомления/ошибки вообще. Он просто генерирует .xlsx, который я тогда не могу открыть.

Функции saveVieTempFile() я использую следующие один и прямо скопирован с привязанным SO нити выше:

static function saveViaTempFile($objWriter) { 
     $filePath = "tmp/" . rand(0, getrandmax()) . rand(0, getrandmax()) . ".tmp"; 
     $objWriter->save($filePath); 
     readfile($filePath); 
     unlink($filePath); 
    } 

И да, я установить CHMOD (777) в каталог/TMP. В противном случае я бы не смог получить бинарный вывод.

Я даже испытания, если только при добавлении очень простые данные в файл работает следующим образом:

$excel->setActiveSheetIndex(0)->setCellValue("A3", "hello"); 
     $excel->setActiveSheetIndex(0)->setCellValue("A4", "world"); 
     $excel->setActiveSheetIndex(0)->setCellValue("A5", "this"); 
     $excel->setActiveSheetIndex(0)->setCellValue("A6", "isn't"); 
     $excel->setActiveSheetIndex(0)->setCellValue("C1", "working"); 
$excel->setActiveSheetIndex(0); 

Оказывается, даже это просто данные не экспортируются должным образом, и я не могу открыть этот файл на моем Mac или с документами google после этого.

Для получения дополнительной информации, просто спросите в комментариях, и я обновлю это сообщение.

+0

Попробуйте сохранить файлы на диск и открыть их с диска; но с такой минимальной информацией очень сложно сказать, что вы можете делать неправильно –

+0

@Mark Baker: Ну, конечно, я загрузил файлы (когда вызовы header() не закомментированы). Когда они находятся на диске как физический файл, я не могу их открыть. Ни я, если я просто беру двоичный файл, напечатанный в браузере, и сохраняю его вручную на диск и назову его .xlsx. Если вам нужна дополнительная информация, просто скажите мне, что вам нужно знать, пожалуйста.Я не знаю, что еще я должен написать в вопросе. – BoA456

+0

Мне нужна дополнительная информация о том, что вы на самом деле делаете для создания этих файлов, какую версию PHPExcel вы используете, например, вы подавляете уведомления/предупреждения и т. Д. –

ответ

0

Оказывается, моя проблема несколько связана с сообщением о «возможной дубликации». У меня есть центральный appIndex.php, который включает в себя много вещей, которые мне нужны. Этот центральный сайт затем включает сайт, который я сейчас хочу выполнить, например excelExport.php.

Поскольку моя центральная страница использовала ob_start(); и ob_end_flush(); мой .xlsx и мой экспорт .ods не работают. Второй я удалил использование ob_start(); мой экспорт немедленно сработал.

Смежные вопросы