Я генерирую файлы .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 после этого.
Для получения дополнительной информации, просто спросите в комментариях, и я обновлю это сообщение.
Попробуйте сохранить файлы на диск и открыть их с диска; но с такой минимальной информацией очень сложно сказать, что вы можете делать неправильно –
@Mark Baker: Ну, конечно, я загрузил файлы (когда вызовы header() не закомментированы). Когда они находятся на диске как физический файл, я не могу их открыть. Ни я, если я просто беру двоичный файл, напечатанный в браузере, и сохраняю его вручную на диск и назову его .xlsx. Если вам нужна дополнительная информация, просто скажите мне, что вам нужно знать, пожалуйста.Я не знаю, что еще я должен написать в вопросе. – BoA456
Мне нужна дополнительная информация о том, что вы на самом деле делаете для создания этих файлов, какую версию PHPExcel вы используете, например, вы подавляете уведомления/предупреждения и т. Д. –