Поделиться через


Как автоматизировать Excel из Visual Basic .NET для заполнения или получения данных в диапазоне с помощью массивов

Аннотация

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

Дополнительная информация

Чтобы заполнить диапазон с несколькими ячейками, не заполняя ячейки по одному, можно задать для свойства Value объекта Range двумерный массив. Аналогичным образом, двумерный массив значений можно получить для нескольких ячеек одновременно с помощью свойства Value. Следующие шаги демонстрируют этот процесс как для настройки, так и для извлечения данных с помощью двумерных массивов.

Создание клиента автоматизации для Microsoft Excel

  1. Запустите Microsoft Visual Studio .NET.

  2. В меню Файл выберите команду Создать, а затем выберите Проект. Выберите приложение Windows из типов проектов Visual Basic. По умолчанию создается Form1.

  3. Добавьте ссылку на библиотеку объектов Microsoft Excel. Для этого выполните следующие действия:

    1. On the Project menu, click Add Reference.
    2. На вкладке COM найдите библиотеку объектов Microsoft Excel и нажмите кнопку "Выбрать".

    Примечание Microsoft Office 2007 и Microsoft Office 2003 включают основные сборки взаимодействия (PIA). Microsoft Office XP не включает ЛИЧНЫЕ, но их можно скачать.

  4. Нажмите кнопку "ОК" в диалоговом окне "Добавление ссылок", чтобы принять выбранные параметры. Если вам будет предложено создать оболочки для выбранных библиотек, нажмите кнопку "Да".

  5. В меню "Вид" выберите панель элементов, чтобы отобразить панель элементов. Добавьте две кнопки и флажок в Form1.

  6. Задайте для свойства Name для флажка значение FillWithStrings.

  7. Дважды щелкните кнопку Button1. Появится окно кода для формы.

  8. Добавьте следующий код в начало Form1.vb:

    Imports Microsoft.Office.Interop
    
    
  9. В окне кода замените приведенный ниже код.

     Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
    End Sub
    

    на:

     'Keep the application object and the workbook object global, so you can  
     'retrieve the data in Button2_Click that was set in Button1_Click.
     Dim objApp As Excel.Application
     Dim objBook As Excel._Workbook
    
    Private Sub Button1_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles Button1.Click
         Dim objBooks As Excel.Workbooks
         Dim objSheets As Excel.Sheets
         Dim objSheet As Excel._Worksheet
         Dim range As Excel.Range
    
    ' Create a new instance of Excel and start a new workbook.
         objApp = New Excel.Application()
         objBooks = objApp.Workbooks
         objBook = objBooks.Add
         objSheets = objBook.Worksheets
         objSheet = objSheets(1)
    
    'Get the range where the starting cell has the address
         'm_sStartingCell and its dimensions are m_iNumRows x m_iNumCols.
         range = objSheet.Range("A1", Reflection.Missing.Value)
         range = range.Resize(5, 5)
    
    If (Me.FillWithStrings.Checked = False) Then
             'Create an array.
             Dim saRet(5, 5) As Double
    
    'Fill the array.
             Dim iRow As Long
             Dim iCol As Long
             For iRow = 0 To 5
                 For iCol = 0 To 5
    
    'Put a counter in the cell.
                     saRet(iRow, iCol) = iRow * iCol
                 Next iCol
             Next iRow
    
    'Set the range value to the array.
             range.Value = saRet
    
    Else
             'Create an array.
             Dim saRet(5, 5) As String
    
    'Fill the array.
             Dim iRow As Long
             Dim iCol As Long
             For iRow = 0 To 5
                 For iCol = 0 To 5
    
    'Put the row and column address in the cell.
                     saRet(iRow, iCol) = iRow.ToString() + "|" + iCol.ToString()
                 Next iCol
             Next iRow
    
    'Set the range value to the array.
             range.Value = saRet
         End If
    
    'Return control of Excel to the user.
         objApp.Visible = True
         objApp.UserControl = True
    
    'Clean up a little.
         range = Nothing
         objSheet = Nothing
         objSheets = Nothing
         objBooks = Nothing
     End Sub
    
    
  10. Вернитесь в конструктор формы Form1, а затем дважды щелкните кнопку Button2.

  11. В окне кода замените приведенный ниже код.

    Private Sub Button2_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button2.Click
    
    End Sub
    

    на:

    Private Sub Button2_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button2.Click
        Dim objSheets As Excel.Sheets
        Dim objSheet As Excel._Worksheet
        Dim range As Excel.Range
    
    'Get a reference to the first sheet of the workbook.
        On Error Goto ExcelNotRunning
        objSheets = objBook.Worksheets
        objSheet = objSheets(1)
    
    ExcelNotRunning:
        If (Not (Err.Number = 0)) Then
            MessageBox.Show("Cannot find the Excel workbook.  Try clicking Button1 to " + _
            "create an Excel workbook with data before running Button2.", _
            "Missing Workbook?")
    
    'We cannot automate Excel if we cannot find the data we created, 
            'so leave the subroutine.
            Exit Sub
        End If
    
    'Get a range of data.
        range = objSheet.Range("A1", "E5")
    
    'Retrieve the data from the range.
        Dim saRet(,) As Object
        saRet = range.Value
    
    'Determine the dimensions of the array.
        Dim iRows As Long
        Dim iCols As Long
        iRows = saRet.GetUpperBound(0)
        iCols = saRet.GetUpperBound(1)
    
    'Build a string that contains the data of the array.
        Dim valueString As String
        valueString = "Array Data" + vbCrLf
    
    Dim rowCounter As Long
        Dim colCounter As Long
        For rowCounter = 1 To iRows
            For colCounter = 1 To iCols
    
    'Write the next value into the string.
                valueString = String.Concat(valueString, _
                    saRet(rowCounter, colCounter).ToString() + ", ")
    
    Next colCounter
    
    'Write in a new line.
            valueString = String.Concat(valueString, vbCrLf)
        Next rowCounter
    
    'Report the value of the array.
        MessageBox.Show(valueString, "Array Values")
    
    'Clean up a little.
        range = Nothing
        objSheet = Nothing
        objSheets = Nothing
    End Sub
    
    

Тестирование клиента службы автоматизации

  1. Нажмите клавишу F5, чтобы выполнить сборку и запуск примера программы.
  2. Нажмите кнопку1. Microsoft Excel запускается с новой книги, а ячейки A1:E5 первого листа заполняются числовыми данными из массива.
  3. Нажмите кнопку "Кнопка2". Программа извлекает данные из ячеек A1:E5 в новый массив и отображает результаты в окне сообщения.
  4. Выберите FillWithStrings и нажмите кнопку Button1, чтобы заполнить ячейки A1:E5 строковыми данными.

Ссылки

Дополнительные сведения об использовании массивов для задания и извлечения данных Excel в более ранних версиях Visual Studio см. в приведенных ниже номерах статей, чтобы просмотреть статью в базе знаний Майкрософт:

247412 INFO: Методы передачи данных в Excel из Visual Basic