ThinkPHP與PHPExcel沖突解決方法
更新時間:2011年08月08日 21:35:43 作者:
最近一個項目需要批量導(dǎo)入Excel數(shù)據(jù),要用到PHP讀取Excel中的內(nèi)容然后導(dǎo)入到數(shù)據(jù)庫。
很早之前就知道有一個叫做PHPExcel的類(官方網(wǎng)站)可以用來操作Excel,一直沒有機(jī)會嘗試,今天試用發(fā)現(xiàn)無比強(qiáng)大,下載后的源碼包里有詳細(xì)文檔,幾乎能實現(xiàn)手工操作Excel能實現(xiàn)的一切功能。
一個簡單的讀取Excel的例子如下:
$inputFileType = 'Excel2007';
$inputFileName = './public/files/import_user_template.xlsx';
$sheetname = 'Sheet1';
//指定Excel類型,創(chuàng)建一個reader
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//設(shè)置只讀取數(shù)據(jù),不包括公式和格式
$objReader->setReadDataOnly(true);
//只讀取指定的sheet
$objReader->setLoadSheetsOnly($sheetname);
$objPHPExcel = $objReader->load($inputFileName);
$curSheet = $objPHPExcel->getSheet(0);
//包含數(shù)據(jù)的最大列
$allColumn = $curSheet->getHighestColumn();
//包含數(shù)據(jù)的最大行
$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目錄復(fù)制到ThinkPHP的Vendor目錄下,改名為PHPExcel,然后調(diào)用Vendor方法載入
vendor('PHPExcel.PHPExcel');
可是這樣一來發(fā)現(xiàn)讀取Excel以后再調(diào)用M或者D方法實例化模型類時報找不到Model類的錯誤,經(jīng)過研究發(fā)現(xiàn)是自動裝載機(jī)制沖突,要解決沖突,需要在M或者D方法調(diào)用之前使用spl_autoload_register函數(shù)重新注冊autoloader類
spl_autoload_register(array('Think','autoload'));
在ThinkPHP中調(diào)用PHPExcel的問題解決方案
在ThinkPHP中調(diào)用PHPExcel時,數(shù)據(jù)可以完全讀出來,但是下一步D,M或調(diào)用模板的時候會出錯。(不知道是我一個人遇到這個問題 嗎?)
經(jīng)過研究,終于找到了解決方法。和大家分享一下。呵呵!
1,首先下載PHPExcel的包,放在 ThinkPHP/Vendor/(也就是Think的第三方類庫目錄)下。
2,調(diào)用函數(shù)。
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批量導(dǎo)入的函數(shù)
$len = strlen($str)-1;
$num = 0;
for($i=$len;$i>=0;$i--){
$num += (ord($str[$i]) - 64)*pow(26,$len-$i);
}
return $num;
}
3,調(diào)用。
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,錯誤數(shù)據(jù):
protected $Execl_Error = array("數(shù)據(jù)導(dǎo)入成功","找不到文件","Execl文件格式不正確");
一個簡單的讀取Excel的例子如下:
復(fù)制代碼 代碼如下:
$inputFileType = 'Excel2007';
$inputFileName = './public/files/import_user_template.xlsx';
$sheetname = 'Sheet1';
//指定Excel類型,創(chuàng)建一個reader
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//設(shè)置只讀取數(shù)據(jù),不包括公式和格式
$objReader->setReadDataOnly(true);
//只讀取指定的sheet
$objReader->setLoadSheetsOnly($sheetname);
$objPHPExcel = $objReader->load($inputFileName);
$curSheet = $objPHPExcel->getSheet(0);
//包含數(shù)據(jù)的最大列
$allColumn = $curSheet->getHighestColumn();
//包含數(shù)據(jù)的最大行
$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目錄復(fù)制到ThinkPHP的Vendor目錄下,改名為PHPExcel,然后調(diào)用Vendor方法載入
復(fù)制代碼 代碼如下:
vendor('PHPExcel.PHPExcel');
可是這樣一來發(fā)現(xiàn)讀取Excel以后再調(diào)用M或者D方法實例化模型類時報找不到Model類的錯誤,經(jīng)過研究發(fā)現(xiàn)是自動裝載機(jī)制沖突,要解決沖突,需要在M或者D方法調(diào)用之前使用spl_autoload_register函數(shù)重新注冊autoloader類
復(fù)制代碼 代碼如下:
spl_autoload_register(array('Think','autoload'));
在ThinkPHP中調(diào)用PHPExcel的問題解決方案
在ThinkPHP中調(diào)用PHPExcel時,數(shù)據(jù)可以完全讀出來,但是下一步D,M或調(diào)用模板的時候會出錯。(不知道是我一個人遇到這個問題 嗎?)
經(jīng)過研究,終于找到了解決方法。和大家分享一下。呵呵!
1,首先下載PHPExcel的包,放在 ThinkPHP/Vendor/(也就是Think的第三方類庫目錄)下。
2,調(diào)用函數(shù)。
復(fù)制代碼 代碼如下:
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批量導(dǎo)入的函數(shù)
$len = strlen($str)-1;
$num = 0;
for($i=$len;$i>=0;$i--){
$num += (ord($str[$i]) - 64)*pow(26,$len-$i);
}
return $num;
}
3,調(diào)用。
復(fù)制代碼 代碼如下:
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,錯誤數(shù)據(jù):
復(fù)制代碼 代碼如下:
protected $Execl_Error = array("數(shù)據(jù)導(dǎo)入成功","找不到文件","Execl文件格式不正確");
您可能感興趣的文章:
- ThinkPHP使用PHPExcel實現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出完整實例
- ThinkPHP基于PHPExcel導(dǎo)入Excel文件的方法
- thinkPHP+PHPExcel實現(xiàn)讀取文件日期的方法(含時分秒)
- 基于ThinkPHP+uploadify+upload+PHPExcel 無刷新導(dǎo)入數(shù)據(jù)
- thinkPHP+phpexcel實現(xiàn)excel報表輸出功能示例
- thinkphp3.2中實現(xiàn)phpexcel導(dǎo)出帶生成圖片示例
- Thinkphp5+PHPExcel實現(xiàn)批量上傳表格數(shù)據(jù)功能
- ThinkPHP中調(diào)用PHPExcel的實現(xiàn)代碼
- ThinkPHP框架實現(xiàn)導(dǎo)出excel數(shù)據(jù)的方法示例【基于PHPExcel】
相關(guān)文章
PHP調(diào)用FFMpeg實現(xiàn)音視頻操作的示例詳解
這篇文章主要為大家詳細(xì)介紹了PHP如何調(diào)用FFMpeg實現(xiàn)簡單的音視頻操作,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解下2023-10-10
php設(shè)計模式 Chain Of Responsibility (職責(zé)鏈模式)
為解除請求的發(fā)送者和接收者之間的耦合,而使用多個對象都用機(jī)會處理這個請求,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它2011-06-06
php中使用addslashes函數(shù)報錯問題的解決方法
php中使用addslashes函數(shù)報錯問題的解決方法,需要的朋友可以參考下2013-02-02
Thinkphp結(jié)合AJAX長輪詢實現(xiàn)PC與APP推送詳解
這篇文章主要給大家介紹了關(guān)于Thinkphp結(jié)合AJAX長輪詢實現(xiàn)PC與APP推送的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-07-07
PHP+Ajax檢測用戶名或郵件注冊時是否已經(jīng)存在實例教程
這篇文章主要介紹了PHP+Ajax檢測用戶名或郵件注冊時是否已經(jīng)存在實例教程,是非常常見的一個重要功能,常用于論壇注冊部分或會員注冊部分,需要的朋友可以參考下2014-08-08

