Чтение xls в php с помощью phpspreadsheet

У меня есть требования для чтения файлов XLS (не xlsx) с помощью PhpSpreadsheet, и у меня возникли проблемы. Я пробовал это (как говорится в документации, но ...)

require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("lista.xls");
$worksheet = $spreadsheet->getActiveSheet();

echo '<table>' . PHP_EOL;
foreach ($worksheet->getRowIterator() as $row) {
    echo '<tr>' . PHP_EOL;
    $cellIterator = $row->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(FALSE); // This loops through all cells,
                                                       //    even if a cell value is not set.
                                                       // By default, only cells that have a value
                                                       //    set will be iterated.
    foreach ($cellIterator as $cell) {
        echo '<td>' .
             $cell->getValue() .
             '</td>' . PHP_EOL;
    }
    echo '</tr>' . PHP_EOL;
}
echo '</table>' . PHP_EOL;

echo "<br>fin";

но не сработало (работало с файлом xlsx, но не с файлом xls!)

Затем я попытался открыть файл по-другому:

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
$sheet = $reader->load("lista.xls");

но тоже не работает ...

Мне действительно нужно решить эту проблему ... пожалуйста, помогите! PS: Я пробовал BasicExcel и PHPExcel, но тоже, похоже, не работал

В руководстве говорится, что нужно использовать первый метод, который вы использовали, и он попытается определить тип автоматически! Вы уверены, что ваш xls-файл не поврежден?

RiggsFolly 13.09.2018 18:57

Риггс: Довольно странно ... из-за вашего комментария я попытался создать xls-файл, и он сработал (первый метод), но мой клиент отправил мне несколько файлов, и ни один из них не работал ... похоже, у него проблемы с его офисом .. . большое спасибо!

Ari Waisberg 13.09.2018 19:11

Попробуйте открыть один из клиентских файлов и с помощью saveas сохраните версию и посмотрите, работает ли это.

RiggsFolly 13.09.2018 19:12

Также проверьте, использует ли клиент что-то ДРУГОЕ, кроме Excel, и просто сохраняет его как файл Excel, это может объяснить проблему.

RiggsFolly 13.09.2018 19:13

Да! Он экспортирует из какой-то другой системы в "xls-файл", который распознает Office, но библиотека не ... Большое спасибо! Вы хотите опубликовать это как «решение», чтобы я пометил его?

Ari Waisberg 13.09.2018 20:48

«Это не сработало» - бесполезная постановка проблемы.

Ian Kemp 14.06.2019 09:51
8
6
19 025
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я хотел бы уточнить у вашего клиента, используют ли они настоящий Excel или какую-либо другую электронную таблицу.

Если они используют какую-либо другую электронную таблицу и экспортируют с использованием функции «Экспорт в Excel», это может объяснить, почему она не распознается PHPSpreadsheet как какой-либо из возможных допустимых форматов Excel.

В этом случае и в зависимости от того, что находится в электронной таблице, возможно, стоит попросить их экспортировать свою электронную таблицу в виде файла csv (значения с разделителями-запятыми), поскольку это такой простой формат, что он должен быть допустимым выходом. Затем вы можете прочитать его, используя вызовы функций fgetcsv(), вместо того, чтобы использовать PHPSpreadsheet.

точно! они экспортируют из системы, а не из самого excel! Спасибо!

Ari Waisberg 13.09.2018 22:41

Как экспорт из системы, а не из Excel, приводит к тому, что формат становится нераспознаваемым? У меня возникла эта проблема, но в моем случае это файл xlsx, созданный в Excel.

Arya 17.12.2018 21:52

@Arya xlsx - это совершенно другой мир, который xls ... xlsx - это чистый xml, и вам не нужна библиотека Excel, вы можете открыть ее в любом редакторе кода и понять ее ... xls является пропиетарным, поэтому они вам нужны. .. В этом случае кажется, что библиотека создает файл таким образом, чтобы excel сама его распознала, но другие библиотеки этого не делают ...

Ari Waisberg 21.12.2018 16:52

попробуйте удалить это утверждение

$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("lista.xls");

и измените это с помощью этого

$inputFileName = "lista.xls";
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile($inputFileName);
$reader->setReadDataOnly(TRUE);
$spreadsheet = $reader->load($inputFileName);

Я невозможно прочитать файл Excel, вы можете проверить

Moeez 19.11.2020 09:39
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();

$inputFileType = 'Xlsx';
$inputFileName = './mysheet.xlsx';

/**  Create a new Reader of the type defined in $inputFileType  **/
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
/**  Advise the Reader that we only want to load cell data  **/
$reader->setReadDataOnly(true);

$worksheetData = $reader->listWorksheetInfo($inputFileName);

foreach ($worksheetData as $worksheet) {

$sheetName = $worksheet['worksheetName'];

echo "<h4>$sheetName</h4>";
/**  Load $inputFileName to a Spreadsheet Object  **/
$reader->setLoadSheetsOnly($sheetName);
$spreadsheet = $reader->load($inputFileName);

$worksheet = $spreadsheet->getActiveSheet();
print_r($worksheet->toArray());

}

Спасибо большое, это помогает.

Prasad Patel 10.04.2020 21:09

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

$file = "file.xlsx";
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
$spreadsheet = $spreadsheet->getActiveSheet();
$data_array =  $spreadsheet->toArray();

Другие вопросы по теме