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 相关文章推荐
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
有关PHP性能优化的介绍
Jun 20 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
joomla组件开发入门教程
May 04 PHP
smarty自定义函数用法示例
May 20 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
总结PHP内存释放以及垃圾回收
Mar 29 PHP
PHP abstract 抽象类定义与用法示例
May 29 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
Oct 25 PHP
php去除数组中为0的元素的实例分析
Nov 17 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
PHP7 标准库修改
2021/03/09 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
js 通用订单代码
2013/12/23 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
解决Ant Design Modal内嵌Form表单initialValue值不动态更新问题
2020/10/29 Javascript
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
Python使用剪切板的方法
2017/06/06 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
django初始化数据库的实例
2018/05/27 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
医校毕业生自我鉴定
2014/01/25 职场文书
致接力运动员广播稿
2014/02/17 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
小学见习报告
2014/10/31 职场文书
大学团日活动总结书
2015/05/11 职场文书
南京大屠杀观后感
2015/06/02 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
Go gorilla/sessions库安装使用
2022/08/14 Golang