ThinkPHP與PHPExcel衝突解決方案_PHP教程

來源:互聯網
上載者:User
很早之前就知道有一個叫做PHPExcel的類(官方網站)可以用來操作Excel,一直沒有機會嘗試,今天試用發現無比強大,下載後的源碼包裡有詳細文檔,幾乎能實現手工操作Excel能實現的一切功能。
一個簡單的讀取Excel的例子如下:
複製代碼 代碼如下:
$inputFileType = 'Excel2007';
$inputFileName = './public/files/import_user_template.xlsx';
$sheetname = 'Sheet1';
//指定Excel類型,建立一個reader
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//設定唯讀取資料,不包括公式和格式
$objReader->setReadDataOnly(true);
//唯讀取指定的sheet
$objReader->setLoadSheetsOnly($sheetname);
$objPHPExcel = $objReader->load($inputFileName);
$curSheet = $objPHPExcel->getSheet(0);
//包含資料的最大列
$allColumn = $curSheet->getHighestColumn();
//包含資料的最大行
$allRow = $curSheet->getHighestRow();
for($currentRow = 1; $currentRow <= $allRow; $currentRow++){
for($currentCol = 'A'; $currentCol <= $allColumn; $currentCol++){
echo $curSheet->getCell($currentCol.$currentRow)->getValue()."\t";
}
echo "\r\n";
}

要在ThinkPHP中使用,把源碼包中的Classes目錄複寫到ThinkPHP的Vendor目錄下,改名為PHPExcel,然後調用Vendor方法載入
複製代碼 代碼如下:
vendor('PHPExcel.PHPExcel');

可是這樣一來發現讀取Excel以後再調用M或者D方法執行個體化模型類時報找不到Model類的錯誤,經過研究發現是自動裝載機制衝突,要解決衝突,需要在M或者D方法調用之前使用spl_autoload_register函數重新註冊autoloader類
複製代碼 代碼如下:
spl_autoload_register(array('Think','autoload'));

在ThinkPHP中調用PHPExcel的問題解決方案
在ThinkPHP中調用PHPExcel時,資料可以完全讀出來,但是下一步D,M或調用模板的時候會出錯。(不知道是我一個人遇到這個問題 嗎?)
經過研究,終於找到瞭解決方法。和大家分享一下。呵呵!
1,首先下載PHPExcel的包,放在 ThinkPHP/Vendor/(也就是Think的第三方類庫目錄)下。
2,調用函數。
複製代碼 代碼如下:
protected function Import_Execl($file){
if(!file_exists($file)){
return array("error"=>1);
}
Vendor("PHPExcel.PHPExcel");
$PHPExcel = new PHPExcel();
$PHPReader = new PHPExcel_Reader_Excel2007();
if(!$PHPReader->canRead($file)){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($file)){
return array("error"=>2);
}
}
$PHPExcel = $PHPReader->load($file);
$SheetCount = $PHPExcel->getSheetCount();
for($i=0;$i<$SheetCount;$i++){
$currentSheet = $PHPExcel->getSheet($i);
$allColumn = $this->ExcelChange($currentSheet->getHighestColumn());
$allRow = $currentSheet->getHighestRow();
$array[$i]["Title"] = $currentSheet->getTitle();
$array[$i]["Cols"] = $allColumn;
$array[$i]["Rows"] = $allRow;
$arr = array();
for($currentRow = 1 ;$currentRow<=$allRow;$currentRow++){
$row = array();
for($currentColumn=0;$currentColumn<$allColumn;$currentColumn++){
$row[$currentColumn] = $currentSheet->getCellByColumnAndRow($currentColumn,$currentRow)->getValue();
}
$arr[$currentRow] = $row;
}
$array[$i]["Content"] = $arr;
}
spl_autoload_register(array('Think','autoload'));//必須的,不然ThinkPHP和PHPExcel會衝突
unset($currentSheet);
unset($PHPReader);
unset($PHPExcel);
unlink($file);
return array("error"=>0,"data"=>$array);
}
protected function ExcelChange($str){//配合Execl大量匯入的函數
$len = strlen($str)-1;
$num = 0;
for($i=$len;$i>=0;$i--){
$num += (ord($str[$i]) - 64)*pow(26,$len-$i);
}
return $num;
}

3,調用。
複製代碼 代碼如下:
public function import(){
if(isset($_FILES["import"]) && ($_FILES["import"]["error"] == 0)){
$result = $this->Import_Execl($_FILES["import"]["tmp_name"]);
if($this->Execl_Error[$result["error"]] == 0){
$execl_data = $result["data"][0]["Content"];
unset($execl_data[1]);
$data = D("Data");
foreach($execl_data as $k=>$v){
$d["serial_no"] = $v[0];
$d["check_no"] = $v[1];
$d["work_no"] = $v[2];
$d["class_name"] = $v[3];
$d["user_name"] = $v[4];
$d["new_class"] = $v[5];
$d["error_level"] = $v[6];
$data->data($d)->add();
}
$this->success($this->Execl_Error[$result["error"]]);
}else{
$this->error($this->Execl_Error[$result["error"]]);
}
}else{
$this->error("上傳檔案失敗");
}
}

4,錯誤資料:
複製代碼 代碼如下:
protected $Execl_Error = array("資料匯入成功","找不到檔案","Execl檔案格式不正確");

http://www.bkjia.com/PHPjc/324208.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/324208.htmlTechArticle很早之前就知道有一個叫做PHPExcel的類(官方網站)可以用來操作Excel,一直沒有機會嘗試,今天試用發現無比強大,下載後的源碼包裡有詳...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.