一.目的
先說為什么要寫這篇博客,我的目標是,將一個excel文件導入到一個ThinkPHP的項目的數據庫之中。這個看似簡單的目標卻讓我搞了兩天兩夜,原因主要有兩點,一個是自己沒有php的基礎,也不了解ThinkPHP這個框架,所以什么都是從零開始,許多可能基礎好的人可能一弄就好的東西我都需要百度很久。這篇博客針對於零基礎的同學,所以有的地方可能稍顯啰嗦,大神多多見諒!
二.介紹情況
1.我的數據表結構是這樣的
(。。。有沒有同學不知道怎么看數據庫的,反正我一開始連這個都不知道…這個是右擊wampserver,就會看見一個PHPadmin,點就可以了)
2.要導入的EXCEL文件是這樣的
三.事先准備
1.下載PHPExcel,這是待會兒我們處理EXCEL文件的第三方類庫,並且將下載好的文件復制到這個路徑下面wamp\www\ThinkPHP\Library\Vendor
里面是這樣子的
四.編寫代碼(我的注釋寫的比較詳細,就沒有在外面單獨說代碼了)
1.根據MVC模式,我們也來分別弄一個控制器(ExcelController.class.php),視圖(excel.html)和模型(UsersModel)。
這里補充一些ThinkPHP的基礎知識
*a.一般控制器的名字要和對應視圖名字一樣(去掉個Controller),控制器文件的后綴一定是.class.php。
b.模型的名字和對應數據表的名字是一樣的,當然要弄個前綴后綴什么的,比如,我的模型名字是UsersModel,那么它操縱的數據表就是think_users.*
2.控制器代碼<?php
namespace Home\Controller;
use Think\Controller;
Vendor('Excel.Classes.PHPExcel');/*引入PHPExcel類。我就是在這一步卡了超級久,總是報錯找不到這個類,
氣死人,網上面提示說用什么Import,require什么的,都不好使,就這個好使,當
然,別的方法到底行不行,我現在能力有限,搞不清楚.*/
class ExcelController extends CommonController {
//這個方法就是顯示出對應的html頁面,因為這個叫excelcontroller,所以它就會顯示excel.html。
public function excel()
{
$this->display();
}
/* 這個函數就是最重要的函數啦,用來讀取EXCEL文件,然后將它添加到數據庫中,下面會有詳細的解釋*/
public function add()
{/*下面三行是取得由頁面傳過來的excel文件,然后經過一些字符串處理,取得了文件名,用於判斷是不是excel文件*/
$tmp_file = $_FILES ['file_stu'] ['tmp_name'];
$file_types = explode ( ".", $_FILES ['file_stu'] ['name'] );
$file_type = $file_types [count ( $file_types ) - 1];
/*判別是不是.xls文件,判別是不是excel文件*/
if (strtolower ( $file_type ) != "xlsx" && strtolower ( $file_type ) != "xls")
{
$this->error ( '不是Excel文件,重新上傳' );
}
/*設置上傳路徑,就是上傳的excel文件保存的地方,注意路徑的分割是用的正斜杠不是反斜杠*/
$savePath = 'E:/php/wamp/www/Public/';
/*以時間來命名上傳的文件*/
$str = date ( 'Ymdhis' );
$file_name = $str . "." . $file_type;
/
/*是否上傳成功*/
if (!move_uploaded_file ( $_FILES ['file_stu'] ['tmp_name'], $savePath.$file_name ))
{
$this->error ( '上傳失敗' );
}
//特別注意這里PHPExel前面有一個反斜杠,\
//load里面是對應的excel文件,通過這個文件來生成PHPExcel
$objPHPExcel=\PHPExcel_IOFactory::load("E:/php/wamp/www/Public/".$file_name);
//獲取sheet0,就是excel第一個sheet
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow(); // 取得總行數
$highestColumn = $sheet->getHighestColumn(); // 取得總列數
//調用ThinkPHP中的M方法來實例化一個USERS模型,從而調用SQL操作
$User = M("Users");
//這個循環是一行一行的把excel里面的值取出來,存到$data數組里面
for($j=2;$j<=$highestRow;$j++)
{
$data['id']= $objPHPExcel->getActiveSheet()->getCell("A".$j)->getValue();//獲取A列的值
$data['userid']= $objPHPExcel->getActiveSheet()->getCell("B".$j)->getValue();
$data['username']= $objPHPExcel->getActiveSheet()->getCell("C".$j)->getValue();
$data['password']= md5($objPHPExcel->getActiveSheet()->getCell("D".$j)->getValue());
$data['usertype']= $objPHPExcel->getActiveSheet()->getCell("E".$j)->getValue();
$data['status']= $objPHPExcel->getActiveSheet()->getCell("F".$j)->getValue();
//調用add操作,將數據存入數據庫
$User->add($data);
}
}
}
3.excel.html文件
導入Excel表:
4.UsersModel文件(這個不重要,隨便寫點都行)<?php
namespace Home\Model;
use Think\Model;
/**
*
*/
class UsersModel extends Model
{
protected $_validate = array(
array('userid', '', '用戶名(學號)不能為空!', 0, 'unique', 1), //默認情況下用正則進行驗證
array('username', 'require', '請輸入你的真實姓名', 1), // 在新增的時候驗證name字段是否唯一
array('usertype', 'require', '請輸入你的賬號類型'),
array('email', '', '該郵箱已被占用', 0, 'unique', 1), // 新增的時候email字段是否唯一
array('phone', '', '該手機號碼已被占用', 0, 'unique', 1), // 新增的時候mobile字段是否唯一
// 正則驗證密碼 [需包含字母數字以及@*#中的一種,長度為6-22位]
array('password', '/^([a-zA-Z0-9@*#]{32})$/', '密碼格式不正確,請重新輸入!', 0),
array('repassword', 'password', '確認密碼不正確', 0, 'confirm'), // 驗證確認密碼是否和密碼一致
array('email', 'email', '郵箱格式不正確'), // 內置正則驗證郵箱格式
array('phone', '/^1[34578]\d{9}$/', '手機號碼格式不正確', 0), // 正則表達式驗證手機號碼
}
好像就沒什么了,最后弄完之后就是這樣的
第一次寫博客,寫的不好的地方,請多多見諒,歡迎大家在評論區和我交流!