利用PHPExcel進行excel插入操作。同時需要進行系統文件夾的掃描和重命名!
項目需求:網站上線要將照片上傳到線上,但是有些照片的名稱是中文導致上傳失敗,現需要將名稱均改爲不包含中文的名字,然後將修改前和修改後的名稱的對應關係寫到excel表中。
項目實現:首先實現的是對於照片名稱的讀取,同步實現對於照片名稱的修改操作。然後將其中對應的新名稱和舊名稱均加入到數組中,利用phpexcel將數據寫入到數組中,想法很美好,現實很殘酷。折騰了一晚上,發現存在編碼問題,利用函數進行字符轉碼後,然後才能將漢字插入到excel表中。(中間經歷了很大的挫折。。。都是粗心惹的禍)
廢話不多說了。上代碼!
public function scan(){
$image = scandir("D:/image"); //把照片文件掃描進來。
$this->Rename("D:/image");
//echo $_SERVER['DOCUMENT_ROOT'];
}
//利用PHP目錄和文件函數遍歷用戶給出目錄的所有的文件和文件夾,修改照片名稱 後續進行存入excel操作。
function Rename($dirname){
//原圖片名數組
$oldImageName = array();
//新圖片名數組
$newImageName = array();
if(!is_dir($dirname)){ //判斷是否爲一個有效的目錄
echo "{$dirname}目錄無效!";
exit();
}
$handle = opendir($dirname); //打開目錄,並傳回一個事件句柄
while(($fn = readdir($handle))!==false){
if($fn!='.'&&$fn!='..'){ //讀取dir後會有.和..目錄代表本級以及上級目錄。以此進行判斷。
$curDir = $dirname.'/'.$fn;
if(is_dir($curDir)){ //假如還爲文件夾,就繼續循環調用此函數。
fRename($curDir);
}
else{ //此爲文件,直接進行改名操作。
//pathinfo() 函數以數組的形式返回文件路徑的信息。
/*包括以下的數組元素:
[dirname]
[basename]
[extension]
*/
$path = pathinfo($curDir);
$newname = $path['dirname'].'/'.substr(microtime(),2,8).'.'.$path['extension']; //此處利用微秒函數進行重命名,以防止文件重名。
rename($curDir,$newname);
array_push($oldImageName,$curDir); //將舊圖片名加入數組中
array_push($newImageName,$newname); //將新圖片名加入數組中
}
}
}
//將數組信息寫入excel表中。
//將數組中的元素進行處理
$num = count($oldImageName); //獲取處理的圖片數組的長度
for($i=0;$i<=$num;$i++){
$oldImageName[$i] = substr($oldImageName[$i],9); //去除圖片名所含的路徑
$newImageName[$i] = substr($newImageName[$i],9); //去除圖片名所含的路徑
}
//dump($oldImageName);
//dump($newImageName);
$dir = $_SERVER['DOCUMENT_ROOT']; //找出項目的根路徑
require 'D:\wamp\www\weixin\Data\PHPExcel_1.8.0_doc\Classes\PHPExcel.php'; //添加讀取excel所需的類文件(PHPExcel)
$objPHPExcel = new \PHPExcel(); //實例化一個PHPExcel()對象
$objSheet = $objPHPExcel->getActiveSheet(); //選取當前的sheet對象
//$objSheet->setTitle('helen'); //對當前sheet對象命名
//常規方式:利用setCellValue()填充數據
//$objSheet->setCellValue("A1","張三")->setCellValue("B1","李四"); //利用setCellValues()填充數據
//取巧模式:利用fromArray()填充數據
//更改文件名編碼
for($i=0;$i<$num;$i++){
$oldImageName[$i] = mb_convert_encoding($oldImageName[$i],"UTF-8","GBK"); //此處一定要記得將轉換爲的字符串存下來!!!
}
$arr = array();
for($i=0;$i<$num;$i++){
$tmp = array("","$oldImageName[$i]","$newImageName[$i]");
array_push($arr,$tmp);
}
$objSheet->fromArray($arr); //利用fromArray()直接一次性填充數據
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel,'Excel2007'); //設定寫入excel的類型
$objWriter->save($dir.'/yantailogos.xlsx'); //保存文件,後面爲設置excel文件名
}
折騰了一晚上,主要就是被字符編碼問題困住了!!!!
得出的經驗,PHPExcel插入漢字的編碼應爲UTF-8格式,但是在windows平臺下,讀取文件名獲取的字符串,其編碼爲GBK格式。需要利用函數進行編碼轉換。這很重要!!!
php中編碼轉換函數
mb_convert_encoding( $str, $encoding1,$encoding2 )
$str,要轉換編碼的字符串
$encoding1,目標編碼,如utf-8,gbk,大小寫均可
$encoding2,原編碼,如utf-8,gbk,大小寫均可(可省略)
php中的微秒函數
microtime() 函數返回當前 Unix 時間戳和微秒數。
輸出兩段數字 其中前一個爲微秒 後一個爲秒
最後對於照片讀取的操作主要利用到文件的讀取和掃描函數,需要細細體會,熟能生巧!