yii封装一个导出方法(基于PHPExcel) [ 未指定版本 ]
最近在做导出功能,网上提高的资料都是用PHPExcel来做,这个扩展确实非常好用,
但是每次导出时都要写大量重复代码,很麻烦,为此,基于PHPExcel 封装了一个新的方法来做导出。
第一步:引入PHPExcel
首先得要下载phpexcel地址:https://github.com/PHPOffice/PHPExcel/archive/1.8.1.zip
其次,引入,直接在入口文件index.php中引入,也可以在你定义的controller类之前,只要是在你使用之前引入就可以
require dirname(dirname(FILE)).'/excel/PHPExcel.php';
或者在phpexcel类里修改相应的namespace也可。
第二步:按照下面的代码修改PHPExcel代码目录里的Autoloader.php文件,对比源文件改成
public static function Register() {
$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;
}
第三步:基于PHPExcel封装导出方法
我把这个文件放在了extensions/putoutExcel.php 目录下,不知道是否是最佳位置。
文件内容如下:
class PutoutExcel{
public function __construct(){
Yii::import("application.extensions.PHPExcel.PHPExcel",1);
}
/*
* 导出方法,其中参数$data :要导出的数据二维数组,$filename:导出的excel的文件名,$pathname:导出文件存放的路径
*/
public function exportExcel($data,$filename,$pathname='export'){
$path=Yii::app()->params['tmp_dir'].$pathname.'/'; //下载文件的存放位置
if(!is_dir($path)){
mkdir($path);
}
$filename = $filename?$filename:(time().rand(1, 10).'.xls');
$fileurl=$path.$filename;
$objPHPExcel = new PHPExcel();
foreach ($data as $key => $value) {
$rows = $key + 1;
foreach ($value as $k => $val) {
$str = '';
if (floor($k / 26) > 0) {
$str .= IntToChr(floor($k / 26)-1);
}
$cols = $str . chr($k % 26 + 65);
//允许针对单元格做扩展处理
if (is_array($val)) {
if (isset($val['cellFillColor'])) {
//填充表格颜色
$objPHPExcel->getActiveSheet()->getStyle($cols . $rows)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle($cols . $rows)->getFill()->getStartColor()->setARGB($val['cellFillColor']);
//$objPHPExcel->getActiveSheet()->getStyle($cols . $rows)->getFont()->getColor()->setARGB($val['cellFillColor']);//设置单元格字体 PHPExcel_Style_Color::COLOR_RED
}
if (isset($val['cellValue'])) {
$val = $val['cellValue'];
}
}
$objPHPExcel->getActiveSheet()->setCellValue($cols.$rows, $val);
}
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
//$objWriter->save('php://output');
$objWriter->save($fileurl);
return array(
'fileurl'=>$fileurl,
'filename'=>$filename
);
}
}
第四步:调用
假设我在testController.php 文件下有一个导出操作,
public function actionListexport(){
$headerData = array("ID","Tutor","Level","Unit","Lession","Class Time");
$bodyData = array();
$bodyData[0]=$headerData;
$data=array(
'0'=>array('6955','jack','PK预备级','Lession4','2017-05-28 08:00--08:50'),
'1'=>array('6956','lucy','PK预备级','Lession5','2017-05-27 08:00--08:50'),
'2'=>array('6957','tom','PK预备级','Lession6','2017-05-29 08:00--08:50'),
);
if(!empty($data)){
foreach ($data as $key => $value) {
$bodyData[]=$value;
}
}
//print_r($bodyData);exit();
Yii::import("application.extensions.PutoutExcel",1);
$objPHPExcel = new PutoutExcel();
$res=$objPHPExcel->exportExcel($bodyData,$filename=' 课表导出.xls');
$filename=$res['filename'];
$fileurl=$res['fileurl'];
ob_end_clean();
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Length: '.filesize($fileurl));
error_reporting(0);
readfile($fileurl);
flush();
ob_flush();
exit;
}
这样一个导出功能就完成了
水蓝儿
注册时间:2017-06-04
最后登录:2017-06-04
在线时长:0小时17分
最后登录:2017-06-04
在线时长:0小时17分
- 粉丝0
- 金钱15
- 威望10
- 积分115
共 1 条评论
请教一下,foreach()能否补全 extensions目录是在common目录下新建的?