为性能而生,PHP Excel 扩展 xlswriter 1.3.3 发布!

为性能而生,PHP Excel 扩展 1.3.3 发布!

xlswriter是一个 PHP C 扩展,可用于在 Excel 2007+ XLSX 文件中读取数据,插入多个工作表,写入文本、数字、公式、日期、图表、图片和超链接。

它具备以下特性:

一、写入
  • 100%兼容的Excel XLSX文件
  • 完整的Excel格式
  • 合并单元格
  • 定义工作表名称
  • 过滤器
  • 图表
  • 数据验证和下拉列表
  • 工作表PNG/JPEG图像
  • 用于写入大文件的内存优化模式
  • 适用于Linux,FreeBSD,OpenBSD,OS X,Windows
  • 编译为32位和64位
  • FreeBSD许可证
  • 唯一的依赖是zlib
二、读取
  • 完整读取数据
  • 光标读取数据
  • 按数据类型读取
  • xlsx 转 CSV

基准测试

测试环境: Macbook Pro 13 inch, Intel Core i5, 16GB 2133MHz LPDDR3 Memory, 128GB SSD Storage.

导出

两种内存模式导出100万行数据(每行27列,数据类型均为字符串,单个字符串长度为19)

  • 普通模式:耗时 29S,内存只需 2083MB
  • 固定内存模式:仅需 52S,内存仅需 <1MB
导入

100万行数据(单行1列,数据类型为INT)

  • 全量模式:耗时 3S,内存仅 558MB
  • 游标模式:耗时 2.8S,内存仅 <1MB

XLSX 转 CSV 【常规模式】

应用场景

  • 较多的 xlsx 文件碎片,合并为单一CSV文件,统一处理;
  • xlsx文件新增的速度大于任务处理速度,可异步将文件转为CSV后,使用更高效的工具处理(例如:数据库工具直接导入CSV);

示例

demo.php

$excel = new \Vtiful\Kernel\Excel(['path' => './tests']);

$filePath = $excel->fileName('tutorial.xlsx', 'TestSheet1')
    ->header(['String', 'Int', 'Double'])
    ->data([
        ['Item_1', 10, 10.9999995],
    ])
    ->output();

// 写入方式打开,将文件指针指向文件末尾。
$fp = fopen('./tests/file.csv', 'a');

// 将 xlsx 文件写入 CSV
$resultBoolOne = $excel->openFile('tutorial.xlsx')
    ->openSheet()
    ->putCSV($fp);

// 将 xlsx 文件追加写入 CSV
$resultBoolTwo = $excel->openFile('tutorial.xlsx')
    ->openSheet()
    ->putCSV($fp);

file.csv

String,Int,Double
Item_1,10,10.9999995
String,Int,Double
Item_1,10,10.9999995

xlsx 转 CSV 【回调模式】

应用场景与常规模式类似,不同之处在于上层业务可以在回调函数中加工数据,将xlsx中的数据过滤加工并写入csv。

仓库地址

Github:https://github.com/viest/php-ext-excel-exp...

Gitee:https://gitee.com/viest/php-ext-xlswriter

PECL:https://pecl.php.net/package/xlswriter

文档

https://xlswriter-docs.viest.me

End

最后的最后请不要忘记 star

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 10个月前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 9
wanghan

给巨佬递茶

10个月前 评论

xlsx 文件可以追加写吗?

8个月前 评论
viest (楼主) 7个月前
EmptyCup (作者) 7个月前
viest (楼主) 7个月前

@vikin 请教一个问题,我有一个 excel 文件,文件比较大,不想要全量读取,游标读取比较理想,但是前n行和后m行我不想要,请问游标读取模式下有跳过几行的功能吗?

类似:

$excel->skipRow($m); //  跳过前 $m 行

$excel->subRows($start, $end); //  取中间部分数据
7个月前 评论
viest (楼主) 7个月前
di-gua 6个月前

实际上我是在做一个导入的功能,用户操作流程如下:

  1. 用户选择 excel 文件上传,文件通常较大,数据量在几十万条以上
  2. 如果总行数大于12行,就取前6行,和最后6行传回浏览器
  3. 用户选择开始行和结束行
  4. 用户选择每列对应的数据模型的字段,如 excel 里的姓名列对应 Username
  5. 后台开始遍历文件,创建或更新 User 实例
7个月前 评论

导出的时候 表头和数据绑定么

$header = ['id'=>'ID','name'=>'姓名']
$data = [
['id'=>1,'name'=>'name1'],
['id'=>2,'name'=>'name2'],
];

$filePath = $excel->fileName('tutorial.xlsx', 'TestSheet1')
    ->header($header)
    ->data($data)
    ->output();
7个月前 评论
viest (楼主) 7个月前
marun

请问支持swoole下使用么

7个月前 评论
viest (楼主) 7个月前

@vikin 大佬,这样使用对么? file

6个月前 评论
di-gua 6个月前
EmptyCup (作者) 6个月前
di-gua 6个月前
di-gua 6个月前

@viest

Laravel
大佬 麻烦问下在 Ubuntu 16.04.6 下执行 pecl install xlswriter 安装完成后 出现这个是什么原因 麻烦帮忙看看

3个月前 评论
viest (楼主) 3个月前
xuri

推荐一个功能丰富、兼容性好、高性能的 Excel 文档基础库:github.com/xuri/excelize

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!