为性能而生,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 协议》,转载必须注明作者和本文链接
本帖由系统于 1年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 12
wanghan

给巨佬递茶

1年前 评论

xlsx 文件可以追加写吗?

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

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

类似:

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

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

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

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

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

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

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

请问支持swoole下使用么

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

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

1年前 评论
di-gua 1年前
EmptyCup (作者) 1年前
di-gua 1年前
di-gua 1年前

@viest

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

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

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

1年前 评论

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

7个月前 评论
yotoai (作者) 7个月前

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

1个月前 评论
viest (楼主) 1个月前
Adminwj (作者) 1个月前
viest (楼主) 1个月前

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