在PHP項目經常要導入導出Excel表單。
先去下載PHPExcel類庫文件,放到相應位置。
我在thinkphp框架中的位置為ThinkPHP/Library/Org/Util/
導入
在頁面上傳excel文件提交到后台,利用form表單提單即可
<form method="post" enctype="multipart/form-data" action="" > <input type="submit" value="導入" /> <input type="file" name="excel" /> </form>
提交到后台后進行上傳處理,這是一個執行上傳的方法
public function data(){ if(IS_POST){ //設置編碼防止亂碼 header("Content-Type:text/html;charset=utf-8"); $upload = new \Think\Upload();// 實例化上傳類 $upload->maxSize = 3145728 ;// 設置附件上傳大小 $upload->exts = array('xls','xlsx','csv');// 設置附件上傳類 $upload->rootPath = 'Uploads/'; $upload->savePath = ''; // 設置附件上傳目錄 // 上傳文件 $info = $upload->uploadOne($_FILES['excel']); $filename = 'Uploads/'.$info['savepath'].$info['savename']; $exts = $info['ext']; // var_dump($info); if(!$info) {// 上傳錯誤提示錯誤信息 $this->error($upload->geterror()); }else{// 上傳成功 $this->data_import($filename, $exts); } } }
上傳文件的格式設為excel的格式,xls,xlsx,csv均可支持
然后對上傳后的文件內容進行讀取導入,下面是一個讀取的方法。
protected function data_import($filename, $exts='xls') { //導入PHPExcel類庫,因為PHPExcel沒有用命名空間,只能inport導入 import("Org.Util.PHPExcel"); //創建PHPExcel對象,注意,不能少了\ $PHPExcel=new \PHPExcel(); //如果excel文件后綴名為.xls,導入這個類 if($exts == 'xls'){ import("Org.Util.PHPExcel.Reader.Excel5"); $PHPReader=new \PHPExcel_Reader_Excel5(); }else if($exts == 'xlsx'){ import("Org.Util.PHPExcel.Reader.Excel2007"); $PHPReader=new \PHPExcel_Reader_Excel2007(); }else if($exts == 'csv'){ import("Org.Util.PHPExcel.Reader.CSV"); $PHPReader=new \PHPExcel_Reader_CSV(); } //var_dump($PHPReader);die; //載入文件 $PHPExcel=$PHPReader->load($filename); //獲取表中的第一個工作表,如果要獲取第二個,把0改為1,依次類推 $currentSheet=$PHPExcel->getSheet(0); //獲取總列數 $allColumn=$currentSheet->getHighestColumn(); //獲取總行數 $allRow=$currentSheet->getHighestRow(); //循環獲取表中的數據,$currentRow表示當前行,從哪行開始讀取數據,索引值從0開始 for($currentRow=1;$currentRow<=$allRow;$currentRow++){ //從哪列開始,A表示第一列 for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){ //數據坐標 $address=$currentColumn.$currentRow; //讀取到的數據,保存到數組$arr中 $data[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue(); } } $this->save_import($data); }
用上面這個方法獲得excel里的數據,然后用save_import把獲得的數據存入數據庫
//保存導入數據 public function save_import($data) { //print_r($data);exit; $bath = M('data'); //插入新數據時先清空原表數據,沒有這個需要可以注釋下面步驟 //M('mobile')->where('1=1')->delete(); foreach ($data as $k=>$v){ //$mobile=$v['A']; //注:****** (1)處 $info['a'] = $v['A']; $info['b'] = $v['B']; $info['c']=$v['C']; $info['d_water']=$v['D']; $info['e']=$v['E']; $info['f']=$v['F']; $arr[] = $info; } $result=$bath->addall($arr); if($result){ $this->success('數據導入成功'); }else{ $this->error('數據導入失敗'); } //print_r($info); }
導出相對於導入就容易的多,從數據庫讀出數據做出相應的處理
public function excel(){ //引入PHPExcel庫文件 Vendor('PHPExcel.Classes.PHPExcel'); //創建對象 $excel = new PHPExcel(); //Excel表格式,這里簡略寫了8列 $letter = array('A','B','C','D','E','F','F','G'); //表頭數組 $tableheader = array('序號','客棧名稱','客棧地址','座機','手機','QQ','郵箱'); //填充表頭信息 for($i = 0;$i < count($tableheader);$i++) { $excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]"); } //表格數組 $data = array( array('1','B','C','D','E','F','G'), array('2','B','C','D','E','F','G'), array('3','B','C','D','E','F','G'), array('4','B','C','D','E','F','G'), array('5','B','C','D','E','F','G'), array('6','B','C','D','E','F','G'), array('7','B','C','D','E','F','G'), ); //填充表格信息 for ($i = 2;$i <= count($data) + 1;$i++) { $j = 0; foreach ($data[$i - 2] as $key=>$value) { $excel->getActiveSheet()->setCellValue("$letter[$j]$i","$value"); $j++; } } //創建Excel輸入對象 $write = new PHPExcel_Writer_Excel5($excel); header("Pragma: public"); header("Expires: 0"); header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); header("Content-Type:application/force-download"); header("Content-Type:application/vnd.ms-execl"); header("Content-Type:application/octet-stream"); header("Content-Type:application/download");; header('Content-Disposition:attachment;filename="客棧信息.xls"'); header("Content-Transfer-Encoding:binary"); $write->save('php://output');
前台頁面只需要執行此方法即可