我在Yii2项目中使用了 PHPExcel扩展,我创建了 PHPExcel对象的组件,但是这个组件导出了“Unreadable Content”Excel文件.

我已从这些链接中阅读了此问题的所有可能解决方案:

> PHPExcel – .xlsx file downloads unreadable content
> PHPExcel creates ‘unreadable content’
> https://stackoverflow.com/questions/32103447/excel-found-unreadable-content-with-phpexcel
> PHPExcel unreadable content

我收到了“不可读的内容”Excel文件:

我的代码是,

组件ExcelGrid.PHP:

<?PHP    
namespace app\components;

use Yii;
use Closure;
use yii\i18n\Formatter;
use yii\base\InvalidConfigException;
use yii\helpers\Url;
use yii\helpers\Html;
use yii\helpers\Json;
use yii\helpers\ArrayHelper;
use yii\widgets\BaseListView;
use yii\base\Model;
use \PHPExcel;
use \PHPExcel_IOFactory;
use \PHPExcel_Settings;
use \PHPExcel_Style_Fill;
use \PHPExcel_Writer_IWriter;
use \PHPExcel_Worksheet;

class ExcelGrid extends \yii\grid\GridView
{
    public $columns_array;
    public $properties;
    public $filename='excel';
    public $extension='xlsx';
    private $_provider;
    private $_visibleColumns;
    private $_beginRow = 1;
    private $_endRow;
    private $_endCol;
    private $_objPHPExcel;
    private $_objPHPExcelSheet;
    private $_objPHPExcelWriter;

    public function init(){
        parent::init();
    }

    public function run(){
        //$this->test();
        if (function_exists('mb_internal_encoding')) {
            $oldEncoding=mb_internal_encoding();
            mb_internal_encoding('utf8');
        }
        ob_start();
        $this->init_provider();
        $this->init_excel_sheet();
        $this->initPHPExcelWriter('Excel2007');
        $this->generateHeader();
        $row = $this->generateBody();
        $writer = $this->_objPHPExcelWriter;
        $this->setHttpHeaders();
        ob_end_clean();
        $writer->save('PHP://output');      
        if (function_exists('mb_internal_encoding'))
            mb_internal_encoding($oldEncoding); 
exit;
        Yii::$app->end();
        //$writer->save('test.xlsx');
        parent::run();
    }

    public function init_provider(){
        $this->_provider = clone($this->dataProvider);
    }
    public function init_excel_sheet(){
        $this->_objPHPExcel=new PHPExcel();
        $creator = '';
        $title = '';
        $subject = '';
        $description = 'Excel Grid';
        $category = '';
        $keywords = '';
        $manager = '';
        $created = date("Y-m-d H:i:s");
        $lastModifiedBy = '';
        extract($this->properties);
        $this->_objPHPExcel->getProperties()
        ->setCreator($creator)
        ->setTitle($title)
        ->setSubject($subject)
        ->setDescription($description)
        ->setCategory($category)
        ->setKeywords($keywords)
        ->setManager($manager)
        //->setCompany($company)
        ->setCreated($created)
        ->setLastModifiedBy($lastModifiedBy);
        $this->_objPHPExcelSheet = $this->_objPHPExcel->getActiveSheet();
    }
    public function initPHPExcelWriter($writer)
    {
        $this->_objPHPExcelWriter = PHPExcel_IOFactory::createWriter(
        $this->_objPHPExcel,$writer
        );
    }
    public function generateHeader(){
        $this->setVisibleColumns();
        $sheet = $this->_objPHPExcelSheet;
        $colFirst = self::columnName(1);
        $this->_endCol = 0;
        foreach ($this->_visibleColumns as $column) {
            $this->_endCoL++;
            $head = ($column instanceof \yii\grid\DataColumn) ? $this->getColumnHeader($column) : $column->header;
            $cell = $sheet->setCellValue(self::columnName($this->_endCol) . $this->_beginRow,$head,true);
        }
        $sheet->freezePane($colFirst . ($this->_beginRow + 1));
    }

    public function generateBody()
    {
        $columns = $this->_visibleColumns;
        $models = array_values($this->_provider->getModels());
        if (count($columns) == 0) {
        $cell = $this->_objPHPExcelSheet->setCellValue('A1',$this->emptyText,true);
        $model = reset($models);
        return 0;
        }
        $keys = $this->_provider->getKeys();
        $this->_endRow = 0;
        foreach ($models as $index => $model) {
            $key = $keys[$index];
            $this->generateRow($model,$key,$index);
            $this->_endRow++;
        }
        // Set autofilter on
        $this->_objPHPExcelSheet->setAutoFilter(
        self::columnName(1) .
        $this->_beginRow .
        ":" .
        self::columnName($this->_endCol) .
        $this->_endRow
        );
        return ($this->_endRow > 0) ? count($models) : 0;
    }

    public function generateRow($model,$index)
    {
        $cells = [];
        /* @var $column Column */
        $this->_endCol = 0;
        foreach ($this->_visibleColumns as $column) {
        if ($column instanceof \yii\grid\SerialColumn || $column instanceof \yii\grid\ActionColumn) {
            continue;
        } else {
            $format = $column->format;
            $value = ($column->content === null) ?
            $this->formatter->format($column->getDataCellValue($model,$index),$format) :
            call_user_func($column->content,$model,$index,$column);
        }
        if (empty($value) && !empty($column->attribute) && $column->attribute !== null) {
            $value =ArrayHelper::getValue($model,$column->attribute,'');
        }
        $this->_endCoL++;
        $cell = $this->_objPHPExcelSheet->setCellValue(self::columnName($this->_endCol) . ($index + $this->_beginRow + 1),strip_tags($value),true);
        }
    }

    protected function setVisibleColumns()
    {
        $cols = [];
        foreach ($this->columns as $key => $column) {
            if ($column instanceof \yii\grid\SerialColumn || $column instanceof \yii\grid\ActionColumn) {
                continue;
            }
            $cols[] = $column;
        }
        $this->_visibleColumns = $cols;
    }

    public function getColumnHeader($col)
    {
        if(isset($this->columns_array[$col->attribute]))
            return $this->columns_array[$col->attribute];

        /* @var $model yii\base\Model */
        if ($col->header !== null || ($col->label === null && $col->attribute === null)) {
            return trim($col->header) !== '' ? $col->header : $col->grid->emptyCell;
        }
        $provider = $this->dataProvider;
        if ($col->label === null) {
            if ($provider instanceof ActiveDataProvider && $provider->query instanceof ActiveQueryInterface) {
            $model = new $provider->query->modelClass;
            $label = $model->getAttributeLabel($col->attribute);
            } else {
                $models = $provider->getModels();
                if (($model = reset($models)) instanceof Model) {
                $label = $model->getAttributeLabel($col->attribute);
                } else {
                $label =$col->attribute;
                }
            }
        } else {
            $label = $col->label;
        }
        return $label;
    }
    public static function columnName($index)
    {
        $i = $index - 1;
        if ($i >= 0 && $i < 26) {
            return chr(ord('A') + $i);
        }
        if ($i > 25) {
            return (self::columnName($i / 26)) . (self::columnName($i % 26 + 1));
        }
        return 'A';
    }

    protected function setHttpHeaders()
    {
        header("Cache-Control: no-cache");
        header("Pragma: no-cache");
        header("Content-Type: application/{$this->extension}; charset=utf-8");
        header("Content-disposition: attachment; filename={$this->filename}.{$this->extension}");
        header("Expires: 0");
    }
}

查看文件countryExcel.PHP:

<?PHP

\app\components\ExcelGrid::widget([ 
    'dataProvider' => $dataProvider,'filterModel' => $searchModel,'extension'=>'xlsx','filename'=>'country-list'.date('Y-m-dH:i:s'),'properties' =>[
     //'creator' =>'',//'title'  => '',//'subject'  => '',//'category' => '',//'keywords'  => '',//'manager'  => '',],'columns' => [
        ['class' => 'yii\grid\SerialColumn'],'country_name',[
            'attribute' => 'created_at','value' => function ($data) {
                return Yii::$app->formatter->asDateTime($data->created_at);
            },[
            'attribute' => 'created_by','value' => 'createdBy.user_login_id',[
            'attribute' => 'updated_at','value' => function ($data) {
                return (!empty($data->updated_at) ? Yii::$app->formatter->asDateTime($data->updated_at) : Yii::t('stu',' (not set) '));
            },[
            'attribute' => 'updated_by','value' => 'updatedBy.user_login_id',]);

?>

控制器文件CountryController.PHP:

<?PHP

class CountryController extends Controller
{

    .....
    .......

    public function actionExcel()
    {
        $searchModel = new CountrySearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->renderPartial('CountryExportExcel',[
            'searchModel' => $searchModel,'dataProvider' => $dataProvider,]);
    }

    ........
    .....
}

?>

提前致谢.

您的文件似乎是使用记事本等编辑器打开的正确xlsx文件
可能是一个字符编码问题

尝试更改编码

if (function_exists('mb_internal_encoding')) {
        $oldEncoding=mb_internal_encoding();
        mb_internal_encoding('utf8');
    }

使用cp1250的值 – 到cp1258

在US-EN编码微软(我希望你的excel国家安装配置)

PHPExcel导出yii2中的“Unreadable Content”Excel文件的更多相关文章

  1. PHP的Yii框架中使用数据库的配置和SQL操作实例教程

    这篇文章主要介绍了PHP的Yii框架中使用数据库的配置和SQL操作实例教程,Yii支持绑定多种数据库,文中主要对各种查询语句在Yii中的使用给出了例子,需要的朋友可以参考下

  2. yii2使用GridView实现数据全选及批量删除按钮示例

    本篇文章主要介绍了yii2使用GridView实现数据全选及批量删除按钮示例,具有一定的参考价值,有兴趣的可以了解一下。

  3. Yii开启片段缓存的方法

    这篇文章主要介绍了Yii开启片段缓存的方法,结合实例形式分析了Yii框架片段缓存的开启与使用技巧,需要的朋友可以参考下

  4. yii2.0数据库迁移教程【多个数据库同时同步数据】

    这篇文章主要介绍了yii2.0数据库迁移的方法,可实现多个数据库同时同步数据的功能,较为详细的分析了Yii2针对迁移的创建、提交、重做及自定义迁移的相关概念与使用方法,需要的朋友可以参考下

  5. Yii框架核心组件类实例详解

    这篇文章主要介绍了Yii框架核心组件类,结合实例形式详细分析了Yii框架中成员变量扩展、事件模型及行为类绑定相关原理与操作技巧,需要的朋友可以参考下

  6. phpexcel导入excel处理大数据(实例讲解)

    下面小编就为大家带来一篇phpexcel导入excel处理大数据(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Yii框架操作cookie与session的方法实例详解

    这篇文章主要介绍了Yii框架操作cookie与session的方法,结合实例形式详细分析了Yii针对cookie与session操作的常用方法及相关注意事项,需要的朋友可以参考下

  8. Yii实现微信公众号场景二维码的方法实例

    这篇文章主要给大家介绍了关于Yii实现微信公众号场景二维码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  9. 解读PHP的Yii框架中请求与响应的处理流程

    这篇文章主要介绍了PHP的Yii框架中请求与响应的处理流程,这也是Yii处理网站后台的最基本功能,需要的朋友可以参考下

  10. Yii 访问 Gii(脚手架)时出现 403 错误

    这篇文章主要介绍了Yii 访问 Gii(脚手架)时出现 403 错误的解决方法的相关资料,需要的朋友可以参考下

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部