使用 PhpSpreadsheet 在 PHP 中读取 XLS

Posted

技术标签:

【中文标题】使用 PhpSpreadsheet 在 PHP 中读取 XLS【英文标题】:Read XLS in PHP using PhpSpreadsheet 【发布时间】:2019-02-18 11:08:15 【问题描述】:

我需要使用 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 但似乎也没有用

【问题讨论】:

我在手册中说要使用您使用的第一种方法,它会尝试自动识别类型!你确定你的 xls 文件没有损坏吗 RiggsFolly 奇怪...由于您的评论,我尝试自己创建一个 xls 并且它有效(第一种方法)但我的客户向我发送了一些安静的文件,但没有一个有效...看来他他的办公室有问题...非常感谢! 尝试打开其中一个客户端文件并使用另存为保存版本,看看是否有效 还要检查客户端是否使用了 Excel 以外的其他东西,并且只是保存为 Excel 文件,这可能会解释问题 是的!他正在从其他系统导出到 Office 识别但库不识别的“xls 文件”……非常感谢!您想将其作为“解决方案”发布,以便我标记它吗? 【参考方案1】:
<?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());


【讨论】:

非常感谢,它有帮助。 我是unable to read excel file【参考方案2】:

我会与您的客户核实,看看他们是否使用真正的 Excel 或其他电子表格。

如果他们使用其他电子表格并使用“导出为 Excel”功能进行导出,这可以解释为什么 PHPSpreadsheet 无法将其识别为任何可能的有效 excel 格式。

在这种情况下,根据电子表格中的内容,可能值得要求他们将电子表格导出为csv(逗号分隔值)文件,因为这是一种简单的格式,应该是有效的输出.然后,您可以使用fgetcsv() 函数调用来阅读它,而不必使用 PHPSpreadsheet。

【讨论】:

没错!他们是从系统中导出的,而不是从 excel 本身中导出的!谢谢! 从系统而不是 excel 导出如何导致格式无法识别?我遇到了这个问题,但在我的情况下,它是在 Excel 中创建的 xlsx 文件。 @Arya xlsx 与 xls 完全不同... xlsx 它是纯 xml 并且您不需要 excel 库,您可以在任何代码编辑器中打开它并理解它... xls是专有的,所以你需要它们......在这种情况下,lib 似乎以 excel 本身识别它的方式创建文件,但其他 lib 不...... 我是unable to read excel file【参考方案3】:

尝试删除此语句

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

并用这个来改变它

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

【讨论】:

我是unable to read excel file你能查一下吗【参考方案4】:

这里的问题是在加载文件后将其转换为数组

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

【讨论】:

以上是关于使用 PhpSpreadsheet 在 PHP 中读取 XLS的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用 PhpSpreadsheet

如何在php phpspreadsheet中使用excel sum公式?

PHP7 学习笔记PHPExcel vs PhpSpreadsheet and PHP_XLSXWriter

如何使用 PHPSpreadsheet 在 Excel 上添加新行

php读写excel —— PhpSpreadsheet组件

PHPSpreadsheet - 如何创建一个额外的选项卡?