2014-11-18 2 views
1

IHAVE экспорта приложение ListView в Excel лист, и им пытаются сделать это в фоновом режиме, но у меня есть ошибки в savefiledialog.showdialog(), это ошибка:STAThreadAttribute с SaveFileDialog vb.nt

Исключение типа ' System.Threading.ThreadStateException "произошел в System.Windows.Forms.dll, но не был обработан в коде пользователя

Дополнительная информация: Текущая нить должна быть настроена на режим однопоточной квартиры (STA) до того, как вызовы OLE могут быть выполнены. Убедитесь, что ваша основная функция имеет STAThreadAttribute, отмеченный на нем. Это исключение возникает только в том случае, если к процессу прикреплен отладчик.

и yhis мой код:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

Public Sub saveExcelFile(ByVal FileName As String) 
    Try 
     Dim xls As New Excel.Application 
     Dim sheet As Excel.Worksheet 
     Dim i As Integer 
     xls.Workbooks.Add() 
     sheet = xls.ActiveWorkbook.ActiveSheet 
     Dim row As Integer = 1 
     Dim col As Integer = 1 
     For i = 0 To Me.ListView1.Columns.Count - 1 
      sheet.Cells(1, i + 1) = Me.ListView1.Columns(i).Text 
     Next 
     For i = 0 To Me.ListView1.Items.Count - 1 
      For j = 0 To Me.ListView1.Items(i).SubItems.Count - 1 
       sheet.Cells(i + 2, j + 1) = Me.ListView1.Items(i).SubItems(j).Text 
      Next 
     Next 

     row += 1 
     col = 1 

     ' for the header 
     sheet.Rows(1).Font.Name = "Cooper Black" 
     sheet.Rows(1).Font.size = 12 
     sheet.Rows(1).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter 
     Dim mycol As System.Drawing.Color = System.Drawing.ColorTranslator.FromHtml("#148cf7") 
     sheet.Rows(1).Font.color = mycol 
     ' for all the sheet without header 
     sheet.Range("a2", "z1000").Font.Name = "Arial" 
     sheet.Range("a2", "z1000").Font.Size = 13 
     sheet.Range("a2", "z1000").HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter 

     sheet.Range("A1:X1").EntireColumn.AutoFit() 
     sheet.Range("A1:X1").EntireRow.AutoFit() 

     xls.ActiveWorkbook.SaveAs(FileName) 
     xls.Workbooks.Close() 
     xls.Quit() 
    Catch ex As Exception 

    End Try 
End Sub 

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    Try 

     Dim saveFileDialog1 As New SaveFileDialog 
     saveFileDialog1.Filter = "Excel File|*.xlsx" 
     saveFileDialog1.Title = "Save an Excel File" 
     saveFileDialog1.ShowDialog() 
     If saveFileDialog1.FileName <> "" Then 
      saveExcelFile(saveFileDialog1.FileName) 
     End If 

    Catch ex As Exception 

    End Try 
End Sub 

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
    MsgBox("done") 
End Sub 

ответ

0

я поставить этот код в виде нагрузки и все идеально:

Control.CheckForIllegalCrossThreadCalls = False 
1

Вы можете переместить все относительно SaveFileDialog1 к Button3_Click и сохранить имя файла в частной переменной, поэтому она может быть использована позже в BackgroundWorker1_DoWork.

Private _filename As String 

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
    SaveFileDialog1.Title = "Save Excel File" 
    SaveFileDialog1.Filter = "Excel files (*.xls)|*.xls|Excel Files (*.xlsx)|*.xslx" 
    SaveFileDialog1.ShowDialog() 

    'exit if no file selected 
    If SaveFileDialog1.FileName = "" Then 
     Exit Sub 
    End If 

    _filename = SaveFileDialog1.FileName 

    BackgroundWorker1.RunWorkerAsync() 
End Sub 

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    ... 
    book.SaveAs(_filename) 
    ... 
End Sub 
+0

это не работает 2 :( –

+0

Что именно не работает, не будет его строить ли вам получать? Exception? –

+0

im меняет свой код, если вы видите, и я попытался сохранить savegialog имя 1.file в переменной, и у меня такая же ошибка :( –

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