Yii的Model是自带Label的,显示表格时会自动从Model中获取Label并显示,但是在导出到文件时,却并不能自动获取Label,经由跟踪发现,问题出在如下代码:

public function initExport()
{
    ...... 
    $this->setDefaultStyles('header');
    $this->setDefaultStyles('box');
    $this->filterModel = null;
    $this->setDefaultExportConfig();
    ...... 
}

注意到这里有个$this->filterModel = null,这就导致后面想凭据filterModel获取字段题目的时刻,就没有办法得到了。

修改方案,首先从Kartik Export继续一个子类,然后在子类重载initExport和getColumnHeader接口,代码如下:

    public function initExport()
    {
        // 这样处置,使得列题目可以跟grid一样,从filterModel中获取
        $filterModel = $this->filterModel;
        parent::initExport();
        $this->filterModel = $filterModel;
    }

    /** 通过filterModel的属性,获得字段的题目文字
     * @param \yii\grid\DataColumn $col
     * @return string
     */
    public function getColumnHeader($col)
    {
        $label = parent::getColumnHeader($col);
        if ($col->label === null) {
            if ($this->filterModel !== null && $this->filterModel instanceof Model) {
                $label = $this->filterModel->getAttributeLabel($col->attribute);
            }
        }
        return $label;
    }