2015-01-12 152 views
0

因此,我们的IT部门将所有人从Office 2007升级到Office 2013,并且我的许多努力工作必须重做。 (VS 2013 Express中,框架4.5).net&Excel - 从Office 2007到2013

我得到的错误是:

“无法投类型的COM对象 '系统.__ ComObject' 的接口类型 'Microsoft.Office.Interop.Excel.Range' 。此操作失败,因为具有IID'{00020846-0000-0000-C000-000000000046}'的接口的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) 

回答

0

工作表类的Cells属性返回范围类的一个实例。所以你试图给一个不可能的范围对象分配一个文本。

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

您可能会发现How to automate Microsoft Excel from Visual BasicExcel Automation from Ron de Bruin链接有帮助。在那里你会找到一个示例代码。

+0

msdn链接没有用,因为解释和代码示例正是我在Office 2007中使用的。看起来在Office 2010之后所有内容都发生了变化......但是我无法找到像这样的简单msdn页面与Office 2010/2013相关。非常令人沮丧... – damien

+0

我没有看到这些版本之间有任何重大变化。你在说什么改变? –

+0

例如,我可以使第一行工作的唯一方法是将其更改为oSheet.Name =“TEST” oWB.Worksheets(oSheet.Name).Range(“A”&1)=“First Name” – damien

相关问题