php 读取excle的几种方法 比较

上周,我朋友的公司需要处理大量的Excel文件。
他尝试了PHPExcel,发现有点卡住,因为PHPExcel不再维护了。
然后我转向 PhpSpreadsheet。
这个图书馆真的很好。
读写Excel文件很流畅。
它经常更新并得到社区的大力支持。
2 02 3 年,她帮他测试了。
他上传了一个超过 1 000 行的 Excel 文件,PhpSpreadsheet 处理得非常快。
不过,有人提到,对于非常复杂的 Excel 文件,PHP 内置的 fgetcsv() 函数还是有点不够用。
我建议他尝试一个第三方 PHPExcelWrapper 库,但他说他还没有找到合适的库,算了,你只需要弄清楚就可以了。
我刚刚想到的另一件事是,它也使用 CSV 文件吗? PHP 内置函数在这方面是如何工作的?

如何用PHP高效对比两个Excel文件并显示差异?

说实话,我以前帮朋友做过一次,当时我对Excel格式真的很困惑。
不过,一旦熟悉了PHPOffice/PhpSpreadsheet库,效率确实是相当高的。

看看版本管理的第一步,其实还是蛮关键的。
我建议他们使用 shell 脚本自动将文件复制到服务器,并在上传每个新文件之前制作一个副本。
你可以在代码中这样写:
php // 跟踪版本历史并在每次上传前自动备份 函数 backupExcel($filePath) { $backupPath = 目录名($filePath) 。
'/备份/' 。
日期('Y-m-d_H-i-s') 。
'_'。
基本名称 ($filePath); if (!file_exists(目录名($backupPath))) { mkdir(目录名($backupPath), 07 7 7 , true); } 复制($filePath,$backupPath); 返回$backupPath;
这样可以避免简单的错误,例如忘记复制。
说实话,有时候程序员写完代码后忘记测试备份路径是否正确,哈哈。

第二步是读取数据。
您编写的代码的基本部分是正确的,但有一个小细节您应该注意。
例如,使用PhpSpreadsheet读取数据时,默认为只读模式,对于大文件表现良好,但在编辑单元格时应切换到写入模式。
我在处理2 00MB的Excel时就踩过这个坑。

PHP $reader = IOFactory::createReader('Xlsx'); $reader->setReadDataOnly(true); // 这是默认提供的,但为了安全起见可以明确设置。
$spreadsheet = $reader->load($filePath);
第三步递归比较,你写的逻辑很清晰了。
不过,有一个优化建议。
对于纯数值比较,您可以添加精度检查。
例如,在金额字段中,0.1 元和 0.1 0001 元是否视为相同?
PHP 函数compareValues($oldValue,$newValue,$ precision = 0.0001 ){ if (is_numeric($oldValue) && is_numeric($newValue)) { 返回abs($oldValue
$newValue) < $ precision; } 返回 $oldValue === $newValue;
我在之前的项目中使用了这个功能,将差异数量从 5 00 减少到 2 00,这是相当令人惊讶的。

第四步呈现结果。
HTML 解决方案简单明了,而 Excel 解决方案则更加智能。
例如,以红色突出显示更改单元格,您甚至可以添加“单击以展开详细信息”交互。
但请注意,Excel 样式渲染在较旧的浏览器中可能会出现问题。

PHP // 条件格式在 Excel 中更高级 $cellStyle = $cell->getStyle(); $cellStyle->getFont()->setBold(true); $cellStyle->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID); $cellStyle->getFill()->getStartColor()->setRGB('FF0000');
在第五个优化步骤中,您提到的分块读取非常有用。
上次我处理一个包含 1 0,000 行数据的 Excel 文件时,我直接加载整个文件,CPU 飙升至 1 00%。
最后,我切换到逐行读取并添加了行计数器,这显着提高了性能。

PHP $handle = fopen($filePath, 'r'); $块大小= 5 000; $计数器= 0; while (!feof($handle)) { $chunk = fread($handle, $chunkSize 1 02 4 ); // 处理块... $counter += substr_count($piece, "\n"); } fclose($handle);
其实我最担心的是这是一个格式问题。
有一次,朋友把.xlsx改成.zip直接上传,结果代码崩溃了。
因此,格式检查应该加上生死检查:
php 函数 validateExcelFormat($filePath) { $validExt = ['.xlsx', '.xls']; 返回 to_array(信息扩展名($filePath, PATHINFO_EXTENSION), $validExt);
说实话,这个工作只做几次确实很难。
当时我写完了代码,测试的时候故意改了一个数字。
结果,所有的差异标记都是错误的。
最后我花了半个小时才弄清楚是自动列宽调整出了问题。
因此,测试时应模拟不同的边界条件。

如何用PHP高效地对比两个Excel文件的差异?

关键是使用PHPOffice/PhpSpreadsheet来比较Excel数据的差异。
首先我们来说一下版本管理:重命名少量文件并添加时间戳。
多个文件使用Git,但需要服务器环境。

读取数据:使用Composer加载库并将Excel转换为二维数组。
大文件必须分块读取,否则内存会爆炸。

比较算法:使用两步循环进行逐行、逐列比较。
将差值保存为数组,记录行号、列号、旧值、新值。
您可以自定义它以忽略空单元格或将它们统一转换为字符串。

显示模式:两种选择。
首先是生成一个新的Excel,并用红色背景标记差异。
第二个是提取 HTML 表并用红色背景标记差异。
HTML还可以添加JS交互性。

性能优化:使用ReadFilter分块读取大文件。
如果内存不够,请添加内存限制。
非常大的文件可以由多个进程处理。

代码直接贴在下面。
您必须先运行它才能看到结果。