ThinkPHP와 PHPExcel 충돌 해결 방법

5115 단어
일찍부터 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
";
}

ThinkPHP에서 사용하려면 원본 패키지의 Classes 디렉터리를 ThinkPHP의 Vendor 디렉터리에 복사해서 PHPExcel로 이름을 바꾸고 Vendor 방법으로 불러옵니다
 
  
vendor('PHPExcel.PHPExcel');

그러나 이렇게 해서 Excel을 읽은 후에 M 또는 D 방법을 호출하는 실례화 모델 클래스 타임즈에서 모델 클래스의 오류를 찾을 수 없다는 것을 발견했다. 연구를 통해 자동 마운트 메커니즘 충돌이라는 것을 발견했다. 충돌을 해결하려면 M 또는 D 방법을 호출하기 전에 spl 를 사용해야 한다.autoload_register 함수 autoloader 클래스 재등록
 
  
spl_autoload_register(array('Think','autoload'));

ThinkPHP에서 PHPExcel을 호출하는 문제 해결 방안은 ThinkPHP에서 PHPExcel을 호출할 때 데이터는 완전히 읽을 수 있지만 다음 D, M 또는 템플릿을 호출할 때 오류가 발생할 수 있습니다.송이경(신지현)
연구를 거쳐 마침내 해결 방법을 찾았다.여러분과 함께 나누세요.허허!
1, 먼저 PHPExcel의 가방을 다운로드하여 ThinkPHP/Vendor/(즉 Think의 제3자 라이브러리 디렉터리) 아래에 놓는다.
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$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$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 ");

좋은 웹페이지 즐겨찾기