2015-01-12 197 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

相關問題