1. 程式人生 > 其它 >PHPExcel 表格匯入資料程式碼解析(二)

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方法獲取錯誤提示資訊;如果上傳成功,就返回成功上傳的檔案資訊陣列。

  1. $info = $upload->upload();
  2. if(!$info) {// 上傳錯誤提示錯誤資訊
  3. $this->error($upload->getError());
  4. }else{// 上傳成功 獲取上傳檔案資訊
  5. foreach($info as $file){
  6. echo $file['savepath'].$file['savename'];
  7. }
  8. }

屬性

描述

key

附件上傳的表單名稱

savepath

上傳檔案的儲存路徑

name

上傳檔案的原始名稱

savename

上傳檔案的儲存名稱

size

上傳檔案的大小

type

上傳檔案的MIME型別

ext

上傳檔案的字尾型別

md5

上傳檔案的md5雜湊驗證字串 僅當hash設定開啟後有效

sha1

上傳檔案的sha1雜湊驗證字串 僅當hash設定開啟後有效

檔案上傳成功後,就可以使用這些檔案資訊來進行其他的資料操作,例如儲存到當前資料表或者單獨的附件資料表

  1. $model = M('Photo');
  2. // 取得成功上傳的檔案資訊
  3. $info = $upload->upload();
  4. // 儲存當前資料物件
  5. $data['photo'] = $info[0]['savename'];
  6. $data['create_time'] = NOW_TIME;
  7. $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(); //取得總列數

迴圈讀取資料: