Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Способы передачи данные Visual Basic.Net в Excel Добавлено: 23.04.10 22:30  

Автор вопроса:  vladigasparo
Привет всем!
Люди дорогие у меня вот какая проблема. Я хочу программным путем передать данные Visual Basic.Net (Visual Studio 2008) в Excel 2007. Вот код, через которого произвожу действия:

Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object

'Открыть новую книгу Excel
oExcel = CreateObject("Excel.Application")
oBook = oExcel.Workbooks.Add

'Добавить данные в ячейки первого листа новой книги
oSheet = oBook.Worksheets(1)

oSheet.Range("A1").value = "My Name"
oSheet.Range("A1").Font.Size = 12
oSheet.Range("A1").HorizontalAlignment = 2

'Сохранить книгу и закрыть Excel
oBook.SaveAs("D:\Blank.xls")
oExcel.Quit()

но во время компиляции (F5) на строке
oBook = oExcel.Workbooks.Add

выводится следующая ошибка: "Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD)):"
Присоединяю библиотеку: Project > Add Reference ... > Раздел COM > Microsof Excel 12.0 Object Library, но все равно не получается.
Если кто-нибудь из вас сталкивался с такой проблемой, пожалуйста помогите.

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 24.04.10 17:56
  1.             Type moAppType = System.Type.GetTypeFromProgID("Excel.Application.12");
  2.             Application excelApp = (Microsoft.Office.Interop.Excel.Application)System.Activator.CreateInstance(moAppType);
  3.             excelApp.DisplayAlerts = false;
  4.  
  5.             Workbook workbook = excelApp.Workbooks.Open(@"t.xlsx");
  6.  
  7.             int lastRow = GetLastRow(sheet);
  8.             int lastColumn = GetLastColumn(sheet);
  9.  
  10.             object[,] keys = sheet.get_Range(string.Format("B2:K{0}", lastRow)).Formula as object[,];
  11.             object[,] newValues = sheet.get_Range(string.Format("AD2:AD{0}", lastRow)).Formula as object[,];
  12.  
  13.             for (int i = keys.GetLowerBound(0); i <= keys.GetUpperBound(0); i++)
  14.             {
  15.                 string key = year.ToString() + "|" + keys[i, 1].ToString().ToLower() + "|" + keys[i, 7].ToString().ToLower();
  16.  
  17.                 if (data.ContainsKey(key))
  18.                     newValues[i, 1] = (double)data[key].Netto / 1000;
  19.                 else
  20.                     newValues[i, 1] = "";
  21.  
  22.             }
  23.  
  24.             sheet.get_Range(string.Format("AD2:AD{0}", lastRow)).Value2 = newValues;
  25.  
  26.             workbook.Save();
  27.             workbook.Close(true);
  28.  
  29.             excelApp.Quit();

Ответить

Номер ответа: 2
Автор ответа:
 VbStarter



ICQ: 357911808 

Вопросов: 118
Ответов: 1340
 Web-сайт: moscowdevils.ru
 Профиль | | #2
Добавлено: 24.04.10 18:50
а можно под vb6 ???

Ответить

Номер ответа: 3
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #3 Добавлено: 25.04.10 05:14
Забыл 2 функции

  1.         private static int GetLastRow(Worksheet sheet)
  2.         {
  3.             return sheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Row;
  4.         }
  5.  
  6.         private static int GetLastColumn(Worksheet sheet)
  7.         {
  8.             return sheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Column;
  9.         }




Под VB6 можно делать то же самое.

Ответить

Номер ответа: 4
Автор ответа:
 vladigasparo



Вопросов: 9
Ответов: 5
 Профиль | | #4 Добавлено: 27.04.10 06:51
Artyom, а можешь помочь как этот код переделать на Visual Basic.Net?
Заранее спасибо

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 27.04.10 17:47
Код довольно тривиальный, не вижу сложности перевода на VB .NET, единственная сложность - нет времени
Но за вознаграждение мог бы сделать, если интерисует стучи в аську 429213446

Ответить

Номер ответа: 6
Автор ответа:
 VbStarter



ICQ: 357911808 

Вопросов: 118
Ответов: 1340
 Web-сайт: moscowdevils.ru
 Профиль | | #6
Добавлено: 28.04.10 19:56
нет отлицается синтаксисом знаков и некоторых команд только чтоли (скобок там разних и тп)

Ответить

Номер ответа: 7
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #7
Добавлено: 28.04.10 21:03
  1. Dim moAppType As Type = System.Type.GetTypeFromProgID("Excel.Application.12")
  2. Dim excelApp As Application = DirectCast(System.Activator.CreateInstance(moAppType), Microsoft.Office.Interop.Excel.Application)
  3. excelApp.DisplayAlerts = False
  4. Dim workbook As Workbook = excelApp.Workbooks.Open("t.xlsx")
  5. Dim lastRow As Integer = GetLastRow(sheet)
  6. Dim lastColumn As Integer = GetLastColumn(sheet)
  7. Dim keys As Object(,) = TryCast(sheet.get_Range(String.Format("B2:K{0}", lastRow)).Formula, Object(,))
  8. Dim newValues As Object(,) = TryCast(sheet.get_Range(String.Format("AD2:AD{0}", lastRow)).Formula, Object(,))
  9. For i As Integer = keys.GetLowerBound(0) To keys.GetUpperBound(0)
  10.     Dim key As String = ((year.ToString() & "|") + keys(i, 1).ToString().ToLower() & "|") + keys(i, 7).ToString().ToLower()
  11.     
  12.     If data.ContainsKey(key) Then
  13.         newValues(i, 1) = CDbl(data(key).Netto) / 1000
  14.     Else
  15.         newValues(i, 1) = ""
  16.         
  17.     End If
  18. Next
  19. sheet.get_Range(String.Format("AD2:AD{0}", lastRow)).Value2 = newValues
  20. workbook.Save()
  21. workbook.Close(True)
  22. excelApp.Quit()

Ответить

Номер ответа: 8
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #8
Добавлено: 28.04.10 21:03
:)

Ответить

Номер ответа: 9
Автор ответа:
 vladigasparo



Вопросов: 9
Ответов: 5
 Профиль | | #9 Добавлено: 02.05.10 21:15
Интересная ситуация получилась, удалил из компьютера Office 2007 en, установил Office 2007 русская версия и все получилось.

Ответить

Номер ответа: 10
Автор ответа:
 vladigasparo



Вопросов: 9
Ответов: 5
 Профиль | | #10 Добавлено: 02.05.10 21:15
Интересная ситуация получилась, удалил из компьютера Office 2007 eng, установил Office 2007 русская версия и все получилось. Почему? Чем плох 2007 eng.?

Ответить

Номер ответа: 11
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 02.05.10 21:53
Ничем, у меня стоит английская версия и все работает

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам