导出Excel时如何移除kartik Editable组件的编辑与关闭符号?
解决导出Excel时移除Editable的Edit/Close符号的方法
我之前也碰到过这个问题,核心原因是ExportMenu导出时会直接抓取GridView单元格里渲染好的HTML内容,而Editable组件生成的内容里包含了编辑按钮的相关元素,所以这些符号会被一起导出。下面给你几个实用的解决办法:
方法一:给GridView列配置exportFormat指定导出值
在GridView对应列的配置里,添加exportFormat属性,直接指定导出时要使用的原始数据值,跳过渲染后的HTML内容。示例代码如下:
[ 'attribute' => 'status', 'content' => function ($model, $key, $index, $column) { // 你的Editable组件原有代码 return kartik\editable\Editable::widget([ 'header'=>false, 'name' => 'status', 'size'=>'sm', 'type'=>'primary', 'placement'=>'right', 'containerOptions'=>['class' => 'kv-sticky-column'], 'contentOptions'=>['class' => 'kv-sticky-column'], 'inputType'=>kartik\editable\Editable::INPUT_TEXT, 'value'=>$model->getSummerValue($model['id']), 'editableValueOptions'=>['asPopover' => false], 'formOptions'=>[ 'method' => 'post', 'id' => 'gv1_summer_'.$index.'_form_name', 'action' => ['/forward-price-curve/save-summer?location_id='.$model['id']] ], 'options' => [ 'id' => 'gv1_summer_'.$index.'_form_name', 'pluginOptions'=>[ 'autoclose'=>true, 'asPopover' => false, ] ], 'submitButton' => [ 'class' => 'btn btn-sm btn-primary', 'icon' => '<i class="glyphicon glyphicon-floppy-save"></i>', ], ]); }, // 关键配置:指定导出时返回纯文本值 'exportFormat' => function ($model) { return $model->getSummerValue($model['id']); }, ],
ExportMenu会优先读取exportFormat的返回值,这样导出的Excel里就只有纯数据,不会带Edit/Close符号了。
方法二:在ExportMenu的columns里单独配置导出列
如果你自定义了ExportMenu的columns参数,可以直接给导出列单独设置内容,完全避开Editable的HTML渲染:
use kartik\export\ExportMenu; echo ExportMenu::widget([ 'dataProvider' => $dataProvider, 'columns' => [ // 其他列配置... [ 'attribute' => 'status', 'value' => function ($model) { return $model->getSummerValue($model['id']); }, ], // 其他列... ], // 你的ExportMenu其他配置 ]);
这种方式相当于给导出流程单独定义列内容,和页面显示的Editable组件完全分离,彻底避免符号被导出。
方法三:在GridView的content里区分导出场景
我们可以通过判断请求参数,区分当前是正常页面渲染还是导出请求,分别返回不同内容:
[ 'attribute' => 'status', 'content' => function ($model, $key, $index, $column) { // 判断是否为导出请求(ExportMenu导出时会携带export参数) if (Yii::$app->request->get('export') !== null) { return $model->getSummerValue($model['id']); } // 非导出场景正常渲染Editable组件 return kartik\editable\Editable::widget([ // ... 你的原有Editable配置 ]); }, ],
这种方式能让同一个列在页面显示和导出时分别呈现不同内容,逻辑清晰直观。
这三个方法里,方法一最简洁高效,推荐优先使用,它直接利用了GridView和ExportMenu的内置机制,不需要额外的判断逻辑。
内容的提问来源于stack exchange,提问作者Ankit Sompura
相关产品推荐
相关产品推荐

