php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)

复制代码 代码如下:

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html xmlns="http://www.w3.org/1999/xhtml">

  <head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  <title>Excel数据获取演示</title>

  <meta name="Keywords" content="TODO" />

  <meta name="Description" content="TODO"/>

  </head>

  <body>

  <div>

  <div>Excel数据获取演示</div>

  <div>

  <form method="POST" action="/Index/parse" enctype="multipart/form-data">

  <input type="file" name="excel" value="" />

  <input type="submit" name="submit" value="提交" />

  </form>

  </div>

  </div>

  </body>

  </html>

  

复制代码 代码如下:

  <?php

  /**

  * CopyRight (c) 2009,

  * All rights reserved.

  * 文件名:

  * 摘 要:

  *

  * @author 星期八 [url=mailto:[email protected]][email protected][/url]

  * @version

  */

  public function parse()

  {

  /**

  * $_FILES数组说明

  * array(n) {

  * ["表单文件框名称"] => array(5) {

  * ["name"] => 提交文件名称

  * ["type"] => 提交文件类型 Excel为"application/vnd.ms-excel"

  * ["tmp_name"] => 临时文件名称

  * ["error"] => 错误(0成功1文件太大超过upload_max_filesize2文件太大超过MAX_FILE3上传不完整4没有上传文件)

  * ["size"] => 文件大小(单位:KB)

  * }

  * }

  */

  $return=array(0,'');

  /**

  * 判断是否提交

  * is_uploaded_file(文件名称)用于确定指定的文件是否使用POST方法上传,防止非法提交,通常和move_upload_file一起使用保存上传文件到指定的路径

  */

  if(!isset($_FILES) || !is_uploaded_file($_FILES['excel']['tmp_name']))

  {

  $return=array(1,'提交不合法');

  }

  //处理

  if(0 == $return[0])

  {

  import('@.Util.ExcelParser');

  $excel=new ExcelParser($_FILES['excel']['tmp_name']);

  $return=$excel->main();

  }

  //输出处理

  print_r($return);

  ?>

  

复制代码 代码如下:

  <?php

  /**

  * CopyRight (c) 2009,

  * All rights reserved.

  * 文件名:excel数据获取

  * 摘 要:

  *

  * @author 星期八 [url=mailto:[email protected]][email protected][/url]

  * @version 0.1

  */

  class ExcelParser

  {

  private $_data=array(0,'');

  private $_excel_handle;

  private $_excel=array();

  /**

  * 构造函数

  * @param <string> $filename 上传文件临时文件名称

  */

  public function __construct($filename)

  {

  /**

  * 引入excelparser类

  * 普通方法为

  * requires 路径.'excelparser.php';

  */

  import('@.Util.PHPExcelParser.excelparser','','.php');

  $this->_excel_handle=new ExcelFileParser();

  //错误获取

  $this->checkErrors($filename);

  }

  /**

  * 错误校验

  */

  private function checkErrors($filename)

  {

  /**

  * 方法一

  */

  $error_code=$this->_excel_handle->ParseFromFile($filename);

  /**

  * 方法二

  * $file_handle = fopen($this->_filename,'rb');

  * $content = fread($file_handle,filesize($this->_filename));

  * fclose($file_handle);

  * $error_code = $this->_excel->ParseFromString($content);

  * unset($content,$file_handle);

  */

  switch($error_code)

  {

  case 0:

  //无错误不处理

  break;

  case 1:

  $this->_data=array(1,'文件读取错误(Linux注意读写权限)');

  break;

  case 2:

  $this->_data=array(1,'文件太小');

  break;

  case 3:

  $this->_data=array(1,'读取Excel表头失败');

  break;

  case 4:

  $this->_data=array(1,'文件读取错误');

  break;

  case 5:

  $this->_data=array(1,'文件可能为空');

  break;

  case 6:

  $this->_data=array(1,'文件不完整');

  break;

  case 7:

  $this->_data=array(1,'读取数据错误');

  break;

  case 8:

  $this->_data=array(1,'版本错误');

  break;

  }

  unset($error_code);

  }

  /**

  * Excel信息获取

  */

  private function getExcelInfo()

  {

  if(1==$this->_data[0])return;

  /**

  * 获得sheet数量

  * 获得sheet单元对应的行和列

  */

  $this->_excel['sheet_number']=count($this->_excel_handle->worksheet['name']);

  for($i=0;$i<$this->_excel['sheet_number'];$i++)

  {

  /**

  * 行于列

  * 注意:从0开始计数

  */

  $row=$this->_excel_handle->worksheet['data'][$i]['max_row'];

  $col=$this->_excel_handle->worksheet['data'][$i]['max_col'];

  $this->_excel['row_number'][$i]=($row==NULL)?0:++$row;

  $this->_excel['col_number'][$i]=($col==NULL)?0:++$col;

  unset($row,$col);

  }

  }

  /**

  * 中文处理函数

  * @return <string>

  */

  private function uc2html($str)

  {

  $ret = '';

  for( $i=0; $i<strlen($str)/2; $i++ )

  {

  $charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);

  $ret .= '&#'.$charcode.';';

  }

  return mb_convert_encoding($ret,'UTF-8','HTML-ENTITIES');

  }

  /**

  * Excel数据获取

  */

  private function getExcelData()

  {

  if(1==$this->_data[0])return;

  //修改标记

  $this->_data[0]=1;

  //获取数据

  for($i=0;$i<$this->_excel['sheet_number'];$i++)

  {

  /**

  * 对行循环

  */

  for($j=0;$j<$this->_excel['row_number'][$i];$j++)

  {

  /**

  * 对列循环

  */

  for($k=0;$k<$this->_excel['col_number'][$i];$k++)

  {

  /**

  * array(4) {

  * ["type"] => 类型 [0字符类型1整数2浮点数3日期]

  * ["font"] => 字体

  * ["data"] => 数据

  * ...

  * }

  */

  $data=$this->_excel_handle->worksheet['data'][$i]['cell'][$j][$k];

  switch($data['type'])

  {

  case 0:

  //字符类型

  if($this->_excel_handle->sst['unicode'][$data['data']])

  {

  //中文处理

  $data['data'] = $this->uc2html($this->_excel_handle->sst['data'][$data['data']]);

  }

  else

  {

  $data['data'] = $this->_excel_handle->sst['data'][$data['data']];

  }

  break;

  case 1:

  //整数

  //TODO

  break;

  case 2:

  //浮点数

  //TODO

  break;

  case 3:

  //日期

  //TODO

  break;

  }

  $this->_data[1][$i][$j][$k]=$data['data'];

  unset($data);

  }

  }

  }

  }

  /**

  * 主函数

  * @return <array> array(标识符,内容s)

  */

  public function main()

  {

  //Excel信息获取

  $this->getExcelInfo();

  //Excel数据获取

  $this->getExcelData();

  return $this->_data;

  }

  }

  ?>