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的FTP学习(一)[转自奥索]
Oct 09 PHP
如何利用php+mysql保存和输出文件
Oct 09 PHP
php array_map array_multisort 高效处理多维数组排序
Jun 11 PHP
一个典型的PHP分页实例代码分享
Jul 28 PHP
php 错误处理经验分享
Oct 11 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 PHP
php实现无限级分类
Dec 24 PHP
php提交表单发送邮件的方法
Mar 20 PHP
php字符集转换
Jan 23 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
js随机颜色代码的多种实现方式
2013/04/23 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
js实现密码强度检验
2017/01/15 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
Python的SQLAlchemy框架使用入门
2015/04/29 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
python学生管理系统
2019/01/30 Python
Python简单基础小程序的实例代码
2019/04/28 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
python支持多线程的爬虫实例
2019/12/21 Python
python实现的分层随机抽样案例
2020/02/25 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
建筑工地门卫岗位职责
2014/04/30 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
《三国志》赏析
2019/08/27 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang