前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP高效、轻量级表格数据处理库 OpenSpout

PHP高效、轻量级表格数据处理库 OpenSpout

作者头像
Tinywan
发布2024-11-21 18:39:00
发布2024-11-21 18:39:00
44100
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

概述

OpenSpout是一个由社区驱动的PHP库,它是对著名项目box/spout的一个fork,专为高效读取和写入CSV、XLSX以及ODS格式的电子表格文件而设计。无论你的文件大小如何,OpenSpout都能保证在低内存占用(小于3MB)的情况下进行快速且可扩展的操作。

特性

OpenSpout的核心特性在于其优化的内存管理和分块处理机制。它避免了一次性加载整个文件到内存中,而是逐行处理数据,这使得即使面对大型文件也能游刃有余。此外,OpenSpout支持多线程并行处理,进一步提升了性能。这个库采用面向对象的设计,易于集成到任何PHP项目中,并提供了丰富的API供开发者自定义处理逻辑。

功能

  • 高效的内存管理:即使处理超大文件,也只需极小的内存资源。
  • 兼容多种格式:支持CSV、XLSX和ODS,满足不同的文件格式需求。
  • 良好的扩展性:通过自定义writer和reader,轻松扩展功能。
  • 线程安全:支持多线程,提升大数据处理速度。
  • 清晰的API:易于学习和集成,降低开发难度。
  • 活跃的社区支持:持续更新和维护,有任何问题,社区会提供及时的帮助。

应用场景

  • 大数据处理:对于需要从大量CSV或Excel文件中提取信息的数据科学家和分析师来说,OpenSpout是理想的选择。
  • 报表生成:如果你正在构建一个系统,需要将数据库中的数据导出为表格格式,OpenSpout可以轻松实现批量生成报表。
  • 数据迁移:在不同平台间迁移大量数据时,OpenSpout能帮助你高效地转换和导入数据。
  • 数据分析服务:结合其他PHP数据分析库,OpenSpout可以构建起强大的数据分析服务。

安装

使用Composer进行安装

代码语言:javascript
代码运行次数:0
运行
复制
composer require openspout/openspout

基础使用

读取CSV文件

代码语言:javascript
代码运行次数:0
运行
复制
<?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();

执行输出

代码语言:javascript
代码运行次数:0
运行
复制
  ...
  [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"
  }
  ...

写入 Xlsx

代码语言:javascript
代码运行次数:0
运行
复制
<?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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 特性
  • 功能
  • 应用场景
  • 安装
  • 基础使用
    • 读取CSV文件
    • 写入 Xlsx
  • 读写性能
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档