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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值