2016-02-24 2 views
0

У меня есть кнопка, позволяющая мне экспортировать datagridview в excel. Иногда он имеет более 5000 строк, поэтому требуется немного больше времени.datagridview to excel - progressbar vb.net

Я попытался добавить индикатор выполнения, но это просто случайный (способ, которым он ниже). Как я могу лучше всего реализовать индикатор прогресса? В любом случае, я не думаю, что мне нужен таймер.

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 
+0

это из - http://stackoverflow.com/questions/14217894/vb-net-progress-bar – codeMonger123

+0

где это поможет мне спариваться? честный вопрос здесь – noidea

+0

@ codeMonger123 Я имею в виду, если я делаю, что индикатор прогресса останавливается немного раньше максимума. я думаю, это не englobe SaveAs .. – noidea

ответ

0

Предположим, что ваш прогресс бар от минимального значения 0 до максимального значения 100. Вы должны разделить строку, которую вы собираетесь сбросить в первенствует на 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 
+0

Я знаю. но как насчет «SaveAs»? требуется время ... иногда более 60 секунд .. и все же прогресс-панель уже завершена – noidea

+0

Индикатор выполнения не показывает время, необходимое для сохранения файла. Индикатор выполнения показывает, как далеко по рутине были записаны значения данных для листа Excel. Если вам нужно отобразить индикатор выполнения или что-то еще, пока ваше приложение или элемент управления excel для сохранения файла, вам может потребоваться сохранить файл из другого потока. – Pure

+0

и возможно ли с помощью кода, который у меня есть до сих пор? потому что я не вижу, как xlApp связывается с другим потоком. или к другому потоку. – noidea

0

Вы можете попробовать что-то вроде ниже. перед тем, как вы начнете цикл, вы можете установить максимальное допустимое значение progressbar на общее количество или записи, которые у вас есть.

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

вот что я сделал. но таким образом, после того, как индикатор прогресса завершен, «задача» все еще не завершена, например, SaveAs .. – noidea

+0

Я вижу, хорошо, что если вы сделали максимальную + 1 запись своих данных, а затем сразу после меня. увеличьте шаг выполнения на 1, который завершит индикатор выполнения. – codeMonger123

+0

Я тоже об этом думал. однако действие сохранения требует нескольких секунд, в зависимости от количества строк. иногда более 1 минуты, и это довольно странно, когда бар почти завершен, но остановился более чем на несколько секунд. – noidea

Смежные вопросы