27

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

PHPExcel

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

Php电子表格

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

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

4

2 回答 2

48

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

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

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

编辑 2020:

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

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

于 2016-12-13T09:56:01.070 回答
8

除了上述Mark Ba​​ker 的回答之外,新的 PhpSpreadsheet 库的使用方式在架构和语法上都有很多变化。

首先,请注意,其中包含一个迁移工具,可以为您执行许多 PhpExcel 到 PhpSpreadsheet 的语法更改。

 

变更的非详尽摘要:

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

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

可以在没有 Composer 的情况下使用 PhpSpreadsheet,这里有一些关于如何做到这一点的想法。这里有更多来自专家对同一主题的直接想法。

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

(2) 引入命名空间

自 PhpExcel 以来,PhpSpreadsheet 的代码方面也有所发展。虽然 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) Dropped 有条件返回的单元格...不再可以更改返回值的类型。它总是返回工作表,而不是单元格或规则,在方法中,例如:Worksheet::setCellValue()Worksheet::setCellValueExplicit()等。例如:

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

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

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

参考:

PhpSpreadsheet 文档 - 从 PhpExcel 迁移- readthedocs.io

渥太华的 Rob Gravelle从 PhpExcel 切换到 PhpSpreadsheet

于 2018-12-16T22:10:26.493 回答