OneThink+PHPExcel灵活适应导出数据Excel表(导出)

OneThink是ThinkPHP的内容管理框架,就是说ot是最终产品与框架之间的过渡产物.大家有兴趣可以去下载OneThink玩一玩.有这个框架,基本就可以不用写后台管理页面了.

进入正题,首先下载phpExcel, 复制到Think/Library/Vendor目录下,然后,就可以进行你的表演了。在使用的过程中,

可能会出现一些问题,下面记录下我直接遇到的一些问题,后面直接上代码,看代码的直接往后拉就ok。

  • 出现Class XMLWriter not found,这个问题在执行导出函数的时候出现,原因是因为php没有装XMLWriter扩展,装上扩展就ok.
  • 导出的excel文件是乱码,  在导出函数ExportExcel里面的header前面加上 ob_end_clean();清除缓冲区,可以有效避免乱码.
  • 额,不记得还遇到什么了.......
直接上代码吧,先看看最初是怎么处理的:
function company() {
    	 /**
         * 学生名单导出
         */
        $student = M('Student');
        $data = $student->select();
        $list = array();
        $list1 = array();
        foreach($data as $v) {
            $list1[0] = $v['id'];
            $list1[1] = $v['name'];
            $list1[2] = $v['sex'];
            $list1[3] = $v['score'];
            $list1[4] = $v['age'];
            array_push($list, $list1);
        }
        $headArr = array('id','姓名','性别','分数','年龄');
        $fileName = "Student";
        $xlsTitle = '学生表'.date('_YmdHis');// 文件名称可根据自己情况设定
        $this->exportExcel($fileName,$headArr,$list,$xlsTitle);
}

 /*
     * 导出函数          
     * $expTitle   表名
     * $expCellName   列名 (表头)
     * $expTableData 数据array格式   
     * $fileName   导出的excel文件名
     * 
     */ 
//$expTitle=>表的主题,$expCellName=>表头名(列名),$expTableData=>数据(以下采用数字索引数组)
    public function exportExcel($expTitle,$expCellName,$expTableData,$fileName)      
    {
        $xlsTitle = iconv('utf-8', $expTitle);//文件名称
       
        $cellNum = count($expCellName);        //多少列
        $dataNum = count($expTableData);        //多少行
        vendor("PHPExcel.PHPExcel");
       
        $objPHPExcel = new \PHPExcel();            //初始化
        $cellName = array('A','B','C','D','E','F','G','H','I','J','K','L',
        'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA',
        'AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN',
        'AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');
        
        $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合并单元格
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $fileName);    //标题 
        for($i=0;$i<$cellNum;$i++){
        	   //表头(列名)
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'2', $expCellName[$i]);
        } 
          // Miscellaneous glyphs, UTF-8   
        for($i=0;$i<$dataNum;$i++){
          for($j=0;$j<$cellNum;$j++){
          	//内容
            $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+3), $expTableData[$i][$j]);
          }             
        }
       
        ob_end_clean();//清除缓冲区,避免乱码
        header('Content-Type: application/vnd.ms-excel');
        header('pragma:public');
       //attachment新窗口打印inline本窗口打印
        header("Content-Disposition:attachment;filename=$fileName.xlsx");
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');  
        
        $objWriter->save('php://output'); 
        exit;   
    }
这样处理,在数据表比较小的时候还没什么,但是大量的字段的时候简直是想杀人了,所以分析下传给exportExcel据$list,大家可以发现,如果我们要把这个$list写活,那么必须得到像$list[0]= $v['name']的数据,前面的形如0一样的数字是好办的,那么获得后面的表的字段还有值就是一个问题了,下面可以看看我的做法,还是感觉太复杂了,希望有大家有更好的方法可以指导一下.
 function export(){
        	//因为exportExcel这个方法要处理的数据是 $list1[数字]= 值    然后将$list1放入到$list
        	//exportExcel要处理的数据就是$list 
           $list = array();
           $list1 = array();
           $Model = M('CompanyTaxation');//获得要导出的表的模型对象
           $map['status'] = 1;
           $land = $Model->where($map)->select();//表中状态为1的数据才导出来
            $j= 0;
            foreach($land as $k => $v ){//获得
            	 $list1[$j] = $v;
        	     $j++; 
            }
             array_push($list, $list1);
             foreach($list as $k=>$v){} 
             $data= array();
             $x=1; //作为NO的计数
             foreach($v as $k1=>$v1){
             	   $y=0;
             	   foreach( $v1 as $k2 =>$v2){//对数据进行处理  得到例如  $v[1] = 企业名称   一条完整的数据  
             	   		if($k2=="tax_month"){
             	   			$v1[$y] =  date("Y-m",$v1[$k2]);
             	   		}elseif($k2=="cid"){
             	   			$v1[$y] =  get_name_by_id($v1[$k2],"Company");//可以根据id去获得名称
             	   		}elseif($k2=="bid"){
					//在所开发的模块Common下function.php写实现函数就行
             	   			$v1[$y] =  get_name_by_id($v1[$k2],"Building");
             	   		}elseif($k2=="id"){
             	   			$v1[$y] = $x;
             	   		}else{
             	   			$v1[$y] = $v2;
             	   		}
	             	   	$y++;
	             	   	unset($v1[$k2]);//去掉原先 $v['name'] 类型的数据
             	   }
              array_push($data, $v1);//将一条完整的数据加载到$data中,之后将$data传给exportExcel进行处理
              $x++;
             }
        $headArr = array('NO','企业名称',"所属楼宇",'月营收','国税','地税',"交税月份");
        $fileName1 = "Land";
        $xlsTitle = '楼宇企业税务信息'.date('_YmdHis');//文件名称可根据自己情况设定

           $this->exportExcel($fileName1,$headArr,$data,$xlsTitle); 	
            
       }
     使用下面这种方式就可以实现,一处实现,多处复制的功效了,会方便很多只要改掉表头和一些需要处理的数据就ok.
可以这里去下载PHPEXcel

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你使用 AJAX 和 PHPExcel 导出格时遇到问题,可能是因为 PHPExcel 库不支持直接将 Excel 文件作为响应发送到客户端。解决方案是将 Excel 文件保存到服务器上,然后使用 AJAX 下载该文件。 下面是一些基本的步骤: 1.在服务器上创建一个 PHP 文件,例如 export.php,用于查询数据和创建 Excel 文件。 2.使用 PHPExcel 库将数据写入 Excel 文件,并将其保存在服务器上的某个位置。 3.在 export.php 文件中,使用 PHP 的 header() 函数将 Excel 文件作为响应发送到客户端。 ``` header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="export.xls"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); ``` 4.在客户端的 JavaScript 代码中,使用 XMLHttpRequest 对象向 export.php 发送 AJAX 请求,并在成功响应时下载 Excel 文件。 ``` var xhr = new XMLHttpRequest(); xhr.open('GET', 'export.php', true); xhr.responseType = 'blob'; xhr.onload = function() { if (this.status === 200) { var blob = new Blob([this.response], { type: 'application/vnd.ms-excel' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'export.xls'; document.body.appendChild(a); a.click(); document.body.removeChild(a); } }; xhr.send(); ``` 这将在客户端创建一个下载链接,允许用户下载导出Excel 文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值