Я использую PHPExcel 1.7.8
для чтения файлов .xls
, загруженных пользователем радиолокатора. Все работает правильно с действительным файлом .xls
, но теперь я хочу сделать несколько тестов с недопустимыми файлами, чтобы проверить, отображаются ли в программе хорошие сообщения об ошибках.
Поэтому я взял файл .csv
и переименовал его в .xls
(без преобразования ничего, просто изменив имя) до конца, просто чтобы проверить …
Сломанный! 🙂
DOM ELEMENT: HTML DOM ELEMENT: BODY DOM ELEMENT: P START OF PARAGRAPH: END OF PARAGRAPH: FLUSH CELL: A1 => block,date,hour... array 1 => array 'A' => string 'block,date,hour...' (length=2777) {"step":"error","errors":[],"warnings":[]}
Как вы можете видеть, отображается сообщение об ошибке, я не просил об этом, а затем JSON, который я обычно пишу.
Это происходит на этой линии:
<?php echo "Loading file\n"; try { if (!($objPHPExcel = PHPExcel_IOFactory::load('path'))) { echo "Failed\n"; return; // ... } } catch(Exception $e) { echo 'Exception !'; } echo "Done\n";
И этот код отображает:
Loading file /!\ ERROR MESSAGE ABOVE /!\ Done
Мой вопрос в том, есть ли способ с PHPExcel или что-то еще, чтобы проверить, является ли файл допустимым файлом XLS, прежде чем я попытаюсь его проанализировать?
Спасибо.
Каждый читатель в PHPExcel имеет метод canRead (), который проверяет, что файл, переданный в read, имеет соответствующий формат для этого читателя – метод возвращает простое логическое значение True или False. Возврат True из вызова метода canRead () класса PHPExcel_Reader_Excel5 подтверждает, что этот файл может быть прочитан этим читателем, независимо от расширения файла.
Метод IOFactory ident () использует этот вызов, тестируя его по отношению к читателям для каждого поддерживаемого формата, пока он не вернется к вызову canRead (). Метод IOFactory load (), в свою очередь, использует функцию ident () для определения того, какой Reader следует использовать для указанного файла.
Возможность проверки типа файла (не зависящего от расширения файла, который часто может вводить в заблуждение) особенно полезна, когда вы хотите установить дополнительные аргументы для чтения.
Откат от ident () / load () немного менее удовлетворительный: если canRead () возвращает false для всех других Readers, тогда файл рассматривается как CSV.
Даже если это вопрос более чем на год, мне все еще сложно обдумать, как справиться с этой проблемой, я постараюсь опубликовать свой ответ здесь.
Если использование блока try / catch не работает (в моем случае я переименовал файл jpg в xls, и обработчик ошибок не работает, вместо того, чтобы бросать ошибку, неверный файл просто выдает предупреждение) , вы можете рассмотреть ручную проверку используя canRead()
как сказал Марк, вот пример того, как использовать эту функцию.
Если вы знаете, что такое ваши типы файлов, вы можете определить его вручную и проверить на них:
$valid = false; $types = array('Excel2007', 'Excel5'); foreach ($types as $type) { $reader = PHPExcel_IOFactory::createReader($type); if ($reader->canRead($file_path)) { $valid = true; break; } } if ($valid) { // TODO: load file // eg PHPExcel_IOFactory::load($file_path) } else { // TODO: show error message }
Надеюсь, что это поможет любому, у кого есть такая же проблема.