最近做了一個需求,導出統計數據,因為需要同時導出多個不同的統計數據,所以不能像以往導出數據列表一樣去實現這個需求,剛好空下來就記錄一下(PHPExcel導出Excel多sheet合並)
一、主要使用的幾個方法
1 createSheet() //創建工作表 2 setActiveSheetIndex(); //設置活動工作表索引(以工作表索引號選擇需要操作的工作表) 3 setActiveSheetInde() //獲取活動工作表 4 setTitle() //設置工作表名稱 5 mergeCells() //合並單元格 6 setCellValue() //設置合並后的單元格內容 7 createWriter() //生成Excel2007文件
二、業務邏輯代碼
//訂單金額統計數據 $order_money['grid_content'] = '訂單統計資料 '.$searchInfo; //合並單元格內容 $order_money['sheet_name'] = '訂單金額數據'; //工作表名稱 $order_money['title'] = ['已結賬訂單(折扣後)金額','已結賬訂單金額','已結賬餐具費','已結賬服務費','小費總額','總人數','人均消費','菜品消費總額']; $order_money['data'] = [ [ $list['total']/100 .'元', //已結賬訂單(折扣后)金額 $list['money_total']/100 .'元', //已結賬訂單金額 $list['table_total']/100 .'元', //已結賬餐具費 $list['service_total']/100 .'元', //已結賬服務費 $list['gratuity']/100 .'元', //小費總額 $list['number'] .'個', //總人數 $list['people']/100 .'元', //人均消費 $list['food_money']/100 .'元' //菜品消費總額 ], [ '早餐就餐人數','午餐就餐人數','下午茶就餐人數','晚餐就餐人數','宵夜就餐人數' ], [ $list['number1'].'個',$list['number2'].'個',$list['number3'].'個',$list['number4'].'個',$list['number5'].'個' ], $pay_name,$pay_total ]; //訂單菜品品種消費統計數據 $order_dish_breed['grid_content'] = '菜品品種消費情況'; $order_dish_breed['sheet_name'] = '菜品品種消費數據'; $order_dish_breed['title'] = ['菜品品總名稱','售出數量/份','售出金額/元']; $order_dish_breed['data'] = []; foreach ($list['cate'] as $value){ $order_dish_breed['data'][] = [$value['name'],$value['number'],$value['total']/100]; } //訂單食品消費統計數據 $order_food['grid_content'] = '食品消費情況'; $order_food['sheet_name'] = '食品消費數據'; $order_food['title'] = ['食品名稱','售出數量/份','售出金額/元']; $order_food['data'] = []; foreach ($list['all'] as $value){ $order_food['data'][] = [$value['name'],$value['o_num'],$value['o_price']/100]; } $work = [ 0 => [ 'grid_content' => $order_money['grid_content'], //表頭部信息 'sheet_name' => $order_money['sheet_name'], //表名稱 'title' => $order_money['title'], //表列標題 'data' => $order_money['data'] //表數據 ], 1 => [ 'grid_content' => $order_dish_breed['grid_content'], 'sheet_name' => $order_dish_breed['sheet_name'], 'title' => $order_dish_breed['title'], 'data' => $order_dish_breed['data'] ], 2 => [ 'grid_content' => $order_food['grid_content'], 'sheet_name' => $order_food['sheet_name'], 'title' => $order_food['title'], 'data' => $order_food['data'] ], ]; Companent::orderExportExcel($work,'訂單統計數據','',true);
三、導出Excel工作蒲封裝方法
/** * 導出Excel工作蒲 * @param $work 導出Excel工作蒲數據 * @param string $fileName 導出Excel工作蒲名稱 * @param string $savePath 保存Excel工作蒲路徑 * @param bool $isDown 是否下載 false--保存 true--下載 * @return string 返回文件全路徑 * @throws \PHPExcel_Exception * @throws \PHPExcel_Reader_Exception * @throws \PHPExcel_Writer_Exception */ public static function orderExportExcel($work, $fileName='', $savePath='', $isDown=false,$title_line_heigth=30){ if(empty($savePath)){ $savePath = UP_PATH . 'excel/'; } require_once VENDOR_PATH . 'repo/phpexcel/PHPExcel.class.php'; $obj = 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'); foreach ( $work as $key => $value){ $obj->createSheet($key); //創建工作表 $obj->setActiveSheetIndex($key); //設置活動工作表索引(以工作表索引號選擇需要操作的工作表) $obj->getActiveSheet()->setTitle($value['sheet_name']); //獲取活動工作表並設置工作表名稱 $_row = 1; //設置縱向單元格序號標識(excel數據表格每一行數據的頭部序號) if($value['title']){ $_cnt = count($value['title']); //橫向單元格個數 = 標題數組元素個數 $obj->getActiveSheet()->getStyle('A'.$_row)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //表格水平居中 $obj->getActiveSheet()->getStyle('A'.$_row)->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //表格垂直居中 $obj->getActiveSheet()->getStyle('A'.$_row)->getFont()->setSize(14); //表格文字大小 $obj->getActiveSheet()->getStyle('A'.$_row)->getFont()->setBold(true); //設置是否加粗 $obj->getActiveSheet()->getRowDimension($_row)->setRowHeight($title_line_heigth); //表格行高 //表格內容超出自動換行 $obj->getActiveSheet()->getStyle('A'.$_row)->getAlignment()->setWrapText(true); $obj->getActiveSheet()->mergeCells('A'.$_row.':'.$cellName[$_cnt-1].$_row); //合並單元格 A1:AZ $obj->getActiveSheet()->setCellValue('A'.$_row, $value['grid_content']); //設置合並后的單元格內容 $_row++; //第一行表標題占用一行 $i = 0; //橫向單元格標識索引號 //循環列標題 foreach($value['title'] AS $v){ //設置列標題 //表格水平居中 $obj->getActiveSheet() //獲取活動工作表(獲取setActiveSheetIndex方法選中的工作表) ->getStyle($cellName[$i] . $_row) //獲取需要設置樣式的單元格 ->getAlignment() //獲取樣式對齊 ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //設置單元格橫向對齊方式(居中對齊) //表格垂直居中 $obj->getActiveSheet() //獲取活動工作表(獲取setActiveSheetIndex方法選中的工作表) ->getStyle($cellName[$i] . $_row) //獲取需要設置樣式的單元格 ->getAlignment() //獲取樣式對齊 ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //設置單元格垂直對齊方式(居中對齊) //表格寬度 $obj->getActiveSheet()->getColumnDimension($cellName[$i])->setWidth(14); //表格高度 $obj->getActiveSheet()->getRowDimension($_row)->setRowHeight(28); //表格內容超出自動換行 $obj->getActiveSheet()->getStyle($cellName[$i] . $_row)->getAlignment()->setWrapText(true); //設置單元格值 $obj->getActiveSheet()->setCellValue($cellName[$i].$_row, $v); //循環完成后= A1內容->B1內容->C1內容->...... $i++; //循環一次橫向單元格標識索引號+1 } $_row++; //第二行列標題占用一行 } //填寫數據 if($value['data']){ $i = 0; //縱向單元格序號標識 foreach($value['data'] AS $_v){ $j = 0; //橫向單元格標識索引號 foreach($_v AS $_cell){ //拿數據值數組,循環數據值將每個值循環插入單元格 //表格水平居中 $obj->getActiveSheet() //獲取活動工作表(獲取setActiveSheetIndex方法選中的工作表) ->getStyle($cellName[$j] . ($i+$_row)) //獲取需要設置樣式的單元格 ->getAlignment() //獲取樣式對齊 ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //設置單元格橫向對齊方式(居中對齊) //表格垂直居中 $obj->getActiveSheet() //獲取活動工作表(獲取setActiveSheetIndex方法選中的工作表) ->getStyle($cellName[$j] . ($i+$_row)) //獲取需要設置樣式的單元格 ->getAlignment() //獲取樣式對齊 ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER); //設置單元格垂直對齊方式(居中對齊) //表格寬度 $obj->getActiveSheet()->getColumnDimension($cellName[$j])->setWidth(14); //表格高度 $obj->getActiveSheet()->getRowDimension(($i+$_row))->setRowHeight(28); //表格內容超出自動換行 $obj->getActiveSheet()->getStyle($cellName[$j] . ($i+$_row))->getAlignment()->setWrapText(true); //表格文字大小 $obj->getActiveSheet()->getStyle($cellName[$j] . ($i+$_row))->getFont()->setSize(11); //設置單元格值 $obj->getActiveSheet()->setCellValue($cellName[$j] . ($i+$_row), $_cell); //循環完成后= A1內容->B1內容->C1內容->...... $j++; //循環一次橫向單元格標識索引號+1 } $i++; //循環第二次時//循環完成后= A2內容->B2內容->C2內容 ->...... } } } // $sheet_count = $obj->getSheetCount(); //獲取工作表數量 // $sheet_name = $obj->getSheetNames(); //獲取所有工作表名稱 // $sheet_index = $obj->getActiveSheetIndex(); //獲取工作表索引 $obj->setActiveSheetIndex(0); //設置活動工作表索引(讓打開Excel工作蒲時默認選中打開第一張工作表) $obj->removeSheetByIndex(count($work)); //刪除指定索引工作表(不知道為什么每次工作蒲尾部都會多出一張名為Worksheet的空白sheet,所以這里刪除最后一張sheet) //文件名處理 if(!$fileName){ $fileName = uniqid(time(),true); } $objWrite = \PHPExcel_IOFactory::createWriter($obj, 'Excel2007'); //生成Excel2007文件 if ($isDown) { //網頁下載 header('pragma:public'); header("Content-Disposition:attachment;filename=$fileName.xls"); $objWrite->save('php://output'); exit; } $_fileName = iconv("utf-8", "gb2312", $fileName); //轉碼 $_savePath = $savePath . $_fileName . '.xlsx'; $objWrite->save($_savePath); return $savePath . $fileName . '.xlsx'; }
導出效果如下圖