datagridview 到 excel - 进度条 vb.net
datagridview to excel - progressbar vb.net
我有一个按钮可以让我将 datagridview 导出到 excel。有时它有超过 5000 行,因此需要更长的时间。
我尝试添加一个进度条,但它只是随机的(如下所示)。
我怎样才能更好地实现进度条?我不认为我需要计时器。
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim exeDir As New IO.FileInfo(Reflection.Assembly.GetExecutingAssembly.FullName)
Dim xlPath = IO.Path.Combine(exeDir.DirectoryName, "template.xlsx")
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
'Dim rTargetCell As Excel.Range
Dim misValue As Object = System.Reflection.Missing.Value
Dim i As Integer
Dim j As Integer
'TEST!
For i = 0 To i = ProgressBar1.Maximum
ProgressBar1.Value = i
ProgressBar1.Update()
Timer2.Start()
System.Threading.Thread.Sleep(25)
Next
'End Test!
xlApp = New Microsoft.Office.Interop.Excel.Application
xlWorkBook = xlApp.Workbooks.Open(xlPath)
xlWorkSheet = xlWorkBook.Worksheets("data")
For i = 0 To DataGridView2.RowCount - 1
For j = 0 To DataGridView2.ColumnCount - 1
For k As Integer = 1 To DataGridView2.Columns.Count
xlWorkSheet.Cells(i + 1, j + 1) = DataGridView2(j, i).Value
Next
Next
Next
xlWorkSheet.SaveAs("C:\Users\User\Desktop\" & TextBox3.Text & ".xlsx")
xlWorkBook.Close()
xlApp.Quit()
Process.Start("C:\Users\User\Desktop\" & TextBox3.Text & ".xlsx")
Me.Close()
End Sub
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
ProgressBar1.Increment(1)
Label3.Text = "(...)"
If ProgressBar1.Maximum = DataGridView2.Rows.Count Then
Label3.Text = "Finished"
End If
Timer2.Stop()
End Sub
您可以试试下面的方法。在开始循环之前,您可以将进度条最大值设置为您拥有的总数或记录。
me.progressbar1.maximum = DataGridView2.RowCount
For i = 0 To DataGridView2.RowCount - 1
For j = 0 To DataGridView2.ColumnCount - 1
For k As Integer = 1 To DataGridView2.Columns.Count
xlWorkSheet.Cells(i + 1, j + 1) = DataGridView2(j, i).Value
Next
Next
Me.ProgressBar1.performstep() 'increment your bar with each record
Next
假设您的进度条是从最小值 0 到最大值 100。您应该将要转储到 excel 的行除以 100。
例如在这一行下面For i = 0 To DataGridView2.RowCount - 1
把这行放在ProgressBar1.Value = Int(i * (ProgressBar1.Maximum / DataGridView2.RowCount))
然后在那下面放这一行以确保视图更新,因为你不是 运行 进度条在单独的线程上更新。My.Application.DoEvents()
所以它应该是这样的
For i = 0 To DataGridView2.RowCount - 1
ProgressBar1.Value = Int(i * (ProgressBar1.Maximum / DataGridView2.RowCount))
My.Application.DoEvents()
For j = 0 To DataGridView2.ColumnCount - 1
For k As Integer = 1 To DataGridView2.Columns.Count
xlWorkSheet.Cells(i + 1, j + 1) = DataGridView2(j, i).Value
Next
Next
Next
我有一个按钮可以让我将 datagridview 导出到 excel。有时它有超过 5000 行,因此需要更长的时间。
我尝试添加一个进度条,但它只是随机的(如下所示)。 我怎样才能更好地实现进度条?我不认为我需要计时器。
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim exeDir As New IO.FileInfo(Reflection.Assembly.GetExecutingAssembly.FullName)
Dim xlPath = IO.Path.Combine(exeDir.DirectoryName, "template.xlsx")
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
'Dim rTargetCell As Excel.Range
Dim misValue As Object = System.Reflection.Missing.Value
Dim i As Integer
Dim j As Integer
'TEST!
For i = 0 To i = ProgressBar1.Maximum
ProgressBar1.Value = i
ProgressBar1.Update()
Timer2.Start()
System.Threading.Thread.Sleep(25)
Next
'End Test!
xlApp = New Microsoft.Office.Interop.Excel.Application
xlWorkBook = xlApp.Workbooks.Open(xlPath)
xlWorkSheet = xlWorkBook.Worksheets("data")
For i = 0 To DataGridView2.RowCount - 1
For j = 0 To DataGridView2.ColumnCount - 1
For k As Integer = 1 To DataGridView2.Columns.Count
xlWorkSheet.Cells(i + 1, j + 1) = DataGridView2(j, i).Value
Next
Next
Next
xlWorkSheet.SaveAs("C:\Users\User\Desktop\" & TextBox3.Text & ".xlsx")
xlWorkBook.Close()
xlApp.Quit()
Process.Start("C:\Users\User\Desktop\" & TextBox3.Text & ".xlsx")
Me.Close()
End Sub
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
ProgressBar1.Increment(1)
Label3.Text = "(...)"
If ProgressBar1.Maximum = DataGridView2.Rows.Count Then
Label3.Text = "Finished"
End If
Timer2.Stop()
End Sub
您可以试试下面的方法。在开始循环之前,您可以将进度条最大值设置为您拥有的总数或记录。
me.progressbar1.maximum = DataGridView2.RowCount
For i = 0 To DataGridView2.RowCount - 1
For j = 0 To DataGridView2.ColumnCount - 1
For k As Integer = 1 To DataGridView2.Columns.Count
xlWorkSheet.Cells(i + 1, j + 1) = DataGridView2(j, i).Value
Next
Next
Me.ProgressBar1.performstep() 'increment your bar with each record
Next
假设您的进度条是从最小值 0 到最大值 100。您应该将要转储到 excel 的行除以 100。
例如在这一行下面For i = 0 To DataGridView2.RowCount - 1
把这行放在ProgressBar1.Value = Int(i * (ProgressBar1.Maximum / DataGridView2.RowCount))
然后在那下面放这一行以确保视图更新,因为你不是 运行 进度条在单独的线程上更新。My.Application.DoEvents()
所以它应该是这样的
For i = 0 To DataGridView2.RowCount - 1
ProgressBar1.Value = Int(i * (ProgressBar1.Maximum / DataGridView2.RowCount))
My.Application.DoEvents()
For j = 0 To DataGridView2.ColumnCount - 1
For k As Integer = 1 To DataGridView2.Columns.Count
xlWorkSheet.Cells(i + 1, j + 1) = DataGridView2(j, i).Value
Next
Next
Next