OpenSpout是一个由社区驱动的PHP库,它是对著名项目box/spout的一个fork,专为高效读取和写入CSV、XLSX以及ODS格式的电子表格文件而设计。无论你的文件大小如何,OpenSpout都能保证在低内存占用(小于3MB)的情况下进行快速且可扩展的操作。
OpenSpout的核心特性在于其优化的内存管理和分块处理机制。它避免了一次性加载整个文件到内存中,而是逐行处理数据,这使得即使面对大型文件也能游刃有余。此外,OpenSpout支持多线程并行处理,进一步提升了性能。这个库采用面向对象的设计,易于集成到任何PHP项目中,并提供了丰富的API供开发者自定义处理逻辑。
使用Composer进行安装
composer require openspout/openspout
<?php
/**
* @desc 读取CSV文件
* @author Tinywan(ShaoBo Wan)
*/
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use OpenSpout\Reader\CSV\Reader;
use OpenSpout\Reader\CSV\Options;
$options = new Options();
$options->FIELD_DELIMITER = ',';
$options->FIELD_ENCLOSURE = '@';
$reader = new Reader($options);
$filePath = './order_list_table.csv';
$reader->open($filePath);
$list = [];
foreach ($reader->getSheetIterator() as $sheet) {
foreach ($sheet->getRowIterator() as $row) {
$cells = $row->getCells();
$list[] = [
'订单号' => $cells[0]->getValue(),
'资源购买账号id' => $cells[1]->getValue(),
'商品名称' => $cells[2]->getValue(),
'订单类型' => $cells[3]->getValue(),
'付费方式' => $cells[4]->getValue(),
'创建时间' => $cells[5]->getValue(),
];
}
}
var_dump($list);
$reader->close();
执行输出
...
[102] =>
array(4) {
'商品名称' =>
string(23) "云服务器ECS(包月)"
'订单类型' =>
string(6) "退款"
'付费方式' =>
string(9) "预付费"
'创建时间' =>
string(19) "2024-05-20 10:38:34"
}
[103] =>
array(4) {
'商品名称' =>
string(12) "DAS专业版"
'订单类型' =>
string(6) "续费"
'付费方式' =>
string(9) "预付费"
'创建时间' =>
string(19) "2024-04-23 09:30:56"
}
...
<?php
/**
* @desc demo01.php 描述信息
* @author Tinywan(ShaoBo Wan)
* @date 2024/10/13 17:29
*/
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use \OpenSpout\Writer\XLSX\Writer;
use OpenSpout\Common\Entity\Row;
use OpenSpout\Common\Entity\Cell;
$writer = new Writer();
$filePath = './开源技术小栈.xlsx';
$writer->openToFile($filePath);
$cells = [
Cell::fromValue('公众号'),
Cell::fromValue('开源技术小栈'),
Cell::fromValue('作者'),
Cell::fromValue('Tinywan'),
];
/** 同一时间添加多行 */
$multipleRows = [
new Row($cells),
new Row($cells),
new Row($cells),
new Row($cells),
new Row($cells),
];
$writer->addRows($multipleRows);
$values = ['公众号', '开源技术小栈', '作者', 'Tinywan'];
$rowFromValues = Row::fromValues($values);
$writer->addRow($rowFromValues);
$writer->close();
写入参考
Type | Action | 2,000 rows (6,000 cells) | 200,000 rows (600,000 cells) | 2,000,000 rows (6,000,000 cells) |
---|---|---|---|---|
CSV | Read | < 1 second | 4 seconds | 2-3 minutes |
Write | < 1 second | 2 seconds | 2-3 minutes | |
XLSX | Readinline strings | < 1 second | 35-40 seconds | 18-20 minutes |
Readshared strings | 1 second | 1-2 minutes | 35-40 minutes | |
Write | 1 second | 20-25 seconds | 8-10 minutes | |
ODS | Read | 1 second | 1-2 minutes | 5-6 minutes |
Write | < 1 second | 35-40 seconds | 5-6 minutes |