Yii框架 phpexcel 导出
一、说明
之前使用的是PHPExcelXML包实现的数据导出,由于导出的文件扩展名为“.xls” 在office2007上带不开,报如下图错误(用 WPS都能打开)
因此,此次采用了 PHPExcel包 不仅支持生成Excel(.xls)还支持Excel2007(.xlsx)以及PDF 文档。
二、资源
PHPExcel的官方网站如下:http://phpexcel.codeplex.com/
三、目录
当前的版本是:PHPExcel_1.8.0_odt.zip
PHPExcel.php文件是类库的接口,外部的PHP代码通过它来实现对PHPExcel的调用,
PHPExcel目录下是各种不同文档(如Excel、Excel2007、PDF等)的读取和生成的具体操作代码.
四、修改配置文件
修改路径:extensions/PHPExcel/Autoloader.php文件Register方法,代码如下;
public static function Register() { //这是phpexcel导出修改前的方法 /* if (function_exists('__autoload')) { // Register any existing autoloader function with SPL, so we don't get any clashes spl_autoload_register('__autoload'); } // Register ourselves with SPL return spl_autoload_register(array('PHPExcel_Autoloader', 'Load'));*/ //这是phpexcel导出修改后的方法 $functions = spl_autoload_functions(); foreach ( $functions as $function) spl_autoload_unregister($function); $functions = array_merge(array(array('PHPExcel_Autoloader','Load')),$functions); foreach ( $functions as $function) $x = spl_autoload_register($function); return $x; } // function Register()
五、Controller中使用的方法
说明:因为我目前的代码条件,不能直接写一个phpexcel导出的方法,只能判断是否点击了“Save to excel” button 按钮通过value值来判断访问导出的代码段;
1、加载相关代码
在YII框架中某一方法中插入如下代码;
/*导出Excel----数据-------------------star-------2015-8-28--lcc */ include_once(dirname(dirname(__FILE__)).'/extensions/PHPExcel.php'); include_once(dirname(dirname(__FILE__)).'/extensions/PHPExcel/Writer/Excel2007.php'); include_once(dirname(dirname(__FILE__)).'/extensions/PHPExcel/Writer/Excel5.php'); include_once(dirname(dirname(__FILE__)).'/extensions/PHPExcel/IOFactory.php'); $objPHPExcel = new PHPExcel();
说明:首先实例化对象后就要测试$objPHPExcel是否是一个对象!如果不是,那就要修改以上加载的问题,如果没有问题就往下编辑代码。
2、整理数据
(一) 遍历数组形式:
因为我的代码是经过多层筛选的数据,放在一个二维数组里,因此,要遍历数组将数据放在一个对象里
说明:我有两个数组,第一个数组是 $shfes 放的是列标题;第二个数组是 $prinfo 放的是每列的数据内容,$prinfo 的格式如下图
//拼数据 $i=0; $p=0; while ( $i<=count($shfes)) { //插入列标题 $objPHPExcel->setActiveSheetIndex(0)->setCellValue(DatabaseSearchForm::$exarr[$i].'1', $shfes[$i]['name']); $i++; }
$exhang=2; foreach ($prinfo as $key=>$value) { //插入每列的内容 for ($s=0; $s <count($value) ; $s++) { $objPHPExcel->setActiveSheetIndex(0)->setCellValue(DatabaseSearchForm::$exarr[$s].$exhang, $value[$s]); } $exhang++; }
代码说明:
1、DatabaseSearchForm::$exarr[$i] 是在Model层定义了一个静态的$exarr一维数组,存放的是excel 每列的 A、B、C~Z
2、$exhang 是一个变量从Excel的第2行开始插入
(二)静态拼写数组(仅供参考)
//插入列标题
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', '列标题1') ->setCellValue('B1', '列标题2') ->setCellValue('C1', '列标题3') ->setCellValue('D1', '列标题4') ->setCellValue('E1', '列标题5');
//插入每列的内容
if(!empty($model->Goods)){ $i =2; foreach ($model->Goods as $one){ $guige = ''; $guige = $one->StockSpliterValue; $objPHPExcel->setActiveSheetIndex(0) ->setCellValue("A$i", $one->gd_sn) ->setCellValue("B$i", $one->gd_name) ->setCellValue("C$i", "$guige") ->setCellValue("D$i", $one->order_num) ->setCellValue("E$i", $one->stock_num); $i++; } }
3、写入数据到excel,格式为.xls
//写入数据 $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="SMM_'.$price[$products]['type']."_".str_replace('-', '', $sform->start).'.xls"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); Yii::app()->end(); spl_autoload_register(array('YiiBase','autoload')); exit();
} /*导出Excel----数据------------------------------end---------- */
3、写入数据到excel,格式为.xlsx
//写入数据 $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="SMM_'.$price[$products]['type']."_".str_replace('-', '', $sform->start).'.xlsx"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); exit;
}/*导出Excel----数据------------------------------end---------- */
说明:经过测试修改excel的扩展名是可以修改的如.xlsx 可以修改成 .xls 形式的,其他代码不变。
这样就可以咯~~效果图如下
参考博客:
http://blog.csdn.net/xiaojun1288/article/details/7349471
http://blog.csdn.net/alongken2005/article/details/6284635
http://blog.csdn.net/sadfishsc/article/details/7543291
http://www.cnblogs.com/jshen/p/4149812.html
http://www.th7.cn/Program/php/201506/489276.shtml
如下是PHPExcelXML导出的案例
/** * @desc 导出所有关键字 */ public function actionEchokeyword(){ $columns = array( array('name' => '类型' , 'width' => '183.75'), array('name' => '所属品目' , 'width' => '57.75'), array('name' => '关键字' , 'width' => '57.75'), array('name' => '产品代码' , 'width' => '57.75'), array('name' => '链接地址' , 'width' => '57.75'), array('name' => '是否热门' , 'width' => '57.75'), array('name' => '点击次数' , 'width' => '57.75'), array('name' => '最后点击时间' , 'width' => '57.75'), ); $key = EnNewsKeywords::model()->findAll(); foreach ($key as $k){ $data[] = array( $k->type, $k->team, empty($k->keywordsName)?'':$k->keywordsName, empty($k->productinfo)?'':$k->productinfo, $k->link_address, empty($k->is_hotkeys)?'否':'是', $k->clicknum, $k->end_clicktime, ); } $file_name = sprintf('SMM-newKeywords-list-%s',date('Ymd',time())); Yii::import('application.extensions.phpexcel.JPhpExcel'); $xls = new JPhpExcel('UTF-8', false, 'keyword List'); $xls -> setColumns($columns); $xls->addArray($data); $xls->generateXML($file_name); }