• 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';
        }

    导出效果如下图

  • 相关阅读:
    CSS练习
    关于进度模型和进度计划
    信息管理系统/记录管理系统/配置管理系统
    分析技术在PMP中的应用
    渐进明细的几个点
    android手机内的通讯录数据库
    用FileExplorer查看android手机中的数据库
    VCard介绍
    org.apache.http.client.methods.HttpGet 转到定义找不到源代码
    Android : Your APK does not seem to be designed for tablets.
  • 原文地址:https://www.cnblogs.com/shengxihui/p/11291118.html
Copyright © 2020-2023  润新知