1. 程式人生 > >thinkcmf+PHPExcel實現匯入匯出功能

thinkcmf+PHPExcel實現匯入匯出功能

thinkphp3.2+PHPExcel實現匯入匯出功能:

以下是我自己的實現方法,可能存在很多不足,歡迎大家提出改進...
實現步驟:

一:去官網http://phpexcel.codeplex.com/下載最新PHPExcel放到Vendor下,注意位置:ThinkPHP\Core\Library\Vendor

二:在StampController.class.php中新增如下的方法:

1、實現匯出功能:

1.1、匯出PHP程式碼:

/**
	 *  匯出資料庫中資料表的資料
     * @param $expTitle 名稱
     * @param $expCellName 引數
     * @param $expTableData 內容
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     */
    public function exportExcel($expTitle,$expCellName,$expTableData){

        $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//檔名稱
        $fileName = date('YmdHis');//or $xlsTitle 檔名稱可根據自己情況設定
        $cellNum = count($expCellName);
        $dataNum = count($expTableData);
		
        vendor("PHPExcel.PHPExcel");

        $objPHPExcel = new \PHPExcel();

       // $cellName = array('A','B','C','D','E','F','G','H','I','J');
		
		$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');
		
        $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(10);
//        $objPHPExcel->getActiveSheet(0)->mergeCells('A1:'.$cellName[$cellNum-1].'1');//合併單元格
//         $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $expTitle.'  Export time:'.date('Y-m-d H:i:s'));
       
	   //處理表資料
        for($i=0;$i<$cellNum;$i++){
            $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i].'1', $expCellName[$i][1]);
        }
        // Miscellaneous glyphs, UTF-8
        for($i=0;$i<$dataNum;$i++){
            for($j=0;$j<$cellNum;$j++){
                $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j].($i+2), $expTableData[$i][$expCellName[$j][0]]);
            }
        }
        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');
        header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新視窗列印inline本視窗列印
        $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');//Excel5為xls格式,excel2007為xlsx格式
        $objWriter->save('php://output');   
        exit;
    }
	
    /**
     * 匯出Stamp的資料
     */
    function export(){//匯出Excel
		//資料庫中的資料表
        $xlsName  = "Stamp";
        $xlsCell  = array(
            array('id','編號'),
            array('stamp_title','藝術品名稱'),
            array('stamp_uuid','證書編號'),
            array('stamp_src','證書圖片'),
            array('art_name','作者'),
            array('stamp_type','藝術品型別'),
			array('stamp_describe','藝術品描述'),
			array('stamp_spec','藝術品規格(尺寸)'),
			array('stamp_material','藝術品材質(例如:紙質)'),
			array('stamp_age','創作年份'),
        );
		$data['is_deleted'] = 0;
        $xlsModel = M('Stamp');
            //匯出所有的內容
            $xlsData  = $xlsModel->where($data)
				->Field('id,stamp_title,stamp_uuid,stamp_src,
				art_name,stamp_type,stamp_describe,stamp_spec,
				stamp_material,stamp_age')
				//->order('id desc')
				->select();
				
		/**
        foreach ($xlsData as $k => $v)
        {
            $xlsData[$k]['objtype']= $v['objtype'] == 1 ?'捐資助學':'不定項捐款';
        }
		*/

		/* 呼叫匯出方法 */
        $this->exportExcel($xlsName,$xlsCell,$xlsData);

    }

1.2、匯出匯入的html頁面程式碼:

<form class="well form-search" method="get" action="{:U('Stamp/index')}">
			證書名稱:
			<input type="text" name="stamp_title" style="width: 200px;" value="{$option['stamp_title']}" placeholder="請輸入姓名關鍵字...">
			證書編號: 
			<input type="text" name="stamp_uuid" style="width: 200px;" value="{$option['stamp_uuid']}" placeholder="請輸入證書編號...">
			<input type="submit" class="btn btn-primary" value="搜尋"/>
			<a href="{:U('Stamp/export')}" target="_blank"  class="btn btn-primary">匯出</a>
			<a href="{:U('Stamp/importStamp')}" target="_blank"  class="btn btn-primary">匯入</a>
		</form>

1.3、匯出的效果圖:



2、匯入功能:

2.1、php程式碼:

/**匯入資料頁面*/
    public function importStamp()
    {
        $this->display('exportstamp');
    }

public function exportstamp() {
		ini_set('memory_limit','1024M');
		if (!empty($_FILES)) {
		$config = array(
			'exts' => array('xlsx','xls'),
			'maxSize' => 3145728000,
			'rootPath' =>"./Data/",
			'savePath' => 'upload/Excle/',
			'subName' => array('date','Ymd'),
		);
		$upload = new \Think\Upload($config);
		if (!$info = $upload->upload()) {
			$this->error($upload->getError());
		}
		vendor("PHPExcel.PHPExcel");
		$file_name=$upload->rootPath.$info['excelData']['savepath'].$info['excelData']['savename'];
		$extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));//判斷匯入表格字尾格式
		if ($extension == 'xlsx') {
			$objReader =\PHPExcel_IOFactory::createReader('Excel2007');
			$objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');
		} else if ($extension == 'xls'){
			$objReader =\PHPExcel_IOFactory::createReader('Excel5');
			$objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');
		}
		$sheet =$objPHPExcel->getSheet(0);
		$highestRow = $sheet->getHighestRow();//取得總行數
		$highestColumn =$sheet->getHighestColumn(); //取得總列數
		//D('pro_info')->execute('truncate table pro_info'); //每次匯入清空原有資料
		for ($i = 2; $i <= $highestRow; $i++) {
			
			
			
			$data['stamp_title']= $objPHPExcel->getActiveSheet()->getCell("B".$i)->getValue();
            $data['stamp_uuid'] = $objPHPExcel->getActiveSheet()->getCell("C".$i)->getValue();
            $data['stamp_src']= $objPHPExcel->getActiveSheet()->getCell("D".$i)->getValue();
            $data['art_name']= $objPHPExcel->getActiveSheet()->getCell("E".$i)->getValue();
			$data['stamp_type']= $objPHPExcel->getActiveSheet()->getCell("F".$i)->getValue();
			$data['stamp_describe']= $objPHPExcel->getActiveSheet()->getCell("G".$i)->getValue();
			$data['stamp_spec']= $objPHPExcel->getActiveSheet()->getCell("H".$i)->getValue();
			$data['stamp_material']= $objPHPExcel->getActiveSheet()->getCell("I".$i)->getValue();
			$data['stamp_age']= $objPHPExcel->getActiveSheet()->getCell("J".$i)->getValue();
			//看這裡看這裡,這個位置寫資料庫中的表名

			if(M("Stamp")->where("stamp_uuid='".$data['stamp_uuid']."' and is_deleted = 0")->find()){
                   //上面註釋的程式碼是用藝術品名稱/證書編號判斷
                }else{
                    M("Stamp")->add($data);
                    $j++;
                }
			}
			$this->success('匯入成功!本次匯入數量:'.$j, U('Stamp/index'));
		} else {
			$this->error("請選擇上傳的檔案");
		}
	}
2.2、html頁面程式碼:
<body>
	<form method="post" class="form-horizontal js-ajax-forms" action="{:U('Stamp/exportstamp')}" enctype="multipart/form-data">
		<fieldset>
			<div class="control-group">
				<label class="control-label">匯入excel檔案:</label>
					<div class="controls">
						<input type="file" name="excelData">
						<span class="form-required">*</span>
					</div>
				</div>
		</fieldset>
		<div class="form-actions">
			<button type="submit" class="btn btn-primary js-ajax-submit">匯入</button>
		</div>
	</form>
</body>

2.3、效果展示