Linux下将excel数据导入到mssql数据库中的方法


Posted in PHP onFebruary 08, 2010

先清理一下思路先,~~
首先:需要把文件上传到服务器上
然后:读取excel数据列显示出来
然后:让用户选择字段的对应关系
然后:提交数据,读取字段的对应关系
最后:批量导入数据,删除临时文件
一共是以上五步骤!我们一步步分析~~~
第一步:下载附件中的phpexcelparser4.rar ,这个文件是上传excel盗服务器上并以web形式展示出来的!这个一般没有问题的!问题是程序的做法是把表存为临时表而没有真正保存下来,所以首先要更改程序代码为

if (trim($_POST["cmd"])=="upload") 
{ $err_corr = "Unsupported format or file corrupted"; 
$excel_file_size; 
$excel_file = $_FILES['excel_file']; 
$uploadservername=$UploadAbsPath."tmpexcel/".$_FILES['excel_file']['name']; 
echo($uploadservername); 
if (!is_writeable($UploadAbsPath."tmpexcel/")) 
{ 
echo "目录不可写!"; exit; 
} 
else 
{ 
echo "目录可写!"; 
} 
if (move_uploaded_file($_FILES['excel_file']['tmp_name'], $uploadservername)) 
{ 
echo("上传成功"); 
} 
else 
{ 
echo("上传失败"); 
} 
$excel_file=$uploadservername; 
//if( $excel_file ) 
// $excel_file = $_FILES['excel_file']['tmp_name']; 
if( $excel_file == '' ) fatal("No file uploaded"); 
$exc = new ExcelFileParser("debug.log", ABC_NO_LOG);//ABC_NO_LOG ABC_VAR_DUMP); 
//echo($excel_file."|"); 
$style = $_POST['style']; 
if( $style == 'old' ) 
{ 
$fh = @fopen ($excel_file,'rb'); 
if( !$fh ) fatal("No file uploaded"); 
if( filesize($excel_file)==0 ) fatal("No file uploaded"); 
$fc = fread( $fh, filesize($excel_file) ); 
@fclose($fh); 
if( strlen($fc) < filesize($excel_file) ) 
fatal("Cannot read file"); 
$time_start = getmicrotime(); 
$res = $exc->ParseFromString($fc); 
$time_end = getmicrotime(); 
} 
elseif( $style == 'segment' ) 
{ 
$time_start = getmicrotime(); 
$res = $exc->ParseFromFile($excel_file); 
$time_end = getmicrotime(); 
} 
switch ($res) { 
case 0: break; 
case 1: fatal("Can't open file"); 
case 2: fatal("File too small to be an Excel file"); 
case 3: fatal("Error reading file header"); 
case 4: fatal("Error reading file"); 
case 5: fatal("This is not an Excel file or file stored in Excel < 5.0"); 
case 6: fatal("File corrupted"); 
case 7: fatal("No Excel data found in file"); 
case 8: fatal("Unsupported file version"); 
default: 
fatal("Unknown error"); 
} 
/* 
print '<pre>'; 
print_r( $exc ); 
print '</pre>'; 
exit; 
*/ 
show_time(); 
echo <<<LEG 
<b>Legend:</b><br><br> 
<form name='doform' action='' method='post'> 
<input type='hidden' name='action' value='do'> 
<input type='hidden' name='excel_file' value=$excel_file> 
<input type='hidden' name='style' value=$style> 
<table border=1 cellspacing=0 cellpadding=0> 
<tr><td>Data type</td><td>Description</td></tr> 
<tr><td class=empty> </td><td class=index>An empty cell</td></tr> 
<tr><td class=dt_string>ABCabc</td><td class=index>String</td></tr> 
<tr><td class=dt_int>12345</td><td class=index>Integer</td></tr> 
<tr><td class=dt_float>123.45</td><td class=index>Float</td></tr> 
<tr><td class=dt_date>123.45</td><td class=index>Date</td></tr> 
<table> 
<br><br> 
LEG; 
/* 
print "<pre>"; 
print_r ($exc->worksheet); 
print_r($exc->sst); 
print "</pre>"; 
*/ 
for( $ws_num=0; $ws_num<count($exc->worksheet['name']); $ws_num++ ) 
{ 
print "<b>Worksheet: \""; 
if( $exc->worksheet['unicode'][$ws_num] ) { 
print uc2html($exc->worksheet['name'][$ws_num]); 
} else 
print $exc->worksheet['name'][$ws_num]; 
print "\"</b>"; 
$ws = $exc->worksheet['data'][$ws_num]; 
if( is_array($ws) && 
isset($ws['max_row']) && isset($ws['max_col']) ) { 
echo "\n<br><br><table border=1 cellspacing=0 cellpadding=2>\n"; 
print "<tr><td> </td>\n"; 
for( $j=0; $j<=$ws['max_col']; $j++ ) { 
print "<td class=index> "; 
if( $j>25 ) print chr((int)($j/26)+64); 
//这里要显示一个下拉列表来显示数据 
//注意是循环数据<br /> 
echo("\n<select name='".$j."'>"); 
echo("\n<option value='0'>不选择</option>"); 
echo("\n<option value='fkhxm'>客户姓名</option>"); 
echo("\n<option value='fsfzh'>身份证号</option>"); 
echo("\n<option value='fyddh'>移动电话</option>"); 
echo("\n<option value='ftxdz'>通信地址</option>"); 
echo("\n<option value='femail'>Email</option>"); 
echo("\n<option value='flxdh'>联系电话</option>"); 
echo("\n<option value='fkhah'>客户爱好</option>"); 
echo("\n<option value='fbzxx'>备注信息</option>"); 
echo("</select>"); 
print "</td>"; 
} 
print "<tr><td> </td>\n"; 
for( $j=0; $j<=$ws['max_col']; $j++ ) { 
print "<td class=index> "; 
if( $j>25 ) print chr((int)($j/26)+64); 
print chr(($j % 26) + 65)." 列名</td>"; 
} 
//表头输出完毕 
if ($ws['max_row']>9) 
{ 
$shownum=9; 
} 
else 
{ 
$shownum=$ws['max_row'];//只输出前10条数据 
} 
for( $i=0; $i<=$shownum; $i++ ) { 
print "<tr><td class=index>".($i+1)."</td>\n"; 
if(isset($ws['cell'][$i]) && is_array($ws['cell'][$i]) ) { 
for( $j=0; $j<=$ws['max_col']; $j++ ) { 
if( ( is_array($ws['cell'][$i]) ) && 
( isset($ws['cell'][$i][$j]) ) 
){ 
// print cell data 
print "<td class=\""; 
$data = $ws['cell'][$i][$j]; 
$font = $ws['cell'][$i][$j]['font']; 
$style = " style ='".ExcelFont::ExcelToCSS($exc->fonts[$font])."'"; 
switch ($data['type']) { 
// string 
case 0: 
print "dt_string\"".$style.">"; 
$ind = $data['data']; 
if( $exc->sst['unicode'][$ind] ) { 
$s = uc2html($exc->sst['data'][$ind]); 
} else 
$s = $exc->sst['data'][$ind]; 
if( strlen(trim($s))==0 ) 
print " "; 
else 
print $s; 
break; 
// integer number 
case 1: 
print "dt_int\"".$style."> "; 
print $data['data']; 
break; 
// float number 
case 2: 
print "dt_float\"".$style."> "; 
echo $data['data']; 
break; 
// date 
case 3: 
print "dt_date\"".$style."> "; 
$ret = $data[data];//str_replace ( " 00:00:00", "", gmdate("d-m-Y H:i:s",$exc->xls2tstamp($data[data])) ); 
echo ( $ret ); 
break; 
default: 
print "dt_unknown\"".$style.">  "; 
break; 
} 
print "</td>\n"; 
} else { 
print "<td class=empty> </td>\n"; 
} 
} 
} else { 
// print an empty row 
for( $j=0; $j<=$ws['max_col']; $j++ ) 
print "<td class=empty> </td>"; 
print "\n"; 
} 
print "</tr>\n"; 
} 
echo "</table><br>\n"; 
} else { 
// emtpty worksheet 
print "<b> - empty</b><br>\n"; 
} 
print "<br>"; 
} 
echo("<input type='submit' name='Submit' value='转换' />"); 
echo("</form>"); 
/* print "Formats<br>"; 
foreach($exc->format as $value) { 
printf("( %x )",array_search($value,$exc->format)); 
print htmlentities($value,ENT_QUOTES); 
print "<br>"; 
} 
print "XFs<br>"; 
for( $i=0;$i<count($exc->xf['format']);$i++) { 
printf ("(%x)",$i); 
printf (" format (%x) font (%x)",$exc->xf['format'][$i],$exc->xf['font'][$i]); 
print "<br>"; 
} 
*/ 
}

运行效果如下:
 Linux下将excel数据导入到mssql数据库中的方法
第二步是要读取数据出来,代码如下:
if ($_POST["action"]=="do") 
{ 
//处理数据 
//先读取表头记录 
$excel_file=$_POST["excel_file"]; 
$fh = @fopen ($excel_file,'rb'); 
$fc = fread( $fh, filesize($excel_file) ); 
@fclose($fh); 
//echo("执行".$excel_file); 
$exc = new ExcelFileParser("debug.log", ABC_NO_LOG);//ABC_NO_LOG ABC_VAR_DUMP); 
//echo($excel_file."|"); 
$style = $_POST['style']; 
if( $style == 'old' ) 
{ 
$fh = @fopen ($excel_file,'rb'); 
if( !$fh ) fatal("No file uploaded"); 
if( filesize($excel_file)==0 ) fatal("No file uploaded"); 
$fc = fread( $fh, filesize($excel_file) ); 
@fclose($fh); 
if( strlen($fc) < filesize($excel_file) ) 
fatal("Cannot read file"); 
$time_start = getmicrotime(); 
$res = $exc->ParseFromString($fc); 
$time_end = getmicrotime(); 
} 
elseif( $style == 'segment' ) 
{ 
$time_start = getmicrotime(); 
$res = $exc->ParseFromFile($excel_file); 
$time_end = getmicrotime(); 
} switch ($res) { 
case 0: break; 
case 1: fatal("Can't open file"); 
case 2: fatal("File too small to be an Excel file"); 
case 3: fatal("Error reading file header"); 
case 4: fatal("Error reading file"); 
case 5: fatal("This is not an Excel file or file stored in Excel < 5.0"); 
case 6: fatal("File corrupted"); 
case 7: fatal("No Excel data found in file"); 
case 8: fatal("Unsupported file version"); 
default: 
fatal("Unknown error"); 
} 
//以及读取完毕,如果没有错误的话就可以循环往MSSQL中增加数据了! 
for( $ws_num=0; $ws_num<count($exc->worksheet['name']); $ws_num++ ) 
{ 
// print "<b>Worksheet: \""; 
// if( $exc->worksheet['unicode'][$ws_num] ) { 
// print uc2html($exc->worksheet['name'][$ws_num]); 
// } else 
// print $exc->worksheet['name'][$ws_num]; 
// 
// print "\"</b>"; 
$ws = $exc->worksheet['data'][$ws_num]; 
// 
// 
// print "<tr><td> </td>\n"; 
$fkhxmnum=0; 
$fsfzhnum=0; 
$fyddhnum=0; 
$ftxdznum=0; 
$femailnum=0; 
$flxdhnum=0; 
$fkhahnum=0; 
$fbzxxnum=0; 
for( $j=0; $j<=$ws['max_col']; $j++ ) { 
//print "<td class=index> "; 
//if( $j>25 ) print chr((int)($j/26)+64); 
//先读取列名 
$tmpcolum=trim($_POST["$j"]); 
//echo($tmpcolum."|"); 
if ($tmpcolum=="fkhxm") $fkhxmnum=$j; 
if ($tmpcolum=="fsfzh") $fsfzhnum=$j; 
if ($tmpcolum=="fyddh") $fyddhnum=$j; 
if ($tmpcolum=="ftxdz") $ftxdznum=$j; 
if ($tmpcolum=="femail") $femailnum=$j; 
if ($tmpcolum=="flxdh") $flxdhnum=$j; 
if ($tmpcolum=="fkhah") $fkhahnum=$j; 
if ($tmpcolum=="fbzxx") $fbzxxnum=$j; 
} 
for( $i=0; $i<=$ws['max_row']; $i++ ) { 
//$fkhxm= 
//echo($fkhxmnum.$fsfzhnum.$fyddhnum.$ftxdznum.$femailnum.$flxdhnum.$fkhahnum.$fbzxxnum); 
//print "<tr><td class=index>".($i+1)."</td>\n"; 
if(isset($ws['cell'][$i]) && is_array($ws['cell'][$i]) ) { 
if ($fkhxmnum!=0&&$ftxdznum!=0&&($fyddhnum!=0||$flxdhnum!=0))//请在这里指定必须的不为空的字段 
{ 
$sql="insert into k_qlkhxx(fkhxm,fsfzh,fyddh,ftxdz,femail,flxdh,$fkhah,fbzxx,fglry,fglryxm,fdjry,ffzdm) values('".uc2html($exc->sst['data'][$ws['cell'][$i][$fkhxmnum]['data']])."','".$exc->sst['data'][$ws['cell'][$i][$fsfzhnum]['data']]."','".$exc->sst['data'][$ws['cell'][$i][$fyddhnum]['data']]."','".uc2html($exc->sst['data'][$ws['cell'][$i][$ftxdznum]['data']])."','".uc2html($exc->sst['data'][$ws['cell'][$i][$femailnum]['data']])."','".$exc->sst['data'][$ws['cell'][$i][$flxdhnum]['data']]."','".uc2html($exc->sst['data'][$ws['cell'][$i][$fkhahnum]['data']])."','".uc2html($exc->sst['data'][$ws['cell'][$i][$fbzxxnum]['data']])."','".$_SESSION["uyhmc"]."','".$_SESSION["uyhxm"]."','".$_SESSION["uyhmc"]."','".$_SESSION["ubm"]."')"; 
echo($sql."<br>"); 
} 
//$conn->Query($sql); 
} 
} 
} 
//导入完成删除文件 
unlink($filename); 
}

你注意没有,我把执行的那一行注释掉的,只要去掉注释就可以正确执行了!
所用到的代码打包下载http://xiazai.3water.com/201002/yuanma/php_excel_mysql.rar
PHP 相关文章推荐
非常好的php目录导航文件代码
Oct 09 PHP
PHP日期时间函数的高级应用技巧
May 16 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
smarty 缓存控制前的页面静态化原理
Mar 15 PHP
Laravel 5框架学习之表单
Apr 08 PHP
YII视图整合kindeditor扩展的方法
Jul 13 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
php 7新特性之类型申明详解
Jun 06 PHP
php layui实现前端多图上传实例
Jul 30 PHP
PHP实现获取文件mime类型多种方法解析
May 28 PHP
PHP 图片处理
Sep 16 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 PHP
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 #PHP
php cli 方式 在crotab中运行解决
Feb 08 #PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 #PHP
Zend framework处理一个http请求的流程分析
Feb 08 #PHP
PHP函数常用用法小结
Feb 08 #PHP
在PHP中养成7个面向对象的好习惯
Jan 28 #PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 #PHP
You might like
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php获取参数的几种方法总结
2014/02/18 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
使用JQuery实现图片轮播效果的实例(推荐)
2017/10/24 jQuery
laydate时间日历插件使用方法详解
2018/11/14 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
Python异常处理知识点总结
2019/02/18 Python
详解Python的三种可变参数
2019/05/08 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
Python的条件锁与事件共享详解
2019/09/12 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
Ejb技术面试题
2015/04/29 面试题
小学生寒假家长评语
2014/04/16 职场文书
保密工作目标责任书
2014/07/28 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang