2015-01-12 6 views
0

поэтому наш ИТ-отдел обновил всех с Office 2007 до Office 2013, и многие из моих напряженных работ нужно переделать. (VS 2013 Express, рамки 4,5).net & Excel - от Office 2007 до 2013

Ошибка я получаю:

«Не удается привести COM-объект типа 'System .__ ComObject' к типу интерфейса 'Microsoft.Office.Interop.Excel.Range' Эта операция завершилась неудачно, потому что вызов QueryInterface на COM-компоненте для интерфейса с IID '{00020846-0000-0000-C000-000000000046} не удался из-за следующей ошибки: Интерфейс не зарегистрирован (Исключение из HRESULT: 0x80040155 "

Я понимаю, что это вызвано новой версией dll и т. Д., Но я часами и часами читал об этом, не найдя ничего полезного. Он разбивает первый «xlws.Cells (i, j) = dt.Rows (i - 1) .Item (J-1). ToString() "

Я нашел некоторые обходные пути и, наконец, сумел заставить его почти работать, но он чувствует себя намного сложнее, чем раньше. Я все еще борюсь с диапазонами и сортировкой.

Если кто-то может поделиться простой код, позволяющий:

  • Открыть Excel
  • Создать рабочий лист
  • значения Экспорт из DataTable на лист
  • Определите диапазон
  • Рассортируйте диапазон

Я бы очень благодарен FUL!

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 свойство класса Worksheet возвращает экземпляр класса Range. Таким образом, вы пытаетесь присвоить текст объекту диапазона, который невозможен.

В общем, чтобы избежать такой проблемы, я предлагаю разбить цепочку вызовов (несколько точек в одной строке кода) и объявить каждое свойство или метод вызова отдельной строкой кода.

Вы можете найти полезные ссылки How to automate Microsoft Excel from Visual Basic и Excel 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) = "Имя" – damien