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