在后台辅助角色之间传递 Excel 变量



我有两个后台工作者,需要将东西从第一个传递到另一个。

这就是我要传递的内容:

Dim APP As Excel.Application = New Microsoft.Office.Interop.Excel.Application()
Dim workbook As Excel.Workbook
Dim worksheet As Excel.Worksheet
Dim worksheetRange As Excel.Range
Dim status As String


这就是我试图通过它的方式:

Private Sub bwExport_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwExport.DoWork
Dim APP As Excel.Application = New Microsoft.Office.Interop.Excel.Application()
Dim workbook As Excel.Workbook
Dim worksheet As Excel.Worksheet
Dim worksheetRange As Excel.Range
Dim status As String
'code stuff here
Dim ExportList As New List(Of Object)(5)
ExportList.Add(APP)
ExportList.Add(workbook)
ExportList.Add(worksheet)
ExportList.Add(worksheetRange)
ExportList.Add(status)
e.Result = ExportList
End Sub

Private Sub bwExport_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bwExport.RunWorkerCompleted
bwExportFinish.RunWorkerAsync(e.Result)
End Sub


这就是我尝试检索它的方式:

Private Sub bwExportFinish_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwExportFinish.DoWork
Dim ExportList As List(Of Object) = TryCast(e.Result, List(Of Object))
Dim APP As Excel.Application = TryCast(ExportList(0), Excel.Application)
Dim workbook As Excel.Workbook = TryCast(ExportList(1), Excel.Workbook)
Dim worksheet As Excel.Worksheet = TryCast(ExportList(2), Excel.Worksheet)
Dim worksheetRange As String = TryCast(ExportList(3), String)
Dim status As String = TryCast(ExportList(4), String)
'Save spreadsheet
Dim SavePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "" & label1.Text & " " & Status & " Status " & System.DateTime.Now.ToString("MM.dd.yyyy HH;mm;ss") & ".xlsx"
workbook.SaveAs(SavePath)
workbook.Close(False)
End Sub


这是我得到的错误:
1。该行:将应用程序调暗为 Excel.Application = TryCast(ExportList(0),Excel.Application())
给了我错误:类型"Application()"的值无法转换为"应用程序"。
我是瞎子。我刚刚犯了一个格式错误。这是固定的。2.我收到一个错误,在VS2015中显示一个页面,显示"源不可用",然后在mscorlib中发生了"System.Reflection.TargetInvocationException"类型的未处理异常.dll



有人有什么想法吗?

好吧,你的代码中有几个错误,我将指出它们。

  • 正如我上面的评论中提到的:

    该错误实际上很好地解释了它。您的原始变量是 类型为 Excel.Application,而 Excel.Application() 是一个数组 相同的类型。因此,您需要将其转换为Excel.Application 如果甚至需要铸造。

  • 在第二个后台工作者 (bwExportFinish) 中,您尝试获取从第一个后台工作线程传递的List(Of Object),但使用了错误的变量 (e.Result)。怎么样?好吧,您将列表存储在第一个后台工作者的e.Result而不是第二个。现在,将该列表传递给第二个后台工作者后,您可以使用e.Argument而不是e.Result来访问它。

  • 另一个小错误是你创建了类型为Excel.Range的变量worksheetRange,然后将其转换为String

因此,第二个 BackgroundWorker 中的代码应如下所示:

Private Sub bwExportFinish_DoWork(sender As Object, e As DoWorkEventArgs) Handles bwExportFinish.DoWork
Dim ExportList As List(Of Object) = TryCast(e.Argument, List(Of Object))
If ExportList Is Nothing Then
' Casting has failed. Choose how you want to handle this.
End If
'Dim APP As Excel.Application = TryCast(ExportList(0), Excel.Application)
'Or you can skip the casting if you already know you passed the right object.
Dim APP As Excel.Application = ExportList(0)
Dim workbook As Excel.Workbook = ExportList(1)
Dim worksheet As Excel.Worksheet = ExportList(2)
Dim worksheetRange As Excel.Range = ExportList(3)
Dim status As String = ExportList(4)
'Save spreadsheet
workbook.SaveAs(SavePath)
workbook.Close(False)
APP.Quit()
End Sub

希望对:)有所帮助

最新更新