最近公司项目用到YII框架,由于此前并没有接触过YII框架,所以对这个各种不熟悉,然后项目有个需求就是需要把CGridView查询(搜索)的数据导出来(导出Excel文件),网上搜索都是用PHPExcel,弄这个弄了两天左右(楼主我太愚钝了所以才用了这么久),下面我说说我在做这个的过程中遇到的一些问题吧!
一、无法传值到后台
开始做的时候,不知道怎么把该怎么把那些数据的ID传给后台,用尽各种办法,最后经老大点拨,发现自己钻进了死胡同,然后就很快解决了这个问题了,下面是我把cGridView 中搜索出来的数据 中的ID传到后台的解决方法。(通过JS传的话只能传当前页的数据ID,暂时没想到什么其他方法)
<script type="text/javascript">
$("#export").click(function () {<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
$.each(
$.fn.yiiGridView.getColumn('deal-grid',0),
function(i){
<span style="white-space:pre"> </span>arr_id[i] = $(this).html();
}
)
window.location.href="<?php echo $this->createUrl('Export'); ?>?arr_id="+arr_id;
});
</script>
这个时候把成功的把ID传到后台去了,至于怎么查那就靠自己了,下面是我把数据写入Excel表中
<span style="white-space:pre"> </span>$objectPHPExcel = new PHPExcel();
$objectPHPExcel->setActiveSheetIndex(0); //设置第一个工作表为活动工作表
$objectPHPExcel->getActiveSheet()->setTitle('理财产品列表'); //设置工作表名称
$letter = array('B','C','D','E','F','G','H','I');//excel 字母 位置
$name = array(
array('ID','借款名称','借款分类','添加时间','借款总额','年利率','招标日期','结束日期')
); //报表表头标题
$width = array('12','17','10','20','12','10','12','12');//设置每列的宽度
$list_arr = array(array());
foreach ($data as $k=>$list){
$list_arr[$k] = array(''.$list->id.'',''.$list->name.'',''.$list->cate_name.'',''.date("Y-m-d H:i:s",$list->create_time).'',
<span style="white-space:pre"> </span>''.$list->borrow_amount.'',''.$list->rate.'',''.$list->start.'',''.$list->end.'');
}
//将数据和报表标题合并 并转换成二维数组
$news_arrs = array_merge($name,$list_arr);
//写入多行数据 到报表中
foreach ($news_arrs as $k=>$list){
$k = $k+1;
//写入数据
for ($a=0;$a<count($letter);$a++) {
$objectPHPExcel->getActiveSheet()->setCellValue(''.$letter[$a].''.($k),$list[$a]);
$objectPHPExcel->getActiveSheet()->getColumnDimension(''.$letter[$a].'')->setWidth(''.$width[$a].'');
}
}
//设置居中
for ($i=0;$i <= count($data)+1;$i++){
$objectPHPExcel->getActiveSheet()->getStyle('B'.$i.':O'.$i.'')
->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
}<pre name="code" class="php"><span style="white-space:pre"> </span>//创建一个新的工作表,并命名
$msgWorkSheet = new PHPExcel_Worksheet($objectPHPExcel,''.$result[0]->deal_name.'');
$objectPHPExcel->addSheet($msgWorkSheet);//插入工作表
$objectPHPExcel->setActiveSheetIndex($i+1); //切换到新的工作表
//excel 字母 位置
$letters = array('B','C','D','E','F','G','H','I','J','K','L','M','N','O');
//报表表头标题 二维数组
$names = array(
array('ID','产品名','投标时间','标截止日期','投标人ID','用户名','账号类型','推荐人',
'手机号','投标金额','使用红包','已收益','待收益','是否支付')
);
$widths = array('12','17','20','20','15','15','15','15','15','17','17','17','17','17');//设置每列的宽度
$list_arrs = array(array());
foreach ($result as $ks=>$lists){
<span style="white-space:pre"> </span>$list_arrs[$ks] = array(''.$lists->id.'',''.$lists->deal_name.'',''.$lists->create_time.'',''.$lists->deal_end.'',
''.$lists->user_id.'', ''.$lists->user_name.'', ''.($lists->is_test==0)?'√':'测试号'.'', ''.$lists->parent_name.'',
''.$lists->mobile.'', ''.$lists->money.'', ''.DealLoad::user_redpaper($lists->id,$lists->order_id).'', ''.$lists->load_repay_money.'',
''.$lists->load_wait_repay_money.'',''.($lists->Payment==1)?'已支付':'未支付'.'', );
}
//将数据和报表标题合并 并转换成二维数组
$news_arr = array_merge($names,$list_arrs);
//写入多行数据 到报表中
foreach ($news_arr as $k=>$list){
$k = $k+1;
//写入数据
for ($a=0;$a<count($letters);$a++) {
<span style="white-space:pre"> </span>$objectPHPExcel->getActiveSheet()->setCellValue(''.$letters[$a].''.($k),$list[$a]);
<span style="white-space:pre"> </span>$objectPHPExcel->getActiveSheet()->getColumnDimension(''.$letters[$a].'')->setWidth(''.$widths[$a].'');
<span style="white-space:pre"> </span>}
}
导出数据到这基本就好了,还有最那个结尾我就不写了,在这最后测试的时候遇到一个问题就是用IE11导出的时候 文件名中文乱码,解决方法:
//文件名中文乱码
if(preg_match("/MSIE/", $ua)) { //MSIE 只对ie10 以下有用
header('Content-Disposition:attachment;filename="'.$encoded_filename.'".xls');
}else if (preg_match("/Firefox/", $ua)){
header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '".xls');
}else {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '".xls');
}