PHPExcel 表格匯入資料程式碼解析(二)
前面大概講了phpexcel用表格匯入資料到資料庫中的教程,今天會詳細剖析函式程式碼,話不多說,先上程式碼:
public function upload() { ini_set('memory_limit','1024M'); //設定一個指令碼所能夠申請到的最大記憶體位元組數,這有利於寫的不好的指令碼消耗伺服器上的可用記憶體 if (!empty($_FILES)) { $config = array( 'exts' => array('xlsx','xls'), 'maxSize' => 3145728000, 'rootPath' =>"./Public/", 'savePath' => 'Uploads/', 'subName' => array('date','Ymd'), );//設定相關引數 $upload = new ThinkUpload($config);//定義tp的Upload物件 if (!$info = $upload->upload()) { //$upload呼叫upload()函式並賦值給$info $this->error($upload->getError()); } vendor("PHPExcel.PHPExcel");//thinkphp3.2.3中使用Vendor載入第三方類庫 $file_name=$upload->rootPath.$info['photo']['savepath'].$info['photo']['savename']; //檔名稱 $extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));//判斷匯入表格字尾格式 if ($extension == 'xlsx') { $objReader =PHPExcel_IOFactory::createReader('Excel2007'); //建立一個特定的讀取類,讀取型別為‘Excel2007’ $objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');//讀取檔案$file_name } else if ($extension == 'xls'){ $objReader =PHPExcel_IOFactory::createReader('Excel5'); $objPHPExcel =$objReader->load($file_name, $encode = 'utf-8'); } $sheet =$objPHPExcel->getSheet(0);//getSheet()獲取表集合 $highestRow = $sheet->getHighestRow();//取得總行數 $highestColumn =$sheet->getHighestColumn(); //取得總列數 D('pro_info')->execute('truncate table pro_info'); for ($i = 2; $i <= $highestRow; $i++) { $data['pId'] =$objPHPExcel->getActiveSheet()->getCell("A" . $i)->getValue(); $data['pName'] =$objPHPExcel->getActiveSheet()->getCell("B" .$i)->getValue(); $data['pPrice'] =$objPHPExcel->getActiveSheet()->getCell("C" .$i)->getValue(); $data['pCount'] = $objPHPExcel->getActiveSheet()->getCell("D". $i)->getValue(); D('pro_info')->add($data); } $this->success('匯入成功!'); } else { $this->error("請選擇上傳的檔案"); } }
主要是流程圖如下:
在上面程式碼上基本上都有註釋,看不懂的沒關係,下面我就幾個點聊聊好了:
$upload = new ThinkUpload($config);//例項化上傳類
TP檔案上傳:
屬性 |
描述 |
---|---|
maxSize |
檔案上傳的最大檔案大小(以位元組為單位),0為不限大小 |
rootPath |
檔案上傳儲存的根路徑 |
savePath |
檔案上傳的儲存路徑(相對於根路徑) |
saveName |
上傳檔案的儲存規則,支援陣列和字串方式定義 |
saveExt |
上傳檔案的儲存字尾,不設定的話使用原檔案字尾 |
replace |
存在同名檔案是否是覆蓋,預設為false |
exts |
允許上傳的檔案字尾(留空為不限制),使用陣列或者逗號分隔的字串設定,預設為空 |
mimes |
允許上傳的檔案型別(留空為不限制),使用陣列或者逗號分隔的字串設定,預設為空 |
autoSub |
自動使用子目錄儲存上傳檔案 預設為true |
subName |
子目錄建立方式,採用陣列或者字串方式定義 |
hash |
是否生成檔案的hash編碼 預設為true |
callback |
檢測檔案是否存在回撥,如果存在返回檔案資訊陣列 |
設定好上傳的引數後,就可以呼叫ThinkUpload
類的upload方法進行附件上傳,如果失敗,返回false,並且用getError方法獲取錯誤提示資訊;如果上傳成功,就返回成功上傳的檔案資訊陣列。
$info = $upload->upload();
-
if(!$info)
{// 上傳錯誤提示錯誤資訊
$this->error($upload->getError());
}else{// 上傳成功 獲取上傳檔案資訊
-
foreach($info as $file){
echo $file['savepath'].$file['savename'];
-
}
-
}
屬性 |
描述 |
---|---|
key |
附件上傳的表單名稱 |
savepath |
上傳檔案的儲存路徑 |
name |
上傳檔案的原始名稱 |
savename |
上傳檔案的儲存名稱 |
size |
上傳檔案的大小 |
type |
上傳檔案的MIME型別 |
ext |
上傳檔案的字尾型別 |
md5 |
上傳檔案的md5雜湊驗證字串 僅當hash設定開啟後有效 |
sha1 |
上傳檔案的sha1雜湊驗證字串 僅當hash設定開啟後有效 |
檔案上傳成功後,就可以使用這些檔案資訊來進行其他的資料操作,例如儲存到當前資料表或者單獨的附件資料表
$model = M('Photo');
// 取得成功上傳的檔案資訊
$info = $upload->upload();
// 儲存當前資料物件
-
$data['photo']
= $info[0]['savename'];
-
$data['create_time']
= NOW_TIME;
-
$model->add($data);
PHPExcel_IOFactory 讀取檔案:
vendor("PHPExcel.PHPExcel");
$objReader =PHPExcel_IOFactory::createReader('Excel2007');
//建立一個特定的讀取類,讀取型別為‘Excel2007’
$objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');
//讀取檔案$file_name
1.使用 PHPExcel_IOFactory 讀取檔案
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
2.使用一個特定的讀取類,讀取檔案
$objReader = new PHPExcel_Reader_Excel5();
$objPHPExcel = $objReader->load($inputFileName);
3.使用 PHPExcel_IOFactory 建立一個特定的讀取類
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
讀取型別有:
$inputFileType = 'Excel5';
$inputFileType = 'Excel2007';
$inputFileType = 'Excel2003XML';
$inputFileType = 'OOCalc';
$inputFileType = 'SYLK';
$inputFileType = 'Gnumeric';
$inputFileType = 'CSV';
4.使用 PHPExcel_IOFactory 來鑑別檔案應該使用哪一個讀取類
$inputFileType = PHPExcel_IOFactory::identify($inputFileName);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFileName);
獲取表集合:
$sheet =$objPHPExcel->getSheet(0);//getSheet()獲取表集合
$highestRow = $sheet->getHighestRow();//取得總行數
$highestColumn =$sheet->getHighestColumn(); //取得總列數
迴圈讀取資料: