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>"; } */ }
运行效果如下:
第二步是要读取数据出来,代码如下:
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
Linux下将excel数据导入到mssql数据库中的方法
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@