时光博客 - WEB开发中的可用性和用户体验

基于PHP的EXCEL的数据导入

问题背景:

前段时间做毕业设计的时候,客户有一个需求,要求实现上传EXCEL文件,对文件中的数据进行数据库入库。困难的是,要实现excel数据文件的信息排列任意性无错兼容导入。导入过程中发现,php读取EXCEL的时候,出现的是ASCII值,而非汉字和字母数字。当然最后循环入库的时候,数据库中的也都是ASCII,于是要对EXCEL文件进行ascii码值的转换。 (未经转换的)

  1. <tr><td>&#23398&#21495</td><td>&#22995&#21517</td><td>&#24615&#21035</td><td>&#30005&#35805&#21495&#30721</td> 

查看 基于PHP的EXCEL的数据导入的 【在线演示】

解决方案:

当用PHP读取数据文件的时候,遇到传入的字符串内含“#&”的时候直接进行decode,否则直接输出,因为如果是纯数字、字母、下划线等符号,读取的是未经过ASCII码转换的。

PHP读取EXCEL(限EXCEL2003)文件的方法:

先加载EXCEL数据处理类,然后配置好相关的参数,文件名,Sheet 名执行读取函数Read_Excel_File,获取返回数据

不知道Sheet名的请看下图

stu_import.jpg

大小: 57.36 K
尺寸: 436 x 327
浏览: 226 次
点击打开新窗口浏览全图

  1. <?php 
  2. //加载EXCEL操作类 
  3. require_once './excel_class.php'
  4.  
  5. //加载EXCEL文件Sheet1名       
  6. $file_sheet = "Sheet1"
  7. Read_Excel_File("test.xls",$return); 
  8.  
  9. //$return[$file_sheet]返回EXCEL行数 
  10. for ($i=0;$i<count($return[$file_sheet]);$i++) 
  11.         { 
  12.             echo "<tr>"
  13.             for ($j=0;$j<count($return[$file_sheet][$i]);$j++) 
  14.             { 
  15.                 echo "<td>".$return[$file_sheet][$i][$j]."</td>"
  16.             } 
  17.             echo "</tr>"
  18.         } 
  19. ?> 

在进行逐行读取EXCEL CELL数据的时候,只要对CELL数据进行ascii类的decode方法就可以了。

  1. <?php 
  2.         //这里的$i=0是指定读取起始行数 
  3.         for ($i=0;$i<count($return[$file_sheet]);$i++) 
  4.         { 
  5.             echo "<tr>"
  6.             for ($j=0;$j<count($return[$file_sheet][$i]);$j++) 
  7.             { 
  8.                 echo "<td>".$ascii->decode($return[$file_sheet][$i][$j])."</td>"
  9.             } 
  10.             echo "</tr>"
  11.         } 
  12.     ?> 

相关的操作类如下:

  1. class ascii 
  2.     function decode($str) { 
  3.         $flag = "&#"
  4.         $pos = strpos($str$flag); 
  5.         if($pos === FALSE) { 
  6.             return $str
  7.         }else
  8.             preg_match_all("/([0-9]{2,5})/"$str,$a); 
  9.             $a = $a[0]; 
  10.             foreach ($a as $dec){ 
  11.                 if ($dec < 128) {  
  12.                     $utf .= chr($dec);  
  13.                 } else if ($dec < 2048) {  
  14.                     $utf .= chr(192 + (($dec - ($dec % 64)) / 64));  
  15.                     $utf .= chr(128 + ($dec % 64));  
  16.                 } else {  
  17.                     $utf .= chr(224 + (($dec - ($dec % 4096)) / 4096));  
  18.                     $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));  
  19.                     $utf .= chr(128 + ($dec % 64));  
  20.                 }  
  21.             } 
  22.             return $utf
  23.         }    
  24.     }  

本例的源码下载:php-excel-import.rar

«  上一篇 |  下一篇  »

您可能对下面的日志感兴趣

赞助商广告

3 Responses

  1. 刘涵 Says:
    2009-07-02, 6:03 PM

    呵呵,还行,不错

  2. 温柔雨石 Says:
    2010-04-25, 11:56 AM

    你的代码错了class.ascii.php 第6行的变量应该是$pos = strpos($str, $flag);不然无法转换的,你这样误导了很多人啊,应该自己尝试下再发源代码

  3. Kevin Says:
    2010-04-26, 3:32 PM

    谢谢指正,已经改过。^^

Leave a Reply





验证码(*):