基于PHP的EXCEL的数据导入
Posted by Kevin | Filed under PHP | 2009-07-01
问题背景:
前段时间做毕业设计的时候,客户有一个需求,要求实现上传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



2009-07-02, 6:03 PM
呵呵,还行,不错
2010-04-25, 11:56 AM
你的代码错了class.ascii.php 第6行的变量应该是$pos = strpos($str, $flag);不然无法转换的,你这样误导了很多人啊,应该自己尝试下再发源代码
2010-04-26, 3:32 PM
谢谢指正,已经改过。^^