Yii2-GridView添加导出功能
首先我们需要用Composer安装一个导出组件:kartik-v/yii2-export
这个组件依赖一个PDF导出组件kartik-v/yii2-mpdf,100多M,所以安装可能很慢,需要耐心等候
不过新版本好像默认不依赖此PDF组件了
安装完毕后,打开config/web.php
,给$config
变量添加一个成员:
'modules' => [
'gridview' => [
'class' => 'kartik\grid\Module',
],
],
打开相应的视图文件,例如views/user/index.php
,修改默认GridView
的命名空间,并引用导出菜单类
use kartik\grid\GridView;
use kartik\export\ExportMenu;
用一个变量来记录需要显示及导出的字段信息,例如
$gridColumns = [
['class' => 'yii\grid\SerialColumn'],
'id',
'name',
['class' => 'yii\grid\ActionColumn'],
];
因为字段信息需要分别在导出菜单和表格视图中用到,所以用一个变量记录起来会比较方便调用、修改等
然后创建导出菜单。这里直接贴出我的代码,顺便介绍几个常用的可选参数
<?= ExportMenu::widget([
'dataProvider' => $dataProvider,
'columns' => $gridColumns,
'encoding' => 'gb2312',
'dropdownOptions' => [
'label' => '导出',
'class' => 'btn btn-default'
],
'exportConfig' => [
ExportMenu::FORMAT_TEXT => false,
ExportMenu::FORMAT_PDF => false,
ExportMenu::FORMAT_EXCEL_X => FALSE,
],
'columnSelectorOptions'=>[
'label' => '选择字段',
],
'filename' => '试用申请列表_'.date('Y-m-d'),
'selectedColumns'=> [1, 2], // 导出不选中#和操作栏
'hiddenColumns'=>[0, 3], // 隐藏#和操作栏
])?>
我来解释一下这些参数的含义吧:
encoding
:默认为UTF-8。为何我这里要设为GB2312呢?因为导出功能很多时候都需要导出excel表格,而excel表格多半使用office而不是WPS打开,而中文office不支持UTF8的表格,打开会乱码,所以只能用GB2312。而WPS在UTF8表格上就支持得挺好,表扬一个
dropdownOptions
:导出按钮选项。可以设置导出文案之类
exportConfig
:导出选项。我这里禁用了文本文档、PDF、Excel2007+的导出方式。禁文本文档是因为不美观,而且没啥意义;禁PDF是因为上面提到的PDF导出依赖组件太大(100+MB)且从项目需求上不需要导出pdf,所以我把这组件remove了;禁Excel2007+是因为在线上报错,可能是某个PHP扩展没开,没去深究,反正Excel95格式够用了
columnSelectorOptions
:相信大家都能理解
filename
:即导出文件名
selectedColumns
:默认导出的字段。不添加此参数时默认选中全部,也会选中第一列自增序列#
和最后一列操作列(就是默认有“查看修改删除”三大功能的那一列)。导出时如果不需要这些的话,就得添加此参数,并填写需要导出的字段的索引值,从0开始(0即#
列)
hiddenColumns
:在导出菜单中隐藏的字段。隐藏后用户将无法手动选择导出#栏及操作栏
接下来创建表格视图,直接贴代码
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'filterSelector' => "input[name='".$dataProvider->getPagination()->pageParam."']",
'columns' => $gridColumns,
'export' => false,
]); ?>
其中的export
参数需要讲讲。上面讲到有个很大的PDF导出组件kartik-v/yii2-mpdf,我嫌它没用(项目需求只是需要导出excel),就把它remove了,但紧接着导出组件就报错了。翻了好久官方文档都没找到解决方案,好气噢。结果我一顿瞎摸索,发现填写了这个参数并赋值false
即可解决remove掉pdf组件后导出组件报错的问题,并且不影响其他格式的正常导出
至此,导出组件应该能够正常工作了。Enjoy it!
文件名用中文会报错的吧