php导出excel封装类

因为实际情况的需要,导出excel表格在后台开发的过程中会经常用到。下面是我在实际应用中自己整理的一个导出excel类,需要PHPExcel支持,本类很好的完成导出表格的基本样式,保存路径,切换工作薄写入的功能,希望对大家有所帮助。

1:需要PHPExcel支持

2:导出可以自动切换工作薄,默认一个工作薄2000行,测试发现5000条左右的数据导出可能失败并且导出时间较长,

     切换工作薄可以提高成功率,并且方便阅读

3:导出需要传必要参数,返回值是保存的后的excel地址,链接即可下载

  1 <?php
  2 /**
  3  * 公共的导出类@author:zhaoyaei
  4  * $column     :导出的第一行标题
  5  * $result     :需要导出的结果集
  6  * $path       :导出文件的保存路径
  7  * $sheet_num  :每个工作薄的最大行数(可选)
  8  * @return     :保存的地址
  9  */
 10 class Export{
 11     
 12     public function __construct(){
 13         //初始化类,引入相关类文件
 14         include "PHPExcel.php";
 15         include "PHPExcel/IOFactory.php";
 16     }
 17 
 18     //导出设置
 19     public function createxcel($column,$result,$path,$sheet_num = null){
 20         //检查数据的合法性
 21         if(empty($column) || empty($path) || $path == "" || empty($result)){
 22             return false;
 23         }
 24 
 25         //如果数据较大,则分薄导出
 26         if(empty($sheet_num) || $sheet_num <= 0){
 27             $sheet_num = 2000;
 28         }
 29 
 30         $path = $this->check_encod("GBK",$path);
 31         //创建PHPExcel实例
 32         $objPHPExcel = new \PHPExcel();
 33         //总数据行数和数据列数
 34         $arr_num     = count($result);
 35         $field_count = count($column);
 36         //工作薄数目,工作薄数量太多,可以调节煤业导出的数据条数减少工作薄数目
 37         $get_num     = ceil($arr_num / $sheet_num);
 38         if($get_num > 20){
 39             return false;
 40         }
 41         
 42         //生成列信息
 43         $ary = 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");
 44         for($i = 1;$i <= $field_count; $i++){
 45             $ary_info[$i]     = $ary[$i/27].$ary[$i%27];
 46             $fieldwidth[$i-1] = 20; //设置列宽默认是20
 47         }
 48         
 49 
 50         //循环每个工作薄
 51         for($sheet = 0;$sheet < $get_num; $sheet++){
 52             //创建工作薄,设置起始工作薄
 53             $objPHPExcel->createSheet($sheet);
 54             $Sheet = $objPHPExcel->setActiveSheetIndex($sheet);
 55             //设置工作薄样式
 56             $i = 1;
 57             foreach ($column as $key => $value){
 58                 //设置第一行的值
 59                 $Sheet->setCellValue($ary_info[$i] .'1', $value);
 60                 //设置第一行加粗
 61                 $objPHPExcel->getActiveSheet()->getStyle($ary_info[$i] .'1')->getFont()->setBold(true);
 62                 //设置行宽
 63                 $objPHPExcel->getActiveSheet()->getColumnDimension($ary_info[$i] )->setWidth($fieldwidth[$i-1]);
 64                 $i = $i + 1;
 65             }
 66             
 67             //每个工作薄开始的行数
 68             $hang_num  = 2;
 69             //本工作薄结束行数开始为0
 70             $end_num   = 0;
 71             //start_num本工作薄开始行数
 72             $start_num = $sheet*$sheet_num;
 73             //计算出每次导出的开始行数和结束行数(多工作薄导出)
 74             if($arr_num > ($start_num + $sheet_num)){
 75                 $end_num = $start_num + $sheet_num;
 76             }else{
 77                 $end_num = $arr_num;
 78             }
 79 
 80             //循环行数
 81             for($i = $start_num; $i < $end_num; $i++){
 82                 //循环列数
 83                 for($j = 1;$j <= $field_count; $j++){
 84                     //写入数据
 85                     $Sheet->setCellValue($ary_info[$j].($hang_num)," ".$result[$i][$j]);
 86                 }
 87                 $hang_num++;
 88             }
 89             //设置sheet的名称
 90             $objPHPExcel->getActiveSheet($sheet)->setTitle('sheet'.$sheet,$sheet);
 91             //设置sheet的起始位置
 92             $objPHPExcel->setActiveSheetIndex($sheet);
 93         }
 94         
 95         //通过PHPExcel_IOFactory的写函数将上面数据写出来
 96         $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
 97         //设置时区
 98         date_default_timezone_set("Asia/Shanghai");
 99         //保存并返回保存路径
100         $objWriter->save($path);
101         return $this->check_encod("utf-8",$path);
102     }
103 
104     public function check_encod($encod,$string){
105         //判断字符编码
106         $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
107         if($encode != $encod){
108             $string = iconv($encode, $encod, $string);
109         }
110         return $string;
111     }
112 }
113 ?>

 

posted @ 2015-03-28 11:12  赵亚飞  阅读(997)  评论(0编辑  收藏  举报