问题描述
各位大虾:请问如何在保存数据到excel的过程中显示保存的进度条那。我现在讲datagridview的内容保存到excel时总是会卡顿很久,线做一个进度条显示保存的进度。但是不知道怎么弄,求指点!注意:需要真实显示保存的进度状态。
解决方案
解决方案二:
保存时如果你是遍历grid,那就加个progressbar就是了
解决方案三:
引用楼主guangzi8531的回复:
各位大虾:请问如何在保存数据到excel的过程中显示保存的进度条那。我现在讲datagridview的内容保存到excel时总是会卡顿很久,线做一个进度条显示保存的进度。但是不知道怎么弄,求指点!注意:需要真实显示保存的进度状态。
你在循环的时候把进度条加在循环体内就行了啊.例如:me.pb.MaxValue=me.datagridview.rows.countforiLoopasinteger=0tome.datagridview.rows.countme.pb.Value=iloop+1next
解决方案四:
http://blog.csdn.net/lightlater/article/details/8092991使用BackgroundWorker进行进度条控制
解决方案五:
privateBackgroundWorkerbkWorker=newBackgroundWorker();///<summary>///步进值///</summary>privateintpercentValue=0;publicForm1(){InitializeComponent();bkWorker.WorkerReportsProgress=true;bkWorker.WorkerSupportsCancellation=true;bkWorker.DoWork+=newDoWorkEventHandler(DoWork);///添加一个事件处理程序this.bkWorker.DoWork+=newDoWorkEventHandler(DataGridViewtoExcel);bkWorker.ProgressChanged+=newProgressChangedEventHandler(ProgessChanged);bkWorker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(CompleteWork);}privatevoidbutton1_Click(objectsender,EventArgse){percentValue=10;this.progressBar1.Maximum=1000;//执行后台操作bkWorker.RunWorkerAsync();}publicvoidDataGridViewtoExcel(objectsender,DoWorkEventArgse){//导出到execltry{if(dataGridView1.Rows.Count==0){toolStripStatusLabel1.Text="当前时间点没有数据,请重新选择时间范围!";}else{Microsoft.Office.Interop.Excel.Applicationexcel=newMicrosoft.Office.Interop.Excel.Application();excel.Visible=false;excel.Application.Workbooks.Add(true);for(inti=0;i<dataGridView1.Columns.Count;i++){excel.Cells[1,i+1]=dataGridView1.Columns[i].HeaderText;}for(inti=0;i<dataGridView1.Rows.Count-1;i++){for(intj=0;j<dataGridView1.Columns.Count;j++){if(dataGridView1[j,i].ValueType==typeof(string)){excel.Cells[i+2,j+1]="'"+dataGridView1[j,i].Value.ToString();}else{excel.Cells[i+2,j+1]=dataGridView1[j,i].Value.ToString();}}}Worksheetworksheet=(Worksheet)excel.ActiveSheet;worksheet.SaveAs(System.Windows.Forms.Application.StartupPath+"\excel\"+DateTime.Now.ToString("yyyyMMddHHmmss")+".xls",Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);excel.DisplayAlerts=false;excel.AlertBeforeOverwriting=false;excel.Quit();excel=null;}}catch(Exceptionex){MessageBox.Show(ex.Message,"错误提示");}toolStripStatusLabel1.Text="数据完成!";}publicvoidDoWork(objectsender,DoWorkEventArgse){//事件处理,指定处理函数e.Result=ProcessProgress(bkWorker,e);}publicvoidProgessChanged(objectsender,ProgressChangedEventArgse){//bkWorker.ReportProgress会调用到这里,此处可以进行自定义报告方式this.progressBar1.Value=e.ProgressPercentage;intpercent=(int)(e.ProgressPercentage/percentValue);this.label1.Text="处理进度:"+Convert.ToString(percent)+"%";}publicvoidCompleteWork(objectsender,RunWorkerCompletedEventArgse){this.label1.Text="处理完毕!";}privateintProcessProgress(objectsender,DoWorkEventArgse){for(inti=0;i<=1000;i++){if(bkWorker.CancellationPending){e.Cancel=true;return-1;}else{//状态报告bkWorker.ReportProgress(i);//等待,用于UI刷新界面,很重要System.Threading.Thread.Sleep(15);}}return-1;}privatevoidForm1_Load(objectsender,EventArgse){stringstrConn="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=temp21.mdb";OleDbConnectionconn=newOleDbConnection(strConn);stringstrExcel="";DataSetds=newDataSet();strExcel="select*from02";OleDbDataAdapterda=newOleDbDataAdapter(strExcel,strConn);da.Fill(ds);dataGridView1.DataSource=ds.Tables[0];}
解决方案六:
http://download.csdn.net/detail/caozhy/4832657
解决方案七:
必须明白使用进度条的意义和用处。只要运行时间长一些的情况的使用。运行时间不到3秒的情况下使用进度条毫无意义。因为,看不到进度条或太瞬间的。
解决方案八:
我datagridview几万条数据保存到excel也几乎是秒写以前我一条条写也是很慢,后来使用一次性写到数组再写入excel的range.秒写.什么进度表什么的,不用管了,优化你的导出效率就行了我贴个给你参考一下PublicSubDatagridview2Excel(ByValDtgAsDataGridView)IfDtg.RowCount>0ThenTryDimdatav=CType(Dtg.DataSource,DataView)'IfTypeOfDtg.DataSourceIsDataViewThen'datav=CType(Dtg.DataSource,DataView)'ElseIfTypeOfDtg.DataSourceIsDataSetThen'datav=CType(Dtg.DataSource,DataSet).Tables(0).DefaultView'ElseIfTypeOfDtg.DataSourceIsDataTableThen'datav=CType(Dtg.DataSource,DataTable).DefaultView'EndIfDimi,jAsIntegerDimrowsAsInteger=datav.CountDimcolsAsInteger=datav.Table.Columns.CountDimDataArray(rows-1,cols-1)AsStringDimmyExcelAsExcel.Application=NewExcel.ApplicationFori=0Torows-1Forj=0Tocols-1IfIsDBNull(datav(i).Item(j))ThenDataArray(i,j)=""ElseDataArray(i,j)=datav(i).Item(j).ToStringEndIfNextNextmyExcel.Application.Workbooks.Add(True)myExcel.Visible=TrueForj=0Tocols-1myExcel.Cells(1,j+1)=datav.Table.Columns(j).ColumnNameNextmyExcel.Range("A2").Resize(rows,cols).Value=DataArrayCatchexpAsExceptionMessageBox.Show(exp.Message)EndTryElseMessageBox.Show("没有数据!")EndIfEndSub
看如上代码,原理就是将所有内容先写到数组,再将该数组一次性赋值给excel的range,非常快和一条条遍历去操作excel,那种速度你懂的。