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 ?>