进度条在.net导入Excel时的应用实例
本文实例讲述了进度条在.net导入Excel时的应用,分享给大家供大家参考。具体实现方法如下:
在程序开发过程中,往往会涉及到将Excel表格导入到数据库中的需求,而当excel表格内容很多的时候,我们往往会很难去捕捉它的执行过程进度和一些错误信息,此时我们便可以通过以下方法去解决这些难题,具体实现过程分析如下:
一、建立一个web应用程序,在程序中首先创建一个html文件命名为ProgressBar,文件内容如下:
<html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/> <title></title> <scripttype="text/javascript"> //开始处理 functionBeginTrans(msg){ WriteText(msg); } //设置进度条进度 functionSetPorgressBar(msg,pos){ ProgressBar.style.width=pos+"%"; WriteText(msg+"已完成"+pos+"%"); } //处理结束 functionEndTrans(msg){ if(msg=="") WriteText("完成。"); else WriteText(msg); } //设置时间信息 functionSetTimeInfo(msg){ WriteText(msg); } //更新文本显示信息 functionWriteText(str){ varstrTag='<fontface="Verdana,Arial,Helvetica"size="2"color="#ea9b02"><B>'+str+'</B></font>'; document.getElementById("Msg2").innerHTML=strTag; } </script> </head> <body> <tablealign="center"style="height:100%"> <trstyle="height:45%"><td></td></tr> <tr> <td> <divid="ProgressBarSide"style="width:300px;color:Silver;border-width:1px;border-style:Solid;"> <divid="ProgressBar"align="center"style="height:20px;width:0%;background-color:#316AC5;"></div> </div> </td> <td> <divid="Msg2"style="height:16px;"></div> </td> </tr> <trstyle="height:50%"><td></td></tr> </table> </body> </html>
二、创建一个aspx页面,前后端代码分别如下:
//1.这里为了简便,我只写出了前端页面中的body体部分供参考: <formid="forms"runat="server"> <tablealign="center"style="height:100%"> <trstyle="height:45%"><td></td></tr> <tr> <tdalign="center"style="height:24px;width:100px;">Excel文件</td> <tdstyle="height:24px"> <asp:FileUploadID="fuGlossaryXls"runat="server"/> <asp:LabelID="Label2"runat="server"Font-Bold="True"ForeColor="Red"Text="不能为空" Visible="False"></asp:Label></td> <td> <asp:ButtonID="Button1"runat="server"CssClass="mybotton"Text="导入"Width="60px"onclick="Button1_Click"/></td> </tr> </table> </form> //2.后端部分代码如下: //这里是激发导入按钮点击事件 protectedvoidButton1_Click(objectsender,EventArgse) { stringcfilename=this.fuGlossaryXls.FileName;//获取准备导入的文件名称 if(cfilename=="") { Label2.Visible=true; return; } else { Label2.Visible=false; } //////////////显示进度///////////////////////////////////////////////////////////////////////////// DateTimestartTime=System.DateTime.Now; DateTimeendTime=System.DateTime.Now;
//根据ProgressBar.htm显示进度条界面 stringtemplateFileName=Path.Combine(Server.MapPath("."),"ProgressBar.htm"); StreamReaderreader=newStreamReader(@templateFileName,System.Text.Encoding.GetEncoding("gb2312")); stringhtml=reader.ReadToEnd(); reader.Close(); Response.Write(html); Response.Flush(); System.Threading.Thread.Sleep(1000);
stringjsBlock; //处理完成 jsBlock="<script>BeginTrans('正在加载数据,请耐心等待...');</script>"; Response.Write(jsBlock); Response.Flush();
stringfileName=fuGlossaryXls.PostedFile.FileName.Substring(fuGlossaryXls.PostedFile.FileName.LastIndexOf("\\")+1);//获取准备导入文件的文件名 stringsuffix=fileName.Substring(fileName.LastIndexOf(".")+1);//获取准备导入文件的后缀名 System.Threading.Thread.Sleep(200);
intmaxrows=0;//用来记录需要加载的数据总行数 boolerr=false;//用来记录加载状态 interrcount=0;//用来记录加载错误行数 if(fuGlossaryXls.HasFile)//判断当前是否有选取文件 { if(suffix=="xlsx") { DataTabledt=ExcelImport(fileName); for(inti=0;i<dt.Rows.Count;i++) { maxrows++; } //////////拓展//////////////////////////////////////////////////////// //DataViewmyView=newDataView(dt); //myView.RowFilter="nameisnotnull"; //intt=myView.Count;//获取满足RowFilter条件的数据行 //////////拓展//////////////////////////////////////////////////////// stringsqlconnect="DataSource=.;InitialCatalog=test;UserID=sa;Password=123456;";//本地数据库链接 SqlConnectionconn=newSqlConnection(sqlconnect); SqlTransactionmyTrans=null; try { SqlCommandcmd=newSqlCommand(null,conn); conn.Open(); myTrans=conn.BeginTransaction(); cmd.Transaction=myTrans; cmd.CommandText="deletefromtest"; cmd.ExecuteNonQuery();//首先执行清除表内容操作 for(intj=0;j<dt.Rows.Count;j++)//循环向数据库中插入excel数据 { if(string.IsNullOrEmpty(dt.Rows[j][0].ToString())) { jsBlock="<script>EndTrans('第"+j.ToString()+"行数据写入错误。');</script>"; Response.Write(jsBlock); Response.Flush(); err=true; errcount++; } else { cmd.CommandText=string.Format("insertintotestvalues('{0}','{1}','{2}','{3}')",dt.Rows[j][0],dt.Rows[j][1],dt.Rows[j][2],dt.Rows[j][3]); cmd.ExecuteNonQuery();//逐行向表中插入数据,注意字段的对应 } System.Threading.Thread.Sleep(1000); floatcposf=0; cposf=100*(j+1)/maxrows; intcpos=(int)cposf; jsBlock="<script>SetPorgressBar('已加载到第"+(j+1).ToString()+"条','"+cpos.ToString()+"');</script>"; Response.Write(jsBlock); Response.Flush(); } myTrans.Commit();//提交 } catch(Exceptionex) { myTrans.Rollback();//回滚 ClientScript.RegisterStartupScript(this.GetType(),"alert","<script>alert('"+ex.Message+"');</script>"); } finally { conn.Dispose(); conn.Close();//关闭数据库连接 } } else { ClientScript.RegisterStartupScript(GetType(),"","alert('请选择Excel文件!');",true); } } else { ClientScript.RegisterStartupScript(GetType(),"","alert('请选择要导入的Excel!');",true); } if(!err)//加载中并没有出现错误 { //处理完成 jsBlock="<script>EndTrans('处理完成。');</script>"; Response.Write(jsBlock); Response.Flush(); } else { jsBlock="<script>EndTrans('共有"+maxrows.ToString()+"条数据需要加载,其中有"+errcount.ToString()+"条数据录入错误!');</script>"; Response.Write(jsBlock); Response.Flush(); } System.Threading.Thread.Sleep(1000);
endTime=DateTime.Now;//录入完成所用时间 TimeSpants1=newTimeSpan(startTime.Ticks); TimeSpants2=newTimeSpan(endTime.Ticks); TimeSpants=ts2.Subtract(ts1).Duration();//取开始时间和结束时间两个时间差的绝对值 StringspanTime=ts.Hours.ToString()+"小时"+ts.Minutes.ToString()+"分"+ts.Seconds.ToString()+"秒"; jsBlock="<script>SetTimeInfo('加载完成,共用时"+spanTime+"');</script>"; Response.Write(jsBlock); Response.Flush();
} publicDataTableExcelImport(stringfileName)//建立Excel表链接,返回Excel表数据 { //EXCEL的连接串 stringsConnectionString="Provider=Microsoft.ACE.OLEDB.12.0;"+ "DataSource=C:\\DocumentsandSettings\\Administrator\\桌面\\"+fileName+";"+ "ExtendedProperties='Excel8.0;IMEX=1';"; //stringsConnectionString="Microsoft.ACE.OLEDB.4.0;"+ //"DataSource=C:\\DocumentsandSettings\\Administrator\\桌面\\"+fileName+";"+ //"ExtendedProperties='Excel8.0;IMEX=1';"; OleDbConnectionobjConn=newOleDbConnection(sConnectionString);//建立EXCEL的连接
//说明:程序运行到这里的时候有时会出错“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”,此时大多数情况下我们只需要去http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe下载一个AccessDatabaseEngine.exe安装即可,原因在于你的office没有安装ACCESS组件 objConn.Open(); OleDbCommandobjCmdSelect=newOleDbCommand("SELECT*FROM[Sheet1$]",objConn); OleDbDataAdapterobjAdapter1=newOleDbDataAdapter(); objAdapter1.SelectCommand=objCmdSelect; DataSetobjDataset1=newDataSet(); objAdapter1.Fill(objDataset1,"XLData"); DataTabledt=objDataset1.Tables[0]; //DataViewmyView=newDataView(dt); objConn.Close();//关闭EXCEL的连接 returndt; }