【轉】PHPCMS+PHPExcel實現後臺數據導入導出功能
首先,上圖之中的紅色框框是沒有的,我們想要給他加上,當然是要改HTML頁面啦,廢話,我們跟ECSHOP一樣由PHP路徑找模板;
看看路由原理:
首先,上圖之中的紅色框框是沒有的,我們想要給他加上,當然是要改HTML頁面啦,廢話,我們跟ECSHOP一樣由PHP路徑找模板;
看看路由原理:
再看看這個板塊的路由哈,別找錯啦,大兄弟
然後我們很快找到控制器吧
當然,你會發現init方法裏面竟然引用了很多個HTML(tpl後綴)至於是哪一個你就需要一個個試了,並看懂html之中的if語句還不如一個個加H1標簽或者刪除來的快
最終不負眾望找到這個HTML前端頁面,直接加上form表單和提交按鈕,之所以加上那個if語句是因為,我們不能在每個欄目添加數據那兒都顯示這個excel導入數據吧
那個action的地址呢?和那個方法所在的位置我想你是最模糊的吧,這裏需要提醒得是,我們不能用原生SQL去插入數據,必須按照原生的數據插入的去拼接sql入庫語句、
不然前臺查詢數據是查不到的,為什麽,我也不知道,真心找不到,靠
入庫,當然是得看原生的入庫的表單了:
於是呢,action我們也找到,方法也找到;
就在那個方法旁邊加一個方法作為導入excel表單的action吧;
照著原生添加數據的 方法,我們很容易找到入庫的數據就是$_POST[‘info‘],調用cms裏面的那個對象哪個方法進行入庫,還有什麽設定,一定不能忘了
public function public_add_excel(){ $file_path=$_FILES[‘file_stu‘][‘tmp_name‘]; move_uploaded_file($file_path, ‘./tmp.xls‘); // require_once(‘./PHPExcel.php‘); pc_base::load_sys_class(‘PHPExcel‘); $array=format_excel2array(‘./tmp.xls‘); array_shift($array); //將數組入庫按照官方方法入庫 $catid=33; foreach ($array as $key => $value) { define(‘INDEX_HTML‘,true); $catid = 33; $category = $this->categorys[$catid]; if($category[‘type‘]==0) { $modelid = $this->categorys[$catid][‘modelid‘]; $this->db->set_model($modelid); //如果該欄目設置了工作流,那麽必須走工作流設定 $setting = string2array($category[‘setting‘]); $workflowid = $setting[‘workflowid‘]; $_POST=array(); $_POST[‘info‘][‘status‘]=99; $_POST[‘info‘][‘catid‘]=33; $_POST[‘info‘][‘template‘]=""; $_POST[‘info‘][‘inputtime‘]=""; $_POST[‘info‘][‘title‘]=$value[‘A‘]; $_POST[‘info‘][‘description‘]=$value[‘B‘]; $_POST[‘info‘][‘chanpinshengchanriqi‘]=$value[‘C‘]; $this->db->add_content($_POST[‘info‘]);//添加數據 } } echo "導入成功";die; }
入庫代碼就是這裏;
現在說說form接收到表單POST過來的excel文件的操作;
首先明白,當文件上傳的時候,都會有一個臨時文件夾存放該文件,此時excel存儲在一個臨時文件夾,但是拿不到來使用,看上一篇文章知道,我們要的是excel文件所在的位置
於是
$file_path=$_FILES[‘file_stu‘][‘tmp_name‘]; move_uploaded_file($file_path, ‘./tmp.xls‘); // require_once(‘./PHPExcel.php‘); pc_base::load_sys_class(‘PHPExcel‘); $array=format_excel2array(‘./tmp.xls‘); array_shift($array);
表單的action第一步就是move_upload_file(文件路徑,保存路徑+保存文件名字+後綴)函數將臨時文件移動到???
入口文件位置為準,入口文件的當前文件夾當然是:
至於那個下面的引入excel第三方類怎樣引入就不用我說了吧!!
還有excel數據變成數組數據再foreach還有為何將數組第一個元素shift調就不用我說了吧;
成功後就是醬紫啦!
現在附送一個原來弄的原生SQL進行入庫的想法,復習復習:
TPL或者HTML模板裏面調用方法可以用表單提交的action地址,在php文件function之中調用公共方法直接用名字,引用類用那個標簽、
現在看看導出數據:
頁面效果圖:
前端代碼:
function代碼:
function write_excel($savename=null){ // import(‘Com.PHPExcel‘); //引入excel // import(‘Com.PHPExcel.IOFactory‘); // import(‘Com.PHPExcel.Writer.Excel5‘); pc_base::load_sys_class(‘PHPExcel‘); $PHPExcel = new \PHPExcel(); $PHPExcel->getActiveSheet()->setCellValue(‘A1‘, ‘標題‘); $PHPExcel->getActiveSheet()->setCellValue(‘B1‘, ‘描述‘); $PHPExcel->getActiveSheet()->setCellValue(‘C1‘, ‘生產日期‘); $abc = array(); // $res = D(‘customer‘)->where("id in ($id)")->order(‘id asc‘)->select(); $this->db->table_name ="v9_chanpinxinxi"; $where=""; $res=$this->db->select($where,‘title,description,chanpinshengchanriqi‘); if($res){ $i = 2; foreach ($res as $v) { $PHPExcel->getActiveSheet()->setCellValue(‘A‘.$i,$v[‘title‘]); $PHPExcel->getActiveSheet()->setCellValue(‘B‘.$i,$v[‘description‘]); $PHPExcel->getActiveSheet()->setCellValue(‘C‘.$i,$v[‘chanpinshengchanriqi‘]); if($v[‘option‘]){ $option = unserialize($v[‘option‘]); foreach ($option as $key => $value) { if(!in_array($key,$abc)){ $abc[] = $key; } $key2 = chr(ord($key)+3); $PHPExcel->getActiveSheet()->setCellValue($key2.$i,$value); } } $i++; } foreach ($abc as $v) { $k = chr(ord($v)+3); $PHPExcel->getActiveSheet()->setCellValue($k.‘1‘,$v); } // $excel = D(‘game‘)->field(‘excel‘)->where($game_id)->find(); // $savename = $savename ? $savename : $excel; if(is_array($savename)){ $savename =‘./‘.$savename; } if(file_exists($savename)){ unlink($savename); } $write = new \PHPExcel_Writer_Excel5($PHPExcel); header("Pragma: no-cache"); $write->save($savename); return true; }else{ return $res; } } public function public_get_excel(){ // $res = D(‘customer‘)->field(‘name,iccid,mobile‘)->where("id in ($id)")->select(); // $sql="select title,description,chanpinshengchanriqi from v9_chanpinxinxi"; $this->db->table_name ="v9_chanpinxinxi"; $where=""; $res=$this->db->select($where,‘title,description,chanpinshengchanriqi‘); //$file = C(‘UNLINK_PATH‘).$res[‘mobile‘]; $file = ‘./‘.uniqid(); $this->write_excel($file); //$fileName = $res[‘name‘].‘.xls‘; $fileName = uniqid().‘.xls‘; $fp = fopen($file,‘rb‘); if(!$fp){ header(‘HTTP/1.1 404 Not Found‘); echo "Error: 404 Not Found.(server file path error)<!-- Padding --> <!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --> <!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding --><!-- Padding -->"; exit; } $encoded_filename = urlencode($fileName); $encoded_filename = str_replace("+", "%20", $encoded_filename); header(‘HTTP/1.1 200 OK‘); header( "Pragma: public" ); header( "Expires: 0" ); header("Content-type: application/octet-stream"); header("Content-Length: ".filesize($file)); header("Accept-Ranges: bytes"); header("Accept-Length: ".filesize($file)); $ua = $_SERVER["HTTP_USER_AGENT"]; if (preg_match("/MSIE/", $ua)) { header(‘Content-Disposition: attachment; filename="‘ . $encoded_filename . ‘"‘); } else if (preg_match("/Firefox/", $ua)) { header(‘Content-Disposition: attachment; filename*="utf8\‘\‘‘ . $fileName . ‘"‘); } else { header(‘Content-Disposition: attachment; filename="‘ . $fileName . ‘"‘); } ob_start(); ob_clean(); flush(); fpassthru($fp); }
需要提一下的是:
在擴展方法$db實例化的數據庫模型是不存在的;
在cms之中的數據庫查詢語句尤其特定的標簽(在上面有):
還有就是,糾正一下,以前發的那個導入導出excel的,好像只需要引入那個PHPExcel.class.php文件就闊以了;
看到這個頁面就很開心了對吧
附件看文件
【轉】PHPCMS+PHPExcel實現後臺數據導入導出功能