最近做了一个需求,导出统计数据,因为需要同时导出多个不同的统计数据,所以不能像以往导出数据列表一样去实现这个需求,刚好空下来就记录一下(PHPExcel导出Excel多sheet合并)

一、主要使用的几个方法

 createSheet()                 //创建工作表
setActiveSheetIndex(); //设置活动工作表索引(以工作表索引号选择需要操作的工作表)
setActiveSheetInde() //获取活动工作表
setTitle() //设置工作表名称
mergeCells() //合并单元格
setCellValue() //设置合并后的单元格内容
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';
}

导出效果如下图

PHPExcel导出工作蒲(多表合并)教程+详细代码解读的更多相关文章

  1. oracle的多表合并查询-工作心得

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 发布时间: 2018 年 11 月 29 日 原地址:https://niaobulashi.com/archives/oracle-select-al ...

  2. phpExcel导出excel加超级链接的实例代码[转]

    phpexcel实现的导出excel文件的代码,且可以在excel文件中加入超级链接. 说明:PHPExcel的开发包Tests目录有详细使用实例.以下代码支持中文,注意文件编码,文件保存为utf-8 ...

  3. Mysql多表合并以及连接问题

    目的 1.为了备战过两天的面试,我又重新给孙老师的课件看了一遍,学累了,就写写自己的新的体会,和遇到的问题,来进行一个记录,这是知识产出的过程,据说可以帮助我学习,看视频什么的都是被动学习,不进行及时 ...

  4. Sqoop -- 用于Hadoop与关系数据库间数据导入导出工作的工具

    Sqoop是一款开源的工具,主要用于在Hadoop相关存储(HDFS.Hive.HBase)与传统关系数据库(MySql.Oracle等)间进行数据传递工作.Sqoop最早是作为Hadoop的一个第三 ...

  5. thinkphp3.2+PHPExcel导出查询数据到excel表格的实例

    首先下载PHPExcel插件,我们需要把PHPExcel.php和PHPExcel文件夹放到D:\XAMPP\htdocs\fsxb\ThinkPHP\Library\Vendor\PHPExcel目 ...

  6. oracle如何导出和导入数据库表

    oracle如何导出和导入数据库表 oracle如何将项目中的表导出后在导入自己的数据库中,这是一个完整的操作,对于数据库备份或在本地查看数据验证数据进场用到,一般情况下我都用dos黑窗口进行操作,简 ...

  7. oracle如何导出和导入数据库/表

    oracle如何导出和导入数据库/表 oracle如何将项目中的表导出后在导入自己的数据库中,这是一个完整的操作,对于数据库备份或在本地查看数据验证数据进场用到,一般情况下我都用dos黑窗口进行操作, ...

  8. 20171113xlVba指定文件夹多簿多表分表合并150

    '2017年11月13日 'Next_Seven '功能:文件夹对话框指定文件夹下,合并(复制粘贴)每个Excel文件内的指定子表内容, '在名为"设置"的工作表A列 输入汇总子表 ...

  9. 小米3移动版 分区 调整/合并教程(16GB/64GB)

    (必读)版权声明:米3移动版TWRP Recovery为XueferH适配,分区脚本以及双数据置换脚本的知识产权,智力成果权归XueferH所有. 注:此教程仅适用于Xiaomi MI 3-移动版(1 ...

随机推荐

  1. ubuntu15.4、16.4、17.4设置nginx自启动

    ubuntu15.4.16.4.17.4设置nginx自启动记录个小问题,备忘录.花了大半天的时间研究这个,网上大多ubuntu.centos的配置nginx开机自启的都是之前的 Upstart/Sy ...

  2. Sap Netweaver命令执行

    URL/ctc/servlet/com.sap.ctc.util.ConfigServlet?param=com.sap.ctc.util.FileSystemConfig;EXECUTE_CMD;C ...

  3. swoole安装异步reids

    /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-async ...

  4. 通过rocketmq思考一下mq的设计取舍

    1. RocketMQ路由中心NameServer 2. RocketMQ消息发送 3. RocketMQ消息存储 4. RocketMQ消息消费 5. 消息过滤FiterServer 6. Rock ...

  5. CTU OPEN 2017 Pond Cascade /// 思维

    题目大意: 给定N F 给定N个水池的大小 每个水池都以流量F开始注水 当位置较前的水池注满后 水会溢出到下一个水池 求 最后一个水池开始溢出的时间 和 所有水池全部注满的时间 1.最后一个n水池开始 ...

  6. 【Movie】绿皮书

    今天和室友一起去看了<绿皮书>,一部获得奥斯卡的电影. 起初我是没什么太大期望的,纯粹是因为特价票10块钱,加上身边一个小姐姐的力荐. 看完我觉得,啊不愧是奥斯卡电影啊.推荐. 以下可能会 ...

  7. python--函数基础一

    一.函数意义:可读性,复用性强 # def my_len(s): #def 关键词开头,my_len函数名 # i=0 # for k in s: # i+=1 # print(i) # return ...

  8. python--知识小结和集合

    知识小结 一. = 表示赋值 ==表示比较值的大小 is 比较内存地址 二. 数字小数据池:在-5~256之内,id在电脑里是一样的 字符串id一样要求: ①:不能有特殊字符 ②:s(一个单字符)*2 ...

  9. 例行性工作排程 (crontab)

    说白了,就是一些例行工作的日常执行的排序程序 Linux  工作排程的种类:  at,cron 鸟叔说,atd并不是在所有版本都是开启的,但是centos7默认是开启的 [root@localhost ...

  10. springmvc基于注解的权限控制

    一.权限码 /** * @Title: AuthCode.java * @Package cn.com.kamfu.auth * @Description: TODO(用一句话描述该文件做什么) * ...