Intereting Posts
Ошибка «Font_Glyph_Outline» при использовании WebFonts с DOMPDF Копирование файлов cookie с первого ответа на следующий запрос Cron Jobs вызывает скрипт PHP с переменными Неустранимая ошибка: нельзя использовать объект типа stdClass в качестве массива в Можно ли использовать функции store_result () и bind_result () с PHP PDO? SOAP-ERROR: Разбор WSDL: не удалось загрузить из «XXX / check? Wsdl»: не удалось загрузить внешний объект «XXX / check? Wsdl» Является ли это излишним или полезным использованием HTML-помощника CakePHP? $ .Post не работает в Intel XDK Ошибка модуля входа: свойство «LoginForm._id» не определено Что быстрее в PHP, одинарные или двойные кавычки? Повторяющиеся символы регулярного выражения Php Как использовать memcache с php codeigniter 3.0 custom 404 не найдена страница с ошибкой PHP mysqli вставить дату из строки Как обеспечить, чтобы значения атрибутов, содержащие кавычки, не нарушали форматирование?

PHPExcel создает «нечитаемый контент»

Я попытался исправить эту проблему около 1000 различных способов. Цените, если кто-нибудь еще может обнаружить проблему.

У меня есть код с использованием PHPExcel, который генерирует несколько листов Excel и сохраняет их на диск.

Открывая все из второго файла с помощью MS Excel 2010, я получаю сообщение об ошибке «Excel нашел нечитаемый контент в FILENAME. Вы хотите восстановить содержимое этой книги». Файл «восстановлен» и работает отлично. Открытие в OPEN Office не вызывает ошибок.

Вот упрощенная версия кода.

<?php $filenames = array("filenames go here"); $sheet1 = PHPExcel_IOFactory::load($template1); $writer1 = new PHPExcel_Writer_Excel2007($sheet1); $writer1->save('somefilename.xlsx'); //This file opens without problem $sheet1->disconnectWorksheets(); unset($sheet1); unset($writer1); $i = 0; foreach($filenames as $file){ $template = "template2.xlsx"; $fileName = 'filename' . $i . ' .xlsx'; $spreadsheet = PHPExcel_IOFactory::load($template); $objWriter = new PHPExcel_Writer_Excel2007($spreadsheet); $objWriter->save($fileName); $spreadsheet->disconnectWorksheets(); unset($spreadsheet); //This file throws error when opened in Excel 2007+ $i++; } ?> 

Я проверил следующие вещи:

  1. Нет очевидных сообщений об ошибках php, пробелов или посторонних входов, которые должны искажать файл.
  2. Файл шаблона открывается отлично в Excel 2010.
  3. Я пробовал использовать разные методы записи PHPExcel, но все они создают ту же проблему.

Реальный код делает всю загрузку лишних вещей, но я проверял, что это не отвечает, комментируя это. Вышеприведенный код является единственным местом, где может быть задана проблема.

Любые предложения с благодарностью получили.

==== EDITED ==== Это журнал ошибок, созданный Excel:

 <?xml version="1.0" encoding="UTF-8" standalone="true"?> -<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> <logFileName>error049120_01.xml</logFileName> <summary>Errors were detected in file 'C:\Users\USERNAME\AppData\Local\Temp\FILENAME.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> 

Эта ошибка была связана с конфигурацией mbstring.func_overload в php.ini. Вы можете использовать обходной путь, чтобы избежать этой ошибки – просто добавьте в начале своего скрипта:

 if (function_exists('mb_internal_encoding')) { $oldEncoding=mb_internal_encoding(); mb_internal_encoding('latin1'); } 

и в конце:

 if (function_exists('mb_internal_encoding')) mb_internal_encoding($oldEncoding); 

Это помогло мне, поэтому я считаю, что это тоже поможет вам.

У меня была аналогичная ошибка в моем файле, и я следил за рекомендацией, размещенной Андреем Янко, однако я все еще получал подобные ошибки. Я нашел предложения по другому сообщению и добавил

"Выход;"

в конце моего скрипта, который помог удалить оставшиеся ошибки

Очевидные проблемы:

 $sheet1 = PHPExcel_IOFactory::load($template1); $writer1 = new PHPExcel_Writer_Excel2007($sheet1); $writer1->save(sheet1); 

save($sheet1) – $ sheet1 не является именем файла, это объект PHPExcel, полная книга … метод сохранения ожидает имя файла, которое вы хотите сохранить в качестве аргумента

 foreach($filenames as $file){ $template = "template2.xlsx"; $fileName = 'filename.xlsx'; $spreadsheet = PHPExcel_IOFactory::load($template); $objWriter = new PHPExcel_Writer_Excel2007($spreadsheet); $objWriter->save($fileName); $spreadsheet->disconnectWorksheets(); unset($spreadsheet); } с foreach($filenames as $file){ $template = "template2.xlsx"; $fileName = 'filename.xlsx'; $spreadsheet = PHPExcel_IOFactory::load($template); $objWriter = new PHPExcel_Writer_Excel2007($spreadsheet); $objWriter->save($fileName); $spreadsheet->disconnectWorksheets(); unset($spreadsheet); } 

Каждый цикл сохраняет одно и то же имя файла, перезаписывая любые сохраненные из предыдущих итераций

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

Может быть, вы сохраняете его как .xls не .xlsx ?

Открытие нового .xlsx , получившего название .xls , дает мне аналогичное предупреждение.

Похоже, что эта ошибка была связана с отдельным файлом xlsx, который я использовал в качестве «шаблона». Код отлично работает, когда вместо него используется другой файл.

Исходный шаблон, похоже, не был поврежден, поэтому где-то рядом с PHPExcel возникла проблема, но не знаете где.