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

導出效果如下圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM