利用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 时间戳和微秒数。
输出两段数字 其中前一个为微秒 后一个为秒
最后对于照片读取的操作主要利用到文件的读取和扫描函数,需要细细体会,熟能生巧!