yii

Yii2-GridView添加导出功能

3596
1
2017-01-02

首先我们需要用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!

昵称
邮箱
网址
holyshit的头像 2018-11-14 15:30
holyshit

文件名用中文会报错的吧