之前講過php實現Excel導出數據庫的隨筆,鏈接:https://www.cnblogs.com/nuanai/p/6727711.html
之前的項目用到較多的就是Excel導出,現在用到了Excel導入,就來把我的經驗和過程記錄一下。 作者:悅~ 博客地址:https://www.cnblogs.com/nuanai/
在導出中說的那個phpExcel的插件,可以繼續使用。因為我用的是thinkphp的框架做的導入數據庫功能,接下來是我的過程,請大家多多指教。
1.將下載下來的PHPExcel的包放置到自己項目中的thinkphp的里面,放置路徑:ThinkPHP\Library\Vendor\PHPExcel文件夾和PHPExcel.php文件,截圖如下:

2.放置好了之后就可以進行控制器和視圖頁面的編寫了。首先我是先寫的前端頁面,在Home的視圖文件夾里面的Dao的控制器的dao模板進行視圖的編寫,代碼如下:
<!--action是跳轉到的控制器的方法名字,用controller+方法名字,這是我常用的-->
<form action="__CONTROLLER__/daopei" method="post" enctype="multipart/form-data" style="width: 300px; float: left;">
<div class="layui-field-box">
<div class="layui-form-item" style="float: left;">
<!--因為是要上傳文件,所以這里的type類型是file類型,我給了一個name名字,因為name控制器要用到-->
<input type="file" name="dao" multiple="multiple" style="width: 200px;">
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<!--提交按鈕-->
<input type="submit" value="導入配包" />
</div>
</div>
</div>
</form>
3.視圖頁面寫完了之后就是寫我的控制器的方法了,在Home的控制器的文件夾中創建與視圖名字相同的控制器名字DaoController.class.php,daopei的方法邏輯如下:
(1)視圖的name傳過來的值,判斷File是否為空
(2)如果不為空,實例化上傳類,指定上傳類的一些屬性值,比如:上傳文件類型、文件大小,文件的保存路徑等
(3)接收前面的文件,給文件進行起名
(4)判斷前面傳過來的值有沒有錯誤,如果沒有就進行下一步
(5)導入PHPExcel類庫,創建PHPExcel對象,excel文件后綴名為.xls或.xlsx分別導入不同的類
(6)然后讀取excel表的內容,然候判斷表中的數據有沒有和數據庫中沖突的
具體的代碼如下:
public function daopei(){
if (!empty($_FILES)){
$upload = new \Think\Upload();// 實例化上傳類
$upload->maxSize=2097152 ;// 設置附件上傳大小
$upload->exts=array('xls','xlsx'); // 設置附件上傳類型
$upload->rootPath ="./Public/"; //根路徑
$upload->savePath="Excel/"; // 設置附件上傳目錄
//$upload->saveName = time().rand(0000,9999);
// 上傳文件
$info = $upload->uploadOne($_FILES["dao"]);
$exts = $info['ext'];
$filename = '.'.'/'.'Public'.'/'.$info['savepath'].$info['savename'];
// 獲取文件后綴
//$filename = $upload->rootPath.$info['savePath'].$info['savename']; // 生成文件路徑名
if(!$info) { // 上傳錯誤提示錯誤信息
$this->error($upload->getError());
}else{
vendor("PHPExcel"); // 導入PHPExcel類庫
$PHPExcel = new \PHPExcel(); // 創建PHPExcel對象,注意,不能少了\
if ($exts == 'xls') { // 如果excel文件后綴名為.xls,導入這個類
vendor("PHPExcel.PHPExcel.Reader.Excel5");
$PHPReader = new \PHPExcel_Reader_Excel5();
}else if($exts == 'xlsx') {
vendor("PHPExcel.PHPExcel.Reader.Excel2007");
$PHPReader = new \PHPExcel_Reader_Excel2007();
}
$PHPExcel=$PHPReader->load($filename);
$currentSheet = $PHPExcel->getSheet(0); // 獲取表中的第一個工作表,如果要獲取第二個,把0改為1,依次類推
$allColumn = $currentSheet->getHighestColumn(); // 獲取總列數
$allRow = $currentSheet->getHighestRow(); // 獲取總行數
$data=array();
for($j=1;$j<=$allRow;$j++){
//從A列讀取數據
for($k='A';$k<=$allColumn;$k++){
// 讀取單元格
$data[$j][]=$PHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
}
}
for ($i = 2; $i <= $allRow; $i++) {
$ztime = time();
$timee = microtime($ztime);
//數據庫中的字段名和excel表中的字段
$data_p['bid'] = $PHPExcel->getActiveSheet()->getCell("A" . $i)->getValue();
$data_p['name'] = $PHPExcel->getActiveSheet()->getCell("B" .$i)->getValue();
$data_p['money'] = $PHPExcel->getActiveSheet()->getCell("C" .$i)->getValue();
$data_p['smoney'] = $PHPExcel->getActiveSheet()->getCell("D" . $i)->getValue();
if($PHPExcel->getActiveSheet()->getCell("E" .$i)->getValue() == FALSE){
$data_p['sel'] = 0;
}else{
$data_p['sel'] = 1;
}
$data_p['sid'] = $PHPExcel->getActiveSheet()->getCell("F" .$i)->getValue();
$data_p['sname'] = $PHPExcel->getActiveSheet()->getCell("G" . $i)->getValue();
$data_p['snum'] = $PHPExcel->getActiveSheet()->getCell("J" . $i)->getValue();
$data_p['time'] = $PHPExcel->getActiveSheet()->getCell("M" . $i)->getValue();
$data_p['hao'] = $PHPExcel->getActiveSheet()->getCell("N" . $i)->getValue();
$data_p['dtime'] = $timee;
//判斷excel表中的值有沒有和數據庫中相同的
$result = M('dao')->where ("hao='{$data_p['hao']}'")->field('hao')->find();
if (empty($result['hao'])) {
$ex = M('dao')->add($data_p);
}
//$ex=M('dao')->add($data_p);
}
//判斷語句是否執行成功
if($ex){
$this->success("導入成功");
}else{
$this->error("導入失敗,可能數據已存在");// 提示錯誤
}
}
}else {
$this->display();
}
}
4.以上邏輯就是thinkphp的Excel的導入功能,其中重點的就是phpExcel的包的使用,其他的就是正常的語句
5.導入時的判斷有沒有相同的值,我是根據序號來進行判斷的,因為無論怎么導入,我這邊的Excel表以前導入的東西是不會刪除的,那樣序號是不會被別的東西代替,這樣導入的時候就不會因為序號的問題出錯了。
6.正常的thinkphp的使用這邊就不多作介紹了。希望可以對導入的小伙伴有幫助。
求大神指教:有沒有做過phpword導入數據庫的伙伴們,我想學習一下,可以給我留言,或者留下博客地址,謝謝
