首先,去PHPExcel官方網站下載PHPExcel,官方地址爲;http://phpexcel.codeplex.com/.我下的是1.8.0版本的.解壓後發現還是蠻大的,有十幾M,不知道其他版本是不是會小點.
把解壓好的PHPExcel文件放在ThinkPHP的Vender文件夾下(專門放第三方類庫的),如下圖
其次,創建Excel轉換數組類,並把它放在ThinkPHP\Extend\Library\ORG\Util目錄下
class ExcelToArrary {
public function __construct() {
Vendor("PHPExcel.Classes.PHPExcel");//引入phpexcel類(留意路徑,不瞭解路徑可以查看下手冊)
Vendor("PHPExcel.Classes.PHPExcel.IOFactory"); //引入phpexcel類(留意路徑)
}
public function read($filename,$encode,$file_type){
if(strtolower ( $file_type )=='xls')//判斷excel表類型爲2003還是2007
{
Vendor("PHPExcel.Classes.PHPExcel.Reader.Excel5"); //引入phpexcel類(留意路徑)
$objReader = PHPExcel_IOFactory::createReader('Excel5');
}elseif(strtolower ( $file_type )=='xlsx')
{
Vendor("PHPExcel.Classes.PHPExcel.Reader.Excel2007");//引入phpexcel類(留意路徑)
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
}
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load($filename);
$objWorksheet = $objPHPExcel->getActiveSheet();
$highestRow = $objWorksheet->getHighestRow();
$highestColumn = $objWorksheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
$excelData = array();
for ($row = 1; $row <= $highestRow; $row++) {
for ($col = 0; $col < $highestColumnIndex; $col++) {
$excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue();
}
}
return $excelData;
}
}
如右圖
現在來說Excel,表格的結構樣式和mysql樣式要類似,表格樣式如下(本人對Excel使用只是一般,所以如果有Excel大神做的報表,不知後果如何).
前端頁面相關代碼:
<div>
<form method="post" action="{:U('Index/upload')}" enctype="multipart/form-data">
<font>導入Excel數據:</font>
<label for="file_stu">上傳</label>
<input name="file_stu" type="file" id="file_stu" />
<h3>溫馨提示:</h3>
<p>請確認您的Excel表格類型是xls的,以免出現兼容問題.</p>
<inputtypeinputtype="submit" class="sure" value="導入" />
</form>
</div>
最後,控制器部分使用了Thinkphp自帶的上傳類,使用unlink()函數是爲了刪除上傳的excel表格,以免文件夾存入過多文件,調試代碼時可先註釋掉.或者不寫也行,把刪除文件的工作交給你們的運維.代碼中foreach循環部分$v[]裏的0, 1,2可以改動以下看看與Excel表格裏的內容是什麼關係.可以把數組打印出來看一看,你就很清楚了
相關代碼:
public function upload(){
import('ORG.Util.ExcelToArrary');//導入excelToArray類
if (! empty ( $_FILES ['file_stu'] ['name'] )){
import('ORG.Net.UploadFile');
$upload = new UploadFile();// 實例化上傳類
$upload->maxSize = 3145728 ;// 設置附件上傳大小
$upload->allowExts = array('xls', 'xlsx');// 設置附件上傳類型
$upload->savePath = './Uploads/';// 設置附件上傳目錄
if(!$upload->upload()) {// 上傳錯誤提示錯誤信息
$this->error($upload->getErrorMsg());
}else{// 上傳成功 獲取上傳文件信息
$info = $upload->getUploadFileInfo();
}
}else{
$this->error('(⊙o⊙)~沒傳數據就導入?!你在逗我?!');
}
//dump($info);die;
$ExcelToArrary=new ExcelToArrary();//實例化
$res=$ExcelToArrary->read($info[0]['savepath'].$info[0]['savename'],"UTF-8",$info[0]['extension']);//傳參,判斷office2007還是office2003
$res = array_slice($res,1); //爲了去掉Excel裏的表頭,也就是$res數組裏的$res[0];
//dump($res);
foreach ( $res as $k => $v ){ //循環excel表
$data[$k]['mobile'] = $v [0];//創建二維數組
$data[$k]['name'] = $v [1];
$data[$k]['duty'] = $v [2];
}
//dump($data);die;
$result=M('appkey')->addAll($data);
if(!$result){
$this->error('導入數據庫失敗');
exit();
}else{
$filename = './Uploads/'.$info[0]['savename'];//上傳文件絕對路徑,unlink()刪除文件函數
if (unlink($filename)) {
$this->success ( '導入成功' );
}else{
$this->error('緩存刪除失敗');
}
}
}