(php)實現批處理文件以及PHPExcel的實踐

利用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 時間戳和微秒數。
輸出兩段數字 其中前一個爲微秒 後一個爲秒

最後對於照片讀取的操作主要利用到文件的讀取和掃描函數,需要細細體會,熟能生巧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章