infostreams / excel-merge
一个PHP库,可以将两个或多个Excel文件合并成一个
This package is not auto-updated.
Last update: 2024-09-20 14:15:00 UTC
README
将两个或更多Excel文件合并为一个文件,同时保持格式、公式、VBA代码和条件样式不变。此软件与Excel 2007 (.xlsx和.xlsm)文件兼容,并且只能生成Excel 2007文件作为输出。不幸的是,不支持较老的.xls格式,但在必要时可以解决这个问题。
这是一个设计为作为更大软件部分使用的软件库。它不能单独作为独立软件使用。
安装
使用composer
php composer.phar require infostreams/excel-merge
使用
此软件的最基本使用方法如下所示
<?php
require("vendor/autoload.php");
$files = array("sheet_with_vba_code.xlsm", "generated_file.xlsx", "tmp/third_file.xlsx");
$merged = new ExcelMerge\ExcelMerge($files);
$merged->download("my-filename.xlsm");
// or
$filename = $merged->save("my-directory/my-filename.xlsm");
?>
存在原因和用例
此库仅存在一个原因:为了绕过其他方面出色的PHPExcel库的巨大内存需求。我必须将一个包含大约10个工作表(其中一些相对较大)的数据库内容导出为Excel文件,而PHPExcel在生成约2或3个工作表后就很快耗尽了内存,即使我已经将PHP内存限制增加到256和512 Mb。我没有做任何特别的事情,当然也不是唯一遇到这个问题的人。
在这种情况下,我可以选择使用不同的Excel库来生成导出,我确实这样做了,但这些库不允许我在导出文件中使用VBA代码,并且不会识别我需要的某些Excel公式。PHPExcel允许我做这些事情,但是由于它坚持在生成输出文件之前在内存中保留所有工作表的完整心理模型,所以它耗尽了内存。这对于PHPExcel来说是有道理的,但不符合我的用例。
因此,我决定通过使用它来生成并写入所有工作表作为单独的Excel文件,然后编写一些代码将这些Excel文件合并为一个。
它是如何工作的
此库不是试图在内存中保留整个Excel文件的心理模型,而是直接在Excel2007文件内部的XML文件上操作。库实际上并不理解这些XML文件,它只知道需要将哪些文件复制到哪个位置,以及如何修改XML以将一个Excel文件的一张工作表添加到另一张工作表中。
这意味着它将使用的最多内存直接与您最大的工作表大小相关。
结果
我必须生成一个包含11个相对较大的工作表的Excel文件(其中两到三个工作表有大约2000行)。PHPExcel生成这个文件花费了超过30分钟和超过512 Mb的内存,然后我中止了进程。使用此库,我可以在28.2秒内生成相同的导出,峰值内存使用为67 Mb。
对“原生”Excel文件的支持
我已经尝试合并由Excel本身生成的文件,但不知何故失败了。我通过使用PHPExcel加载文件并将其作为新的Excel2007文件写入,然后合并它来解决这个问题。如果你找到了失败的原因:欢迎提交pull requests。
对.xls文件以及Libre/OpenOffice Calc和Gnumeric的支持
您可以通过使用PHPExcel读取文件并将其作为临时Excel2007文件写入来合并.xls文件或任何PHPExcel支持的导入格式。然后,您合并临时Excel2007文件而不是原始文件。
要求
这个库广泛使用了DOMDocument和DOMXPath。它们在PHP5中默认安装和可用。如果它们没有安装,请检查这里。
最低PHP版本可能是v5.3。