.net&;Excel-从Office 2007到2013

.net&;Excel-从Office 2007到2013,.net,excel,office-interop,office-2007,office-2013,.net,Excel,Office Interop,Office 2007,Office 2013,因此,我们的IT部门将每个人从Office 2007升级到Office 2013,我的许多辛勤工作都必须重做。(VS 2013 Express,框架4.5) 我得到的错误是: 无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Range”。此操作失败,因为由于以下错误,对IID为“{00020846-0000-0000-C000-0000000000 46}”的接口的COM组件的QueryInterf

因此,我们的IT部门将每个人从Office 2007升级到Office 2013,我的许多辛勤工作都必须重做。(VS 2013 Express,框架4.5)

我得到的错误是:

无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel.Range”。此操作失败,因为由于以下错误,对IID为“{00020846-0000-0000-C000-0000000000 46}”的接口的COM组件的QueryInterface调用失败:接口未注册(HRESULT的异常:0x80040155”

我知道这是由互操作新dll版本等引起的,但我花了好几个小时阅读它,却没有找到任何有用的东西。它使第一个“xlws.Cells(I,j)=dt.Rows(I-1).Item(j-1).ToString()崩溃

我确实找到了一些解决办法,最终使它几乎可以工作,但它感觉比以前复杂得多,我仍然在为范围和排序而挣扎

如果有人可以共享一个简单的代码,允许:

  • 打开Excel
  • 创建工作表
  • 将值从数据表导出到工作表
  • 定义一个范围
  • 对范围进行排序
我真的很感激

Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim misValue As Object = System.Reflection.Missing.Value
xlApp = CreateObject("Excel.application")
xlApp.Visible = False
xlApp.DisplayAlerts = False
xlWorkBook = xlApp.Workbooks.Add(misValue)

Dim myrange As Excel.Range
Dim xlws As Excel.Worksheet
xlws = xlwb.Worksheets.Add(After:=xlwb.Worksheets(xlwb.Worksheets.Count))
xlws.Name = “name”

For i = 1 To dt.Rows.Count
    For j = 1 To dt.Columns.Count
        xlws.Cells(i, j) = dt.Rows(i - 1).Item(j-1).ToString()
    Next
Next

xlws.Columns.AutoFit()

myrange = xlws.UsedRange
myrange.Select()
myrange.Sort(Key1:=myrange.Range("M1"), Order1:=Excel.XlSortOrder.xlAscending,     Orientation:=Excel.XlSortOrientation.xlSortColumns)
myrange = xlws.Cells(2, 1)
myrange.Select()

xlWorkBook.Worksheets("Sheet1").Delete()
xlWorkBook.Worksheets("Sheet2").Delete()
xlWorkBook.Worksheets("Sheet3").Delete()
xlWorkBook.Worksheets("name").select()

xlWorkBook.SaveAs(folder_str & Format(Now, "MMddyyyy").ToString & " - " & “name” & ".xlsx")

xlWorkBook.Close()
xlApp.Quit()

Marshal.ReleaseComObject(xlws)
Marshal.ReleaseComObject(xlWorkBook)
Marshal.ReleaseComObject(xlApp)
工作表类的属性返回Range类的实例。因此,您试图将文本分配给Range对象,这是不可能的

一般来说,为了避免这种问题,我建议打破调用链(一行代码中有多个点),并在单独的代码行上声明每个属性或方法调用


您可能会发现和链接很有用。在那里您会找到一个示例代码。

msdn链接没有用,因为解释和代码示例正是我在Office 2007中使用的。看起来Office 2010之后一切都变了……但我找不到与Office 2010/2013相关的简单msdn页面。非常令人沮丧……我没有查看这些版本之间的任何重大更改。您正在谈论哪些更改?例如,我可以使第一行正常工作的唯一方法是将其更改为oSheet.Name=“TEST”oWB.Worksheets(oSheet.Name)。Range(“A”&1)=“first Name”“对于office 2010和2013,对象库是14和15…文章中没有提到。是的,文章很老,但从那以后除了您注意到的V期编号外,没有任何变化。