Download the PHP package yzh0325/xlswrite without Composer
On this page you can find all versions of the php package yzh0325/xlswrite. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download yzh0325/xlswrite
More information about yzh0325/xlswrite
Files in yzh0325/xlswrite
Package xlswrite
Short Description xlswrite excle export and import ,WebSocket client and server
License proprietary
Informations about the package xlswrite
xlswriter+yield+websocket
这是一个基于xlswriter+yield高性能操作excel/csv的库,集成了websocket用于excel操作时的进度推送。
本类继承自xlswriter扩展, 重新封装了一些常用的方法,同时保持基类的用法。
xlswriter文档https://xlswriter-docs.viest.me/
源码:https://github.com/yzh0325/xlswrite
为何要使用xlswriter操作excel?
由于内存原因,PHPExcel数据量相对较大
的情况下无法正常工作,虽然可以通过修改memory_limit
配置来解决内存问题,但完成工作的时间可能会更长;xlswriter是一个 PHP C 扩展,可以更高效的读写excel.
yield的作用是什么呢?
当需要导出大量数据的时候,性能瓶颈会在数据库查询和内存上面,这时候应该分段获取数据,将获取到的数据放入yield生成器,遍历生成器获取数据循环写入excel,这样就可以避免从数据库读取大量数据一次性加载到内存而消耗了大量的内存。使用yield分段获取大量数据,可以大大的节省内存,提高服务器性能。
目录
- 功能特性
- 安装
- installing
- 安装xlswrite扩展
- WebSocket
- examples
- excel导出
- 导出excel快速上手
- excel导出的两种模式
- 下载excel文件
- 设置字段&表格头
- 样式设置
- 自适应单元格列宽
- 批量数据插入
- 单元格
- 插入文字
- 插入链接
- 插入超链接(insertText+insertUrl)
- 合并单元格
- 动态合并单元格
- 通用合并demo
- 订单类型合并demo
- 使用WebSocket推送excel处理进度
- excel读取
- 游标读取excel分段写入数据库
- excel导出
功能特性
- 高性能读写百万级别的excel数据
- 支持动态合并单元格
- 字段定义和过滤
- excel处理进度条
- 支持 Excel 2007+ xlsx 文件
- 支持csv文件读写
Installing
安装xlswriter扩展
- php>=7.0
- windows环境下 php>=7.2 ,xlswriter版本号大于等于 1.3.4.1 安装帮助
WebSocket
- 服务端采用swoole搭建,需要安装swoole扩展 swoole>=4.4.*,需在cli模式下运行
- 客户端采用textalk/websocket的client作为websocket客户端,可在php-fpm模式下运行
excel导出
可根据创建的文件名后缀自动导出xlsx文件和csv文件
导出excel快速上手
excel导出的两种模式
导出-固定内存模式
最大内存使用量 = 最大一行的数据占用量 当开启内存优化模式时,单元格将根据行落地磁盘,如果当前操作的行已落盘则无法进行任何修改(比如无法进行合并单元格操作,样式设置等),内存中只保留最新一行数据,所以内存优化模式最大内存占用等于数据最多一行的内存.
导出-普通模式
导出速度更快,但内存开销比固定内存模式更大
下载excel文件
可以设置文件下载完成后是否自动删除原文件,download方法参数二默认值为true自动删除原文件。
函数原型
示例
设置字段&表格头
通过field()可以进行字段的定义&表格头的设置,使用header()定义的表格头会覆盖field()定义的表格头;
使用field()定义字段后在使用setGeneralData()和setOrderData()时会进行字段的过滤,设置了回调的方法还会调用字段的回调方法,进行字段的格式化处理等操作。但并不推荐设置字段的回调,因为效率不高,可以在传入数据的时候就处理好字段的值。推荐使field()设置表格头,设置过field才支持动态单元格行合并。
函数原型
示例
自适应单元格列宽
函数原型
示例
样式设置
支持的样式如下:
样式相关常量
样式设置的相关方法
示例
注意:设置行与行/列与列样式 交集范围会覆盖;行样式优先于列样式;全局默认样式不会被覆盖,谨慎使用
批量数据插入
通过回调生成器方法,逐行插入数据(一般通用数据)
通过回调生成器方法,逐行插入数据(订单类型数据)
逐行逐列插入数据,按单元格循环插入(可以区分文本插入和超链接插入,这种方式插入的数据,后面无法通过批量设置样式)
批量插入数据(setGeneralData和setOrderData都是基于它来实现的)
单元格
插入文字
函数原型
示例
数字样式示例
更多样式请参考 Excel 微软文档
插入链接
函数原型
示例
插入超链接(insertText+insertUrl)
示例 注意:insertUrl和insertText的顺序不能写反了 insertText会覆盖insertUrl写入的文本内容,同时会保持insertUrl的超链接
合并单元格
函数原型
示例
更多单元格操作见xlswriter
动态合并单元格
- 通用合并,根据数据的值比较 自动进行 行合并(调用方法时需要指定要自动合并的字段,才会根据字段值进行自动合并)
优点:数据层不需要怎么处理,将数据库查询出来的二维数组直接传入即可。
缺点:无法满足像订单一样的 存在多个订单时间值是一样的,合并就会存在问题。
- 订单类型合并,将原始数据处理成指定的数据格式在传入此类自动进行 行合并(调用方法时需要指定要自动合并的字段,才会根据字段值进行自动合并)
优点:根据传入的数据格式进行合并,合并更加精准不会存在问题。
缺点:对数据格式有要求,在数据层需要处理成指定的数据格式,数据格式如下:
字段数量,名称没有限制,只支持一个item(也可以叫其他名字)二维数组,item数组里面的个数没有限制。 当数据字段的值能明显区分时推荐使用通用合并,当数据字段的值不能明显区分时(如:时间字段)推荐订单类型的合并
通用合并demo
函数原型
示例
订单类型合并demo
函数原型
示例
使用WebSocket推送excel处理进度
实现过程:前端与websocket服务器先建立连接,连接建立好之后服务端会发送一条消息 {'status' => 'onopen', 'fd' => $request->fd}, 前端将fd保存起来,在请求处理excel接口时将fd参数传给后台,后台在推送进度消息时将fd参数封装到消息体里在发送给websocket服务器 ,websocket服务器根据fd参数在推送消息给指定的前端,这就完成了web前端、websocket服务器、应用后端之间的数据交互。
- 前端首次连接时websocket服务器发送的消息体结构:['status' => 'onopen', 'fd' => 1]
- 处理过程中websocket服务器发送的消息体结构:['status' => 'processing', 'process' => 100, 'fd'=>1]
前端可根据status状态进行相应的处理,status = onopen 时保存fd,status = processing 时进行进度条渲染。
配置: WebSocket服务端默认使用9502端口,可自行修改./src/WebSocket/WebsocketServer的 CONST PORT = 9502
WebSocketClient使用:
处理excel时自动发送消息(在推送信息失败时不会影响、终止代码的执行,会生成相应的日志文件,日志文件存放于实例化Pxlswrite所设置的路径下的log目录,日志文件按日期存放)
示例
1.开启websocket 服务端
2.web前端实现demo
3.后端处理excel 并调用 WebSocketClient 推送消息
excel读取
可读取xlsx文件和csv文件
游标读取excel分段写入数据库
函数原型
示例
更多使用方法见 xlswrite
examples
见 examples/
- xlswrite_demo.html 前端demo
- export_demo.php excel导出demo
- import_demo.php excel导入demo