2017-04-03 114 views
0

我有两个后台工作人员,需要将事务从第一个传递给另一个工作人员。在后台工作人员之间传递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.线:昏暗APP作为Excel.Application = TryCast(ExportList(0),Excel.Application( ))
给我错误:'Application()'类型的值不能被转换为'Application'
我是盲人。我刚刚发生格式错误。这是固定的。

2.我得到的是,在VS2015带来了一个网页的错误,上面写着“电源不可用”,然后类型“System.Reflection.TargetInvocationException”未处理的异常出现在mscorlib.dll



有没有人有任何想法?

+1

'路过背景之间的Excel变量Workers'这是一个潜在的很多麻烦;你确定你使用的所有'Excel'类型都是'线程安全的'吗? – Stefan

+0

那么,错误实际上解释得很好。您的原始变量是“Excel.Application”类型,而“Excel.Application()”是相同类型的数组。因此,如果需要强制转换,则需要将其转换为'Excel.Application' *。除此之外,我不相信这是@Stefan指出的正确方法。我想你应该重新考虑首先传递变量的必要性。 –

+0

@Stefan不,我不幸。我仍然在学习编码,并且不确定线程​​的安全性。我刚刚做了Google,但我不确定这些Excel类型会带来什么。如果这不是将这些从一个背景工作者传递给另一个背景工作者的方法,你能否指出我正确的方向? – lolikols

回答

2

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

  • 正如我在评论中提及上面:

    The error actually explains it pretty well. Your original variable is of type Excel.Application, while Excel.Application() is an array of the same type. Hence, you would need to cast it as Excel.Application if casting is even required.

  • 在你的第二个BackgroundWorker的(bwExportFinish),你试图让你从第一的BackgroundWorker通过List(Of Object),但你使用错误的变量(e.Result)。怎么样?那么,你存储在e.Result第一个 BackgroundWorker不是第二个之一。现在将该列表传递给第二个BackgroundWorker之后,您可以使用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 

希望帮助:)

+0

嘿,谢谢!我做了适当的修改,但是我仍然收到一个错误,它在VS2015中显示“Source Not Available”,然后在mscorlib.dll中发生了类型为“System.Reflection.TargetInvocationException”的未处理异常。 – lolikols

+0

我想在这种情况下,我们可能需要看看在第一个BackgroundWorker下有哪些代码可能会以某种方式改变变量。至于现在,我使用'bwExport_DoWork'代码做了一个快速测试,并对该范围进行了一些额外的工作,然后触发了修改后的'bwExportFinish_DoWork'代码,它工作得很好。 –

+0

第一个后台工作者实际上是将信息从一个不同的工作簿复制到我在上面的代码中声明的信息。这是相当长的代码,但我可以发布它,如果你想。当我公开声明excel时,代码实际上工作得很完美,但我试图在后台工作者中声明它,这看起来很糟糕。 – lolikols