使用ExcelFileParser处理excel获得数据 可作批量导入到数据库使用
时间:2010-08-13 来源:星期八的博客
<!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; } } ?>
相关阅读 更多 +