(php)实现批处理文件以及PHPExcel的实践

来源:互联网 发布:特别想找个女朋友知乎 编辑:程序博客网 时间:2024/06/05 02:16

利用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 时间戳和微秒数。输出两段数字 其中前一个为微秒 后一个为秒

最后对于照片读取的操作主要利用到文件的读取和扫描函数,需要细细体会,熟能生巧!

0 0
原创粉丝点击