Чтение файла Xlsx в PhpSpreadsheetPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Чтение файла Xlsx в PhpSpreadsheet

Сообщение Anonymous »

Я хочу прочитать файл xlsx, созданный в Microsoft Excel, но когда я запускаю следующий код...

Код: Выделить всё

$Source_File = "test.xlsx";
$Spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($Source_File);
...Я получаю следующую ошибку:

Код: Выделить всё

Fatal error: Uncaught PhpOffice\PhpSpreadsheet\Reader\Exception: Unable to identify a reader for this file in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php:163
Stack trace:
#0 /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php(93): PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile('file:///home/ar...')
#1 /var/www/html/Function_Spreadsheet.php(480): PhpOffice\PhpSpreadsheet\IOFactory::load('file:///home/ar...')
#2 /var/www/html/Function_Home.php(3747): Spreadsheet_Reader_1('/var/www/html/F...', 3745, Array, Array)
#3 {main} thrown in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php on line 163
Я получаю ту же ошибку, если вместо этого использую $Spreadsheet = IOFactory::load($Source_File);

Я получаю следующую ошибку, если вместо этого использую $Spreadsheet = $reader->load($Source_File);

Код: Выделить всё

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 313

Notice: Trying to get property 'Relationship' of non-object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 350

Warning: Invalid argument supplied for foreach() in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 350

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 313

Notice: Trying to get property 'Relationship' of non-object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 397

Warning: Invalid argument supplied for foreach() in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 397

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 311

Warning: ZipArchive::getFromName(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 313

Notice: Trying to get property 'Override' of non-object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 1855

Warning: Invalid argument supplied for foreach() in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 1855

Warning: ZipArchive::close(): Invalid or uninitialized Zip object in /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php on line 1883
Файл доступен для чтения и открытия с помощью моего сценария PHP v7.2 в Apache в Ubuntu 18.04. Я прочитал несколько сообщений на форуме, в которых предлагалось следующее, что я сделал:
  • Установите необходимые расширения и перезапустите Apache
  • Проверьте права доступа к файлу
Я попробовал открыть файл в LibreOffice и сохранить его там как xlsx, но возникает та же ошибка (нет ошибки, если я сохраняю как xls).

Я могу создать программу чтения $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();, но когда я делаю $Spreadsheet = $reader->load($Source_File); или $Spreadsheet = IOFactory::load($Source_File); я получаю то же самое ошибка.

Кроме того, я могу создать программу чтения xls, которая сможет читать файлы xls. Я также могу создать программу чтения xlsx, но она не будет читать файл xlsx, выдает ту же ошибку при попытке прочитать файл xlsx. Итак, почему возникает ошибка в файле xlsx?

Кроме того, я прочитал исходный код, на который указывает сообщение об ошибке (

Код: Выделить всё

IOFactory.php
) и нашел следующее место (около строки №139), где возникает ошибка...

Код: Выделить всё

//Let's see if we are lucky
if (isset($reader) && $reader->canRead($filename))
{
return $reader;
}
...и я искал определение canRead, но не нашел его нигде в /vendor/phpoffice/phpspreadsheet/. Где определен canRead? Думаю, если бы я мог прочитать определение canRead, то, возможно, я бы понял, в чем основная причина проблемы.

ОБНОВЛЕНИЕ:

Из комментариев и обсуждений я узнал, что canRead() определен в \PhpSpreadsheet\Reader\Xlsx.php, начиная с строки 65. В canRead() $zip->open($pFilename) возвращает код ошибки ZipArchive::ER_NOENT, что означает «Нет такого файла». Однако файл существует. Итак, почему возникает эта ошибка?

ОБНОВЛЕНИЕ – 18 декабря 2018 г.

На этой веб-странице предполагается, что существует несколько типов файлов xlsx. Итак, я запустил файл test.xlsx, который отображал Microsoft Excel 2007+. Затем я открыл электронную таблицу в LibreOffice Calc, сохранил ее как файл xlsx типа OOXML и повторно запустил файл test.xlsx, который отобразил Microsoft OOXML. Затем я повторно запустил PHP-скрипт, но получил ту же ошибку. Итак, похоже, что мой тип файла xlsx не является проблемой.

Итак, я решил использовать PHPExcel (хотя он и устарел), чтобы выполнить некоторую необходимую работу. Когда я запустил сценарий с помощью PHPExcel, я получил аналогичную ошибку о том, что canRead() не может обнаружить файл xlsx.

Итак, я продолжил чтение этой веб-страницы и последовал последнему предложению wesood, которое было получено из принятого ответа на этой веб-странице. Это решение сработало для меня: в файле /PHPExcel/IOFactory.php я добавил PHPExcel_Settings::setZipClass(\PHPExcel_Settings::PCLZIP); непосредственно перед if (isset($reader) && $reader->canRead($filename)).

Однако я все еще хочу знать, как решить эту проблему в Таблица Php. Кажется, мне нужно узнать больше о том, как работает pclzip и нужно ли выполнять аналогичное действие с PhpSpreadsheet.

ОБНОВЛЕНИЕ 2019-02-10:

Я попробовал запустить сценарий сегодня, и кажется, что добавление PHPExcel_Settings::setZipClass(\PHPExcel_Settings::PCLZIP); больше не требуется работает. Итак, я снова застрял...

Что я делаю не так? Любая помощь приветствуется!

ОБНОВЛЕНИЕ 18 февраля 2019 г.:

Следуя рекомендациям комментариев, я протестировал скрипт, используя случайные файлы XLSX, найденные в результатах поиска Google (например, этот файл), которые были либо Excel 2007+ или Microsoft OOXML и те же ошибки отображаются для PhpSpreadsheet:


Неустранимая ошибка: Неперехваченный PhpOffice\PhpSpreadsheet\Reader\Exception:
Невозможно определить средство чтения для этого файла в
/var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php:176
Трассировка стека: #0
/var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php(113):
PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile('file:///var/www...') #1 /var/www/html/Function_Spreadsheet.php(798): PhpOffice\PhpSpreadsheet\IOFactory::identify('file:///var/www...') #2
/var/www/html/Function_Home.php(3748):
Spreadsheet_Reader_1('/var/www/html/F...', 3746, Array, Array) #3
{main} добавлено в /var/www/html/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php в строке 176
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»