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:ixqbar@hotmail.com]ixqbar@hotmail.com[/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:ixqbar@hotmail.com]ixqbar@hotmail.com[/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; } } ?> |