使用PhpSpreadsheet在PHP中读取XLS文件

9

我有一个需求,需要使用PhpSpreadsheet读取XLS文件(而不是xlsx),但是我遇到了困难。我按照文档尝试了以下代码,但是并没有成功:

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,但貌似也没有用。


3
根据手册,建议使用你之前使用的第一种方法,并且它会自动尝试识别文件类型!你确定你的xls文件没有损坏吗? - RiggsFolly
1
RiggsFolly很奇怪...因为你的评论,我自己尝试创建了一个xls文件,它起作用了(第一种方法),但我的客户给我发送了很多文件,没有一个起作用...看来他的办公室有问题...非常感谢! - Ari Waisberg
1
试着打开客户端文件中的一个并使用“另存为”保存一个版本,看看是否可行。 - RiggsFolly
1
还要检查客户端是否使用的不是 Excel,只是将文件保存为 Excel 格式,这可能会解释问题。 - RiggsFolly
1
是的!他正在从其他系统导出到 Office 可识别但库不识别的“xls 文件”... 非常感谢!您想将其发布为“解决方案”,以便我标记吗? - Ari Waisberg
1
“它没有工作” 不是一个有用的问题陈述。 - Ian Kemp
4个回答

21
<?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());

}

2
非常感谢,这很有帮助。 - Prasad Patel
1
我无法读取Excel文件。 - Moeez

7
我建议您先与客户确认他们是否正在使用真正的Excel或其他电子表格软件。如果他们使用其他电子表格软件并使用“导出为Excel”功能,则可能是因为PHPSpreadsheet无法识别任何有效的Excel格式。
在这种情况下,取决于电子表格中包含什么内容,建议要求他们将电子表格导出为csv(逗号分隔值)文件,因为这是一种非常简单的格式,应该是有效的输出。然后,您可以使用fgetcsv()函数调用来读取它,而不必使用PHPSpreadsheet。请注意保留HTML标记。

2
确切地说!它们是从系统中导出,而不是从Excel本身导出!谢谢! - Ari Waisberg
1
从系统中导出,而不是从Excel中导出,会导致格式无法识别。我遇到了这个问题,但在我的情况下,它是由Excel创建的xlsx文件。 - Arya
2
@Arya,xlsx是一个完全不同的世界,与xls有很大区别... xlsx是纯xml格式,您不需要使用Excel库,可以在任何代码编辑器中打开并理解它... xls是专有格式,因此您需要这些库... 在这种情况下,该库似乎以一种使Excel本身能够识别文件的方式创建了该文件,但其他库则没有。 - Ari Waisberg
我无法读取Excel文件。 - Moeez

0
这里的关键是在加载文件后将其转换为数组。
$file = "file.xlsx";
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
$spreadsheet = $spreadsheet->getActiveSheet();
$data_array =  $spreadsheet->toArray();

0
尝试删除此语句。
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("lista.xls");

并将其更改为此内容

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

我无法读取Excel文件,你能否帮忙检查一下?(链接为 https://stackoverflow.com/q/64906846/6854117) - Moeez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接