问题背景:
前段时间做毕业设计的时候,客户有一个需求,要求实现上传EXCEL文件,对文件中的数据进行数据库入库。困难的是,要实现EXCEL数据文件的信息排列任意性无错兼容导入。导入过程中发现,PHP读取EXCEL的时候,出现的是ASCII值,而非汉字和字母数字。当然最后循环入库的时候,数据库中的也都是ASCII,于是要对EXCEL文件进行ASCII码值的转换。 (未经转换的)
<tr><td>学号</td><td>姓名</td><td>性别</td><td>电话号码</td>
查看 基于PHP的EXCEL的数据导入的 【在线演示】
解决方案:
当用PHP读取数据文件的时候,遇到传入的字符串内含“#&”的时候直接进行decode,否则直接输出,因为如果是纯数字、字母、下划线等符号,读取的是未经过ASCII码转换的。
PHP读取EXCEL(限EXCEL2003)文件的方法:
先加载EXCEL数据处理类,然后配置好相关的参数,文件名,Sheet 名执行读取函数Read_Excel_File,获取返回数据
不知道Sheet名的请看下图
<?php //加载EXCEL操作类 require_once './excel_class.php'; //加载EXCEL文件Sheet1名 $file_sheet = "Sheet1"; Read_Excel_File("test.xls",$return); //$return[$file_sheet]返回EXCEL行数 for ($i=0;$i<count($return[$file_sheet]);$i++) { echo "<tr>"; for ($j=0;$j<count($return[$file_sheet][$i]);$j++) { echo "<td>".$return[$file_sheet][$i][$j]."</td>"; } echo "</tr>"; } ?>
在进行逐行读取EXCEL CELL数据的时候,只要对CELL数据进行ascii类的decode方法就可以了。
<?php //这里的$i=0是指定读取起始行数 for ($i=0;$i<count($return[$file_sheet]);$i++) { echo "<tr>"; for ($j=0;$j<count($return[$file_sheet][$i]);$j++) { echo "<td>".$ascii->decode($return[$file_sheet][$i][$j])."</td>"; } echo "</tr>"; } ?>
相关的操作类如下:
class ascii { function decode($str) { $flag = "&#"; $pos = strpos($str, $flag); if($pos === FALSE) { return $str; }else{ preg_match_all("/([0-9]{2,5})/", $str,$a); $a = $a[0]; foreach ($a as $dec){ if ($dec < 128) { $utf .= chr($dec); } else if ($dec < 2048) { $utf .= chr(192 + (($dec - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } else { $utf .= chr(224 + (($dec - ($dec % 4096)) / 4096)); $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64)); $utf .= chr(128 + ($dec % 64)); } } return $utf; } } }
附件
php-excel-import.rar
(15.82 KB, 下载次数:578, 上传时间:2015-01-09 17:51)