为性能而生,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 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 30
wanghan

给巨佬递茶

4年前 评论

xlsx 文件可以追加写吗?

4年前 评论
viest (楼主) 4年前
EmptyCup (作者) 4年前
viest (楼主) 4年前

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

类似:

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

$excel->subRows($start, $end); //  取中间部分数据
4年前 评论
viest (楼主) 4年前
JerryBool 4年前

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

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

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

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

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

请问支持swoole下使用么

4年前 评论
viest (楼主) 4年前

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

4年前 评论
JerryBool 4年前
EmptyCup (作者) 4年前
JerryBool 4年前
JerryBool 4年前

@viest

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

3年前 评论
viest (楼主) 3年前
xuri

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

3年前 评论

请问Windows下 上传导入 path 需要如何设置?

3年前 评论
yotoai (作者) 3年前

普通模式可以导出 挺快的 但是用文档里的固定内存模式导出的是无法打开 打开提示要修复。。。这是啥情况 有大神解答下么? 就是文档里面的示例 复制出来的

2年前 评论
viest (楼主) 2年前
kenvent (作者) 2年前
viest (楼主) 2年前

忽略空行有问题,老板,已提issue

1年前 评论

这个只能读取本地文件吗

1年前 评论

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