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


Posted in PHP onAugust 21, 2010
<!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; 
} 
} 
?>
PHP 相关文章推荐
提升PHP执行速度全攻略(下)
Oct 09 PHP
PHP的5个安全措施小结
Jul 17 PHP
PHP反射机制用法实例
Aug 28 PHP
利用PHP如何实现Socket服务器
Sep 23 PHP
基础的WordPress插件制作教程
Nov 24 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
PHP微信支付开发实例
Jun 22 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
让Laravel API永远返回JSON格式响应的方法示例
Sep 05 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 #PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 #PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 #PHP
PHP 数组基础知识小结
Aug 20 #PHP
一个简单php扩展介绍与开发教程
Aug 19 #PHP
php checkbox 取值详细说明
Aug 19 #PHP
PHP 截取字符串专题集合
Aug 19 #PHP
You might like
VOLVO车载收音机
2021/03/02 无线电
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
PHP网站提速三大“软”招
2006/10/09 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
JS Array对象入门分析
2008/10/30 Javascript
jquery+ajax验证不通过也提交表单问题处理
2014/12/12 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
举例讲解Python中装饰器的用法
2015/04/27 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
python实现单机五子棋
2020/08/28 Python
python 利用toapi库自动生成api
2020/10/19 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
Desigual英国官网:在线购买原创服装
2018/03/09 全球购物
迟到检讨书900字
2014/01/14 职场文书
《争吵》教学反思
2014/02/15 职场文书
高中学生期末评语
2014/04/25 职场文书
七一建党节演讲稿
2014/09/11 职场文书
2015年材料员工作总结
2015/04/30 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python
总结Python常用的魔法方法
2021/05/25 Python
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
python模板入门教程之flask Jinja
2022/04/11 Python
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers