PHPExcel 和 PhpSpreadsheet 之间的主要区别是什么?

What are the main differences between PHPExcel and PhpSpreadsheet?

PHPOffice 的项目中,有两个与电子表格文件格式相关的项目:

PHPExcel

PHPExcel is a library written in pure PHP and providing a set of classes that allow you to write to and read from different spreadsheet file formats, like Excel (BIFF) .xls, Excel 2007 (OfficeOpenXML) .xlsx, CSV, Libre/OpenOffice Calc .ods, Gnumeric, PDF, HTML, ... This project is built around Microsoft's OpenXML standard and PHP.

PhpSpreadsheets

PhpSpreadsheet is a library written in pure PHP and providing a set of classes that allow you to read from and to write to different spreadsheet file formats, like Excel and LibreOffice Calc.

它们之间的主要区别是什么?

PHPExcel 多年来一直作为处理电子表格文件的库进行维护,并且由于保留对旧版本 PHP 的支持而受到束缚(>= 5.2) 使其很难向前推进和改进。它是一个稳定的库,但不会进一步开发。

PHPSpreadsheet 是 PHPExcel 的最新版本,其中大部分内容已被重写以利用 PHP 的新功能。在保留 PHPExcel 的所有功能的同时,它需要至少 PHP 5.5 版本(很快将被删除,至少需要 5.6)。

库名称的更改是为了反映它不仅限于 Excel 电子表格;但支持范围更广的电子表格文件格式。

2020 年编辑:

PHP Excel 于 2017 年正式弃用,并于 2019 年永久存档。

PHP Excel多年未维护,不得再使用。 所有用户都必须迁移到其直接继承者 PhpSpreadsheet 或其他 替代方案。

除了上面的 Mark Baker's 回答之外,新的 Php 电子表格库的使用方式在架构和句法上有许多变化。

首先,请注意有一个包含的迁移工具可以执行许多 PhpExcel -to- Php电子表格 语法更改。

非详尽的变更摘要:

(1) 最重要的变化:Php电子表格依赖于 Composer 安装。

Strongly inspired by node's npm and ruby's bundler, Composer is not a package manager in the same sense as Yum or Apt. Although it does deal with "packages" and/or libraries, it is a more pure dependency manager, as it manages dependencies on a per-project basis, installing them in a directory (usually named "vendor") inside your project. By default, it does not install anything globally. (It does however support a "global" project for convenience via the global command.)

可以在没有 Composer 的情况下使用 Php电子表格,这里有关于同一主题的 . Here are more thoughts direct from the mavens

FWIW,我打开了一张工单 with my webhost 并在 10 分钟内收到回复说 Composer 已安装在我们的共享主机上(绿色计划,对于那些想知道的人)。并不是说您会有同样的好运,但轶事信息也许会有所帮助。值得一试您的虚拟主机。

(2) 引入了命名空间

The code side of PhpSpreadsheet has evolved since PhpExcel as well. Whereas the entry point class of PhpExcel - Classes/PHPExcel.php - reflected its namesake, PhpSpreadsheet includes the autoload.php file in the root of the vendor directory. It also utilizes some namespaces to simplify coding:

<?php
   use PhpOffice\PhpSpreadsheet\IOFactory;
   use PhpOffice\PhpSpreadsheet\Spreadsheet;
   require_once 'vendor/autoload.php';

(3) 读者和作者已重命名

(4) Reader/Writer 短名称已显着更改。例如:

'Excel2003XML' ==> 'Xml' *the leading capital letter is mandatory !*
'Excel2007'    ==> 'Xlsx'
'Excel5'       ==> 'Xls'
'HTML'         ==> 'Html'
'CSV'          ==> 'Csv'   etc.

你注意到首字母大写了吗?必填。

(5) 简化了 IOFactory 方法:

PHPExcel_IOFactory::getSearchLocations()  ==> replaced by ==>  IOFactory::registerReader()
PHPExcel_IOFactory::setSearchLocations()  ==> replaced by ==>  IOFactory::registerWriter()
PHPExcel_IOFactory::addSearchLocation()

例如,

\PHPExcel_IOFactory::addSearchLocation($type, $location, $classname);   <=== PhpExcel

\PhpOffice\PhpSpreadsheet\IOFactory::registerReader($type, $classname); <=== PhpSpreadsheet

(6) 其他 Changes/Deprecations:

Worksheet::duplicateStyleArray()
DataType::dataTypeForValue()
Conditional::get/setCondition()
Worksheet::get/setDefaultStyle()
Worksheet::get/setSelectedCell()
Writer\Xls::setTempDir() <==== functionality dropped

(7) class PHPExcel_Autoloader 被完全删除并被 composer 自动加载机制取代。

(8) PDF库必须通过composer安装。 PHPExcel_Settings::get/setPdfRenderer() 方法已被删除并被 IOFactory::registerWriter() 代替。

(9) 在为 HTML 或 PDF 输出呈现图表时,该过程也得到了简化。虽然 JpGraph 支持仍然可用,但不幸的是它不是最新的 PHP 版本,它会生成各种警告。

(10) 放弃了对 PclZip 的支持,转而支持更完整和现代的 PHP 扩展 ZipArchive。对那些 classes.

进行了如此多的更改

(11) 对单元格缓存进行了大量重构以利用 PSR-16。这意味着大多数 class 与该功能相关的内容都已删除。

(12) 用于样式化的数组键已标准化,以获得更连贯的体验。它现在使用与 getter 和 setter

相同的措辞和大小写

(13) PHPExcel_Cell 中操纵坐标的方法被提取到专用的新 class \PhpOffice\PhpSpreadsheet\Cell\Coordinate 中。这些方法包括:

absoluteCoordinate()
absoluteReference()
columnIndexFromString()
coordinateFromString()
buildRange()
... and half-a-dozen more ...

(14) 列索引现在基于 1。因此列 A 是索引 1。这与从 1 开始的行和 Excel 函数 COLUMN() 一致 returns 1 for A 列

(15) 许多方法的默认值在没有意义时被删除。通常,setter 方法不应有默认值。

(16) 删除了有条件返回的单元格...不再可能更改返回值的类型。在诸如 Worksheet::setCellValue()Worksheet::setCellValueExplicit() 等方法中,它总是 returns 工作表而不是单元格或规则。例如:

$cell = $worksheet->setCellValue('A1', 'value', true);  <==== PhpExcel

$cell = $worksheet->getCell('A1')->setValue('value');   <==== PhpSpreadsheet

有关这些更改的更多详细信息,请参阅下面的源文档。

参考文献:

PhpSpreadsheet Docs - Migration From PhpExcel - readthedocs.io

Making the switch from PhpExcel to PhpSpreadsheet 作者:渥太华的 Rob Gravelle