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

 更新时间:2010年02月08日 08:17:15   作者:  
在Linux下把excel数据导入到mssql数据库中,这实在是很搞笑的一个活动!几乎很少有程序员研究过这个问题吧?如此变态的问题,估计我是第一个研究的!呵呵,完全是自找苦吃~~,但是今天完了这项太有挑战性的工作!
先清理一下思路先,~~
首先:需要把文件上传到服务器上
然后:读取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>&nbsp;</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>&nbsp;</td>\n";
for( $j=0; $j<=$ws['max_col']; $j++ ) {
print "<td class=index>&nbsp;";
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>&nbsp;</td>\n";
for( $j=0; $j<=$ws['max_col']; $j++ ) {
print "<td class=index>&nbsp;";
if( $j>25 ) print chr((int)($j/26)+64);
print chr(($j % 26) + 65)."&nbsp;列名</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 "&nbsp;";
else
print $s;
break;
// integer number
case 1:
print "dt_int\"".$style.">&nbsp;";
print $data['data'];
break;
// float number
case 2:
print "dt_float\"".$style.">&nbsp;";
echo $data['data'];
break;
// date
case 3:
print "dt_date\"".$style.">&nbsp;";

$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."> &nbsp;";
break;
}
print "</td>\n";
} else {
print "<td class=empty>&nbsp;</td>\n";
}
}
} else {
// print an empty row
for( $j=0; $j<=$ws['max_col']; $j++ )
print "<td class=empty>&nbsp;</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>";
}
*/
}

运行效果如下:
 
第二步是要读取数据出来,代码如下:
复制代码 代码如下:

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>&nbsp;</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>&nbsp;";
//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.jb51.net/201002/yuanma/php_excel_mysql.rar

相关文章

  • Laravel登录失败次数限制的实现方法

    Laravel登录失败次数限制的实现方法

    这篇文章主要给大家介绍了关于Laravel登录失败次数限制的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • PHP的Yii框架中使用数据库的配置和SQL操作实例教程

    PHP的Yii框架中使用数据库的配置和SQL操作实例教程

    这篇文章主要介绍了PHP的Yii框架中使用数据库的配置和SQL操作实例教程,Yii支持绑定多种数据库,文中主要对各种查询语句在Yii中的使用给出了例子,需要的朋友可以参考下
    2016-03-03
  • php实现文件管理与基础功能操作

    php实现文件管理与基础功能操作

    这篇文章通过实例代码给大家讲解了php文件管理与基础功能的实现,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-03-03
  • PHP 文章中的远程图片采集到本地的代码

    PHP 文章中的远程图片采集到本地的代码

    今天写了一个这个功能, 拿出来跟朋友一起分享,可以获取远程图片并保存到本地,其实大家可以参考很多php管理系统都有这个功能。
    2009-07-07
  • ThinkPHP采用GET方式获取中文参数查询无结果的解决方法

    ThinkPHP采用GET方式获取中文参数查询无结果的解决方法

    这篇文章主要介绍了ThinkPHP采用GET方式获取中文参数查询无结果的解决方法,需要的朋友可以参考下
    2014-06-06
  • PHP中的常见魔术方法功能作用及用法实例

    PHP中的常见魔术方法功能作用及用法实例

    这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)__get()和、__set()、__isset()等等魔术方法,需要的朋友可以参考下
    2015-07-07
  • 利用ajax和PHP实现简单的流程管理

    利用ajax和PHP实现简单的流程管理

    这篇文章主要为大家详细介绍了ajax和PHP实现简单的流程管理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • PHP 7.0.2 正式版发布

    PHP 7.0.2 正式版发布

    七年以来,PHP一直是第四大最流行的编程语言,驱动全球超过2亿多个网站,全球超过81.7%的公共网站在服务器端采用PHP。PHP在这个星期有了自2004年以来最大的飞跃,因为PHP 7已经发布
    2016-01-01
  • PC端微信扫码支付成功之后自动跳转php版代码

    PC端微信扫码支付成功之后自动跳转php版代码

    这篇文章主要为大家详细介绍了微信扫码支付成功之后自动跳转php版代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • thinkphp判断访客为手机端或PC端的方法

    thinkphp判断访客为手机端或PC端的方法

    这篇文章主要介绍了thinkphp判断访客为手机端或PC端的方法,通过获取用户$_SERVER['HTTP_USER_AGENT']信息后,再针对数组的遍历与匹配来判断访客类型,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11

最新评论