PHPExcel导出yii2中的“Unreadable Content”Excel文件
发布时间:2020-12-13 17:56:44 所属栏目:PHP教程 来源:网络整理
导读:我在Yii2项目中使用了 PHPExcel扩展,我创建了 PHPExcel对象的组件,但是这个组件导出了“Unreadable Content”Excel文件. 我已从这些链接中阅读了此问题的所有可能解决方案: PHPExcel – .xlsx file downloads unreadable content PHPExcel creates ‘unread
我在Yii2项目中使用了
PHPExcel扩展,我创建了
PHPExcel对象的组件,但是这个组件导出了“Unreadable Content”Excel文件.
我已从这些链接中阅读了此问题的所有可能解决方案: > PHPExcel – .xlsx file downloads unreadable content 我收到了“不可读的内容”Excel文件: 我的代码是, 组件ExcelGrid.php: <?php namespace appcomponents; use Yii; use Closure; use yiii18nFormatter; use yiibaseInvalidConfigException; use yiihelpersUrl; use yiihelpersHtml; use yiihelpersJson; use yiihelpersArrayHelper; use yiiwidgetsBaseListView; use yiibaseModel; use PHPExcel; use PHPExcel_IOFactory; use PHPExcel_Settings; use PHPExcel_Style_Fill; use PHPExcel_Writer_IWriter; use PHPExcel_Worksheet; class ExcelGrid extends yiigridGridView { 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 yiigridDataColumn) ? $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 yiigridSerialColumn || $column instanceof yiigridActionColumn) { 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 yiigridSerialColumn || $column instanceof yiigridActionColumn) { 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 yiibaseModel */ 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 appcomponentsExcelGrid::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' => 'yiigridSerialColumn'],'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国家安装配置) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |