PHP導入Excel和導出Excel

導入Excel基本思路:

  1. 接收前端傳過來的Excel文件
  2. 將Excel文件轉化爲一個數組
  3. 將數組導入到數據庫

從百度下載一個PHPExcel類:https://github.com/PHPOffice/PHPExcel

用IOFactory.php類

//導入Excel
    public function importExcel()
    {
        require_once ROOT_PATH . 'PHPExcel/Classes/PHPExcel/IOFactory.php';//導入PHPExcel文件中的IOFactory.php類
        $file = request()->file('file');//獲取文件,file是請求的參數名
        $info = $file->move(ROOT_PATH . 'public' . DS . 'excel');//move將文件移動到項目文件的xxx
        if($info){
            $excel_path = $info->getSaveName();  //獲取上傳文件名
//            $excel_suffix = $info->getExtension(); //獲取上傳文件後綴
            $file_name = ROOT_PATH . 'public' . DS . 'excel' . DS . $excel_path;   //上傳文件的地址
            $obj_PHPExcel = \PHPExcel_IOFactory::load($file_name);  //加載文件內容
//            echo "<pre>";
            $excel_array=$obj_PHPExcel->getsheet(0)->toArray();   //轉換爲數組格式
            array_shift($excel_array);  //刪除第一個數組(標題);
            $arr  = reset($excel_array); //獲取字段名
            unset($excel_array[0]); //刪除字段名,剩下的都是存儲到數據庫的數據了!!
            $data = [];
            for($i = 0;$i < count($excel_array);$i++){
                foreach ($arr as $key => $value){
                    $data[$i][$value] = $excel_array[$i+1][$key];//使數組的鍵值就是數據表的字段名
                }
            }
            $res = GoodsModel::getInstance()->insertAll($data);
            var_dump($res);
        }
    }

導出Excel:

方法一:用PHPExcel.php類

//導出Excel
    public function exportExcel2(){
        // 引入phpexcel核心類文件
        require_once ROOT_PATH . 'PHPExcel/Classes/PHPExcel.php';
        //實例化excel類
        $objPHPExcel = new \PHPExcel();
        // 操作第一個工作表
        $objPHPExcel->setActiveSheetIndex(0);
        // 設置sheet名
        $objPHPExcel->getActiveSheet()->setTitle('xx列表');

        // 設置表格寬度
        $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(20);
        $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20);

        // 列名錶頭文字加粗
        $objPHPExcel->getActiveSheet()->getStyle('A1:J1')->getFont()->setBold(true);
        // 列表頭文字居中
        $objPHPExcel->getActiveSheet()->getStyle('A1:J1')->getAlignment()
            ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

        // 列名賦值
        $objPHPExcel->getActiveSheet()->setCellValue('A1', '貨品名稱');
        $objPHPExcel->getActiveSheet()->setCellValue('B1', '規格型號');
        $objPHPExcel->getActiveSheet()->setCellValue('C1', '包裝單位');
        $objPHPExcel->getActiveSheet()->setCellValue('D1', '規格單位');
        $objPHPExcel->getActiveSheet()->setCellValue('E1', '包裝規格');
        $objPHPExcel->getActiveSheet()->setCellValue('F1', '標準售價(元)');

        $field = ['name', 'spec_model', 'pack_unit', 'spec_unit','pack_spec', 'price'];//第二行列字段內容
        $res = GoodsModel::getInstance()
            ->field($field)
            ->where(['company_id'=>$this->company_id])
            ->limit(2)//限制條數
            ->select();

        // 數據起始行
        $row_num = 2;
        // 向每行單元格插入數據
        foreach($res as $value)
        {
            // 設置所有垂直居中
            $objPHPExcel->getActiveSheet()->getStyle('A' . $row_num . ':' . 'J' . $row_num)->getAlignment()
                ->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
            // 設置價格爲數字格式
            $objPHPExcel->getActiveSheet()->getStyle('F' . $row_num)->getNumberFormat()
                ->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00);
            // 居中
            $objPHPExcel->getActiveSheet()->getStyle('A' . $row_num . ':' . 'F' . $row_num)->getAlignment()
                ->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

            // 設置單元格數值
            $objPHPExcel->getActiveSheet()->setCellValue('A' . $row_num, $value['name']);
            $objPHPExcel->getActiveSheet()->setCellValue('B' . $row_num, $value['spec_model']);
            $objPHPExcel->getActiveSheet()->setCellValue('C' . $row_num, $value['pack_unit']);
            $objPHPExcel->getActiveSheet()->setCellValue('D' . $row_num, $value['spec_unit']);
            $objPHPExcel->getActiveSheet()->setCellValue('E' . $row_num, $value['pack_spec']);
            $objPHPExcel->getActiveSheet()->setCellValue('F' . $row_num, $value['price']);
//            $objPHPExcel->getActiveSheet()->setCellValue('F' . $row_num, $value['state'] ? '√' : '×');
//            $objPHPExcel->getActiveSheet()->setCellValue('G' . $row_num, date('Y-m-d h:i:s',$value['statetime']));
            $row_num++;
        }

        $outputFileName = 'goods_' . time() . '.xls';//導出的文件名
        $xlsWriter = new \PHPExcel_Writer_Excel5($objPHPExcel);
        header("Content-Type: application/force-download");//告訴瀏覽器強制下載
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:inline;filename="' . $outputFileName . '"');//attachment作爲附件下載,inline在線下載,filename設置文件名
        header("Content-Transfer-Encoding: binary");
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");//設置瀏覽器響應緩存
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Pragma: no-cache");
        $xlsWriter->save("php://output");
        echo file_get_contents($outputFileName);
    }

方法二:直接用頭部信息輸出excel格式文件,內容以表格形式展示 。這種方法可能會導致excel文件格式和擴展名不一致,文件無法用於導入,如果只是導出看看數據可用這種方法。推薦方法一

  1. 把數據從數據庫中查詢出來 
  2. 把查詢出來的數據拼接到table標籤中
  3. 調用設置好的header(頭域)函數
//導出Excel
    public function exportExcel($action,$id = []){
        switch ($action){
            case 'HP':
                $comment = ['貨品名稱','規格型號','包裝單位','規格單位','包裝規格','標準售價(元)'];//第一行標題內容
                $field = ['name', 'spec_model', 'pack_unit', 'spec_unit','pack_spec', 'price'];//第二行列字段內容
                if($id){//查詢指定的幾條數據
                    $res = GoodsModel::getInstance()
                        ->field($field)
                        ->where(['company_id'=>$this->company_id,'id'=>['in',$id]])
                        ->select();
                }else{//查詢所有數據
                    $res = GoodsModel::getInstance()
                        ->field($field)
                        ->where(['company_id'=>$this->company_id])
//                        ->limit(2)//限制條數
                        ->select();
                }
                break;
            default:
                $this->displayByError('行動有誤,撤退!!');
        }
        $strTable ='<table width="500" border="1">';
        $strTable .= '<tr>';
        //第一行的標題
        foreach ($comment as $key => $value){
            $strTable .= '<td style="text-align:left;font-size:16px;" width="*">'.$value.'</td>'."\r\n";
        }
        $strTable .= '</tr>';

        //第二行的列字段
        $strTable .= '<tr>';
        foreach ($field as $key => $value){
            $strTable .= '<td style="text-align:left;font-size:14px;" width="*">'.$value.'</td>'."\r\n";
        }
        $strTable .= '</tr>';

        //第三行開始是導入數據庫的數據
        $strTable .= '<tr>';
        for ($i = 0;$i < count($res);$i++){
            for ($j = 0; $j < count($field);$j++){
                $strTable .= '<td style="text-align:left;font-size:12px;" rowspan="*">'.$res[$i][$field[$j]].'</td>'."\r\n";
            }
            $strTable .= '</tr>';
        }
        $strTable .='</table>';
        unset($res);
        $this->downloadExcel($strTable,'GoodsExcel');
        exit();
    }

    /**
     * 導出excel需要設置的header
     * @param $strTable	 /表格內容
     * @param $filename /文件名
     */
    function downloadExcel($strTable,$filename)
    {
        header("Content-type: application/vnd.ms-excel");//將查詢結果導出到Excel
        header("Content-Type: application/force-download");//告訴瀏覽器強制下載
        header("Content-Disposition: attachment; filename=".$filename."_".date('Y-m-d').".xls");//attachment作爲附件下載,inline在線下載,filename設置文件名
        header('Expires:0');//瀏覽器不會響應緩存
        header('Pragma:public');//Public指示響應可被任何緩存區緩存。
        echo '<html><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'.$strTable.'</html>';
    }

導出Excel參考文獻:https://blog.csdn.net/qq_41211900/article/details/81068901

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章