运行时错误“无法将类型为'System .__ ComObject'的COM对象强制转换为类类型'System.String'"

问题描述:

我正在做一个生成Microsoft Word文档的项目。我的代码如下。我得异常为System.InvalidCastException:无法将类型'System .__ ComObject'的COM对象强制转换为类类型'System.String'。表示COM组件的类型的实例不能转换为不代表COM组件的类型;但是只要底层的COM组件支持接口的IID的QueryInterface调用,就可以将它们强制转换为接口。

在report:示例.Form1.GetNewResult(Field wField,Document WordDoc)F:\ _deportexample \ renportexample\Form1.vb:第114行



I am doing a project to generate a Microsoft word document. My code as follows. Im getting exception as "System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to class type 'System.String'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.
at reportexample.Form1.GetNewResult(Field wField, Document WordDoc) in F:\reportexample\reportexample\Form1.vb:line 114"

Private Function GetNewResult(wField As Word.Field, WordDoc As Word.Document) As String

       Dim StopPos As Long
       Dim Variable As String = ""
       Dim UsedVariable As String
       Dim VariableValue As String
       Dim wRange As Word.Range

       Try
           Debug.Print(wField.Code)

           ' These three lines strip down the field code to find
           ' out it's name
           StopPos = InStrRev(wField.Code, "\*")
           Variable = Microsoft.VisualBasic.Left(wField.Code, StopPos - 3)
           Variable = Microsoft.VisualBasic.Right(Variable, Len(Variable) - 14)
       Catch ex As Exception
           TextBox1.Text = ex.ToString

       End Try


       ' Check this field hasn't already appeared in this
       ' document.
       If CheckUsedVariable(Variable) Then

           VariableValue = GetVariableValue(Variable)

       Else

           Select Case UCase(Variable)

               ' I don't simply want to insert a string -
               ' I wish to insert a table at the Product Field.
               Case "PRODUCT"

                   ' Get the range (location) of the product field
                   wRange = wField.Code
                   ' Delete the field, as any text will be inserted into the
                   ' {} of the existing field.
                   wField.Delete()

                   ' Enter our table information including headers.
                   ' Ideally, I would get this data from an ADO recordset
                   ' using GetString().
                   With wRange

                       .Text = "PRODUCT" & vbTab & "CTSBATCHNO" & vbTab & "SUPP REF" & vbTab & "PACKNO" & vbTab & "STORAGE" & vbTab & "QTY UNITS" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3" & vbCrLf & _
                                   "989797897" & vbTab & "hjhkhk" & vbTab & "kjhkjhkh" & vbTab & "kjhkjh" & vbTab & "Frozen" & vbTab & "3"

                       .FormattedText.Font.Name = "Arial"
                       .FormattedText.Font.Size = "8"

                       ' Once the data is there, we can convert it to a table
                       ' structure and format it to look pretty!
                       .ConvertToTable(vbTab, , , , WdTableFormat.wdTableFormatColorful2)

                   End With


                   ' Send back blank string as field does not exist anymore
                   VariableValue = ""

               Case Else

                   ' Get the value of the field from the user
                   VariableValue = InputBox("Enter value for: " & Variable, "Value not recognised for Despatch Note!")
                   AddNewVariable(Variable, VariableValue)

           End Select

       End If

       GetNewResult = VariableValue

   End Function