Download the PHP package aoding9/laravel-xlswriter-export without Composer
On this page you can find all versions of the php package aoding9/laravel-xlswriter-export. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download aoding9/laravel-xlswriter-export
More information about aoding9/laravel-xlswriter-export
Files in aoding9/laravel-xlswriter-export
Package laravel-xlswriter-export
Short Description laravel导出excel(基于xlswriter)
License MIT
Informations about the package laravel-xlswriter-export
简介
laravel扩展:xlswriter导出
之前用了laravel-excel做数据导出,很耗内存速度也慢,数据量大的时候内存占用容易达到php上限,或者响应超时,换成xlswriter这个扩展来做。
由于直接导出的表格不太美观,经常需要进行合并单元格和自定义表格样式等操作,我对此进行了一些封装,使用更加方便直观。
导出时间和内存占用情况
以下测试使用了扩展中的DemoAoding9\Laravel\Xlswriter\Export\Demo\AreaExport
导出areas地区表,有4列,使用分页查询,包括了数据查询的时间。
chunkSize=2000,导出1万条
chunkSize=50000 导出50万条
效果示例
导出类简单示例
自定义组装数据集合(2种方法)
复杂合并及指定单元格样式
安装
首先根据xlswriter文档安装扩展,windows可以下载对应php版本的dll文件,linux可以源码编译安装,或者pecl安装
官方文档:https://xlswriter-docs.viest.me/
修改php.ini后,在phpinfo中确认是否安装成功,然后进行下一步
composer require aoding9/laravel-xlswriter-export
若国内composer镜像安装失败,请设置官方源
composer config repo.packagist composer https://packagist.org
官方源下载慢,国内镜像偶尔出问题可能导致安装失败,也可以把以下代码添加到composer.json,直接从github安装
如果无法访问github,可以将url改为gitee:https://gitee.com/aoding9/laravel-xlswriter-export
配置
在导出类中定义BaseExport的相关属性进行配置,或者在make之后调用相关属性的set方法
使用
1.定义导出类
简单导出
使用预定义的格式进行导出,最少只需定义表头和数据到列的关联,即可导出一个比较美观的表格。
以用户导出为例,首先创建一个UserExport导出类,继承Aoding9\Laravel\Xlswriter\Export\BaseExport
基类,一般放在app\Exports目录下
$header
中,column是列名,按abcd顺序排列,仅作为标识不参与实际导出,列很多时方便一眼看出列名,防止写错位,觉得麻烦不写也可以,width是列宽,name是填充的表头文本。
若要合并表头,需定义最细分的列以指明每一列的宽度,合并列在另外的方法中去处理。
/** @var \App\Models\User $row */
告诉编辑器$row可能是User模型,输入$row->
弹出模型的属性提示,需要配合barryvdh/laravel-ide-helper
扩展生成_ide_helper_models.php
文件,方便开发,可用可不用
使用自定义的数组或集合
如果不希望使用查询构造器获取数据,比如从接口获取数据,有2种方式使用自己定义的数据集合。
注意: 如果数据是普通数组或集合,而非ORM模型集合,那么eachRow中不能直接用
$row->id
获取数据,应该使用$row['id']
方式1、将集合或数组传给构造函数,弊端是需要传入全部数据,无法分块;好处是写法简单,数据在外部定义,适合数据量小的导出
不使用分页获取,直接导50万条数据的集合,因为要一次保存全部数据,所以内存占用极高
方式2、构造函数传参留空,在导出类中重写buildData方法,分页返回集合,适合数据量大的情况
复杂合并单元格,指定单元格样式
在每个分块插入之前,每行的数据会被绑定一个index值,在每行插入后,会回调afterInsertEachRowInEachChunk()
,在其中可以使用getCurrentLine
获取当前行数,使用
getRowByIndex()
获取分块中index对应的rowData
setHeaderData()
设置表头数据,重写可修改预定义的表头、标题等
$this->excel
是xlswriter的Excel实例,可以使用$this->excel->mergeCells
合并单元格,此时可以指定自定义样式,样式设置方法请参考官方文档。
afterInsertData()
是所有数据插入完成后的回调,默认在其中调用了mergeCellsAfterInsertData
方法,合并标题,合并表头,或者对整个表格进行最后修改。可以用于整个的纵向合并,如A1:A100
,还可以设置打印纸张大小方向,设置文档密码保护等,参考xlswriter文档即可。
insertCellHandle()
是插入单元格数据的处理方法,重写后可实现设置特定单元格的样式,或者对特定单元格插入公式、图片等
getCellName()
可以根据传入的行数和列数,返回单元格名称,配合insertCellHandle,可判断当前写入的单元格
2、在控制器中使用
3、通过swoole使用
由于swoole中不能调用exit()
方法,需要在控制器中直接return下载响应
为此,需要在导出类中将$useSwoole
属性设为true,然后在控制器中return导出类的export()返回值
其他
合并单元格的范围请使用大写字母,小写字母会报错。
如果eachRow中需要调用关联模型,请使用with预加载以优化查询。
仓库中包含几个导出类的demo以供参考
方法属性补充介绍
$max
设置最大导出数据量,默认50万
useFreezePanes()
是否启用表格冻结功能
freezePanes()
设置表格冻结的行列
getColumn()
传入列数得到对应字母
getColumnIndexByName()
根据字母列名得到列数
store()
保存到文件,export里面主要是这个方法
shouldDelete()
设置下载后是否删除文件
export()
导出一条龙,保存文件->下载->下载后删除文件
$startDataRow
数据开始的行数
$currentLine
当前插入数据行,第一行为0,excel显示的行数需要再此基础上+1
getCurrentLine()
返回$currentLine+1
$index
数据行的序号,不包括表头
getIndex()
返回$index
getRowInChunkByIndex()
根据序号获取rowData,分块时会被销毁
$chunkData
分块数据
$max和setMax()
设置最大导出数据量
setUseTitle()
是否使用标题行(插入第一行的合并标题)
$chunkSize和setChunkSize()
设置每个分块的数据量
$debug和setDebug()
用dump()输出每个分块导出后的内存占用和耗费时间
$completed
已插入的数据量,用来计算导出的进度
$dataSourceType
根据构造函数的第一个参数,设置数据源类型,传入查询构造器Builder则为query类型,传入数组和集合为collection类型,其他情况为other类型
initDataSource()
初始化数据源,重写以扩展自己的类型
buildData()
根据数据源类型,执行对应的方法获取数据
buildDataFromQuery() buildDataFromCollection() buildDataFromOther()
重写后可以实现你自己的数据获取方法
chunk()
分块处理方法
$this->excel->mergeCells()
合并单元格
$headerLen
表头长度 count($this->getHeader())
$end
获取最后一列的字母 $this->getColumn($this->headerLen - 1)
$useSwoole
是否使用了swoole
更多方法详见BaseExport,注释非常详细
有什么建议或者问题,欢迎留言讨论
版本更新
- v1.2.1 (2023-6-30)
- 数据源新增other类型,非query/array/collection则均为other
- 新增buildDataFromOther,当数据源为other类型时,buildData会调用它,重写以返回自定义数据集合
- 构造函数现在数据源默认为null,即other类型。
- $useGlobalStyle现在默认为true,使用全局默认样式代替列默认样式,效果是数据末尾行之后不再有边框。
- v1.2.2 (2023-9-16)
- download时调用
$this->useSwoole()
判断是否使用了swoole,如果使用了,将返回下载响应,代替默认的exit()
- download时调用
All versions of laravel-xlswriter-export with dependencies
php Version >=7.1.0
viest/php-ext-xlswriter-ide-helper Version dev-master
ext-xlswriter Version *