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

Posted

技术标签:

【中文标题】PHPExcel 和 PhpSpreadsheet 之间的主要区别是啥?【英文标题】:What are the main differences between PHPExcel and PhpSpreadsheet?PHPExcel 和 PhpSpreadsheet 之间的主要区别是什么? 【发布时间】:2017-04-28 07:36:34 【问题描述】:

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

PHPExcel

PHPExcel 是一个用纯 PHP 编写的库,并提供一组类,允许您写入和读取不同的电子表格文件格式,如 Excel (BIFF) .xls、Excel 2007 (OfficeOpenXML) .xlsx、CSV、Libre /OpenOffice Calc .ods, Gnumeric, PDF, html, ... 这个项目是围绕微软的 OpenXML 标准和 PHP 构建的。

PhpSpreadsheets

PhpSpreadsheet 是一个用纯 PHP 编写的库,它提供了一组类,允许您读取和写入不同的电子表格文件格式,例如 Excel 和 LibreOffice Calc。

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

【问题讨论】:

【参考方案1】:

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

PHPSpreadsheet 是 PHPExcel 的最新版本,它的大部分内容已被重写以利用 PHP 的新功能。在保留 PHPExcel 的所有功能的同时,它要求最低 PHP 版本为 5.5(很快该版本将降至最低 5.6)。

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

2020 年编辑:

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

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

【讨论】:

很高兴知道 phpexcel 中的 1,0 列混淆不再在 phpspreadsheet 中找到! 所以@mark 如果我目前正在使用 phpexcel,并且现在想安装 phpspreadsheet(因为不再维护 phpexcel),我是否必须对我的项目进行任何更改? @natral - 对你来说可能有点晚了,但它可能对其他人有所帮助 - phpspreadsheet.readthedocs.io/en/develop/topics/… 有一个迁移指南@ 只是作为一个小评论,上面的迁移链接已经死了,现在已经死了。 @Chris Wheeler 这是迁移的新链接:phpspreadsheet.readthedocs.io/en/latest/topics/…【参考方案2】:

除了上面的Mark Baker's 答案之外,还有许多关于如何使用新的 PhpSpreadsheet 库的架构和语法更改。

首先,请注意其中包含的迁移工具可以执行许多 PhpExcel 到 PhpSpreadsheet 你。

变更的非详尽摘要:

(1) 最重要的变化:PhpSpreadsheet 依赖于安装的Composer。

在 node 的 npm 和 ruby​​ 的 bundler 的强烈启发下,Composer 不是一个与 Yum 或 Apt 相同的包管理器。虽然它确实处理“包”和/或库,但它是一个更纯粹的依赖管理器,因为它管理每个项目的依赖关系,将它们安装在项目内的目录(通常名为“供应商”)中。默认情况下,它不会全局安装任何东西。 (不过,为了方便起见,它确实通过 global 命令支持“全局”项目。)

可以在没有 Composer 的情况下使用 PhpSpreadsheet,这里是 some thoughts on how to do that。这是同一主题的more thoughts direct from the mavens。

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

(2) 引入了命名空间

PhpSpreadsheet 的代码方面也从 PhpExcel 开始发展。虽然 PhpExcel 的入口点类 - Classes/PHPExcel.php - 反映了它的同名,但 PhpSpreadsheet 在供应商目录的根目录中包含 autoload.php 文件。它还利用一些命名空间来简化编码:

<?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) 其他更改/弃用:

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

(7) PHPExcel_Autoloader 类被完全移除,取而代之的是 composer 自动加载机制。

(8) PDF 库必须通过 composer 安装。 PHPExcel_Settings::get/setPdfRenderer() 方法已被删除,取而代之的是 IOFactory::registerWriter()。

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

(10) 放弃了对 PclZip 的支持,取而代之的是更完整和更现代的 PHP 扩展 ZipArchive。对这些类进行了如此多的更改。

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

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

(13) 将PHPExcel_Cell 中的坐标操作方法提取到专用的新类\PhpOffice\PhpSpreadsheet\Cell\Coordinate。方法包括:

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

(14) 列索引现在基于 1。所以列 A 是索引 1。这与从 1 开始的行和为列 A 返回 1 的 Excel 函数 COLUMN() 一致。

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

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

$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

【讨论】:

以上是关于PHPExcel 和 PhpSpreadsheet 之间的主要区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PHP7 学习笔记PHPExcel vs PhpSpreadsheet and PHP_XLSXWriter

PHPSpreadsheet - “PHPExcel_Worksheet_Drawing”在哪里

如何在不安装的情况下使用 PhpSpreadsheet(如 PHPExcel)

PhpSpreadsheet中文false

PhpSpreadsheet的简单使用

phpoffice/phpspreadsheet对Excel导入导出操作