PHPExcel导出工作蒲(多表合并)教程+详细代码解读
最近做了一个需求,导出统计数据,因为需要同时导出多个不同的统计数据,所以不能像以往导出数据列表一样去实现这个需求,刚好空下来就记录一下(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'; }
导出效果如下图