Jak zautomatyzować program Microsoft Excel z programu Microsoft Visual C#.NET

Podsumowanie

W tym artykule przedstawiono sposób tworzenia klienta usługi Automation dla programu Microsoft Excel przy użyciu platformy .NET w języku Microsoft Visual C#.

Więcej informacji

Automatyzacja to proces, który umożliwia aplikacjom napisanym w językach takich jak Visual C# .NET programowe sterowanie innymi aplikacjami. Automatyzacja do programu Excel umożliwia wykonywanie akcji, takich jak tworzenie nowego skoroszytu, dodawanie danych do skoroszytu lub tworzenie wykresów. W przypadku programu Excel i innych aplikacji pakietu Microsoft Office praktycznie wszystkie akcje, które można wykonać ręcznie za pośrednictwem interfejsu użytkownika, mogą być również wykonywane programowo przy użyciu usługi Automation.

Program Excel uwidacznia tę funkcję programową za pomocą modelu obiektów. Model obiektów to kolekcja klas i metod, które służą jako odpowiedniki składników logicznych programu Excel. Na przykład istnieje obiekt aplikacji, obiekt skoroszytu i obiekt arkusza, z których każdy zawiera funkcje tych elementów programu Excel. Aby uzyskać dostęp do modelu obiektów z programu Visual C# .NET, można ustawić odwołanie do projektu do biblioteki typów.

W tym artykule pokazano, jak ustawić odpowiednie odwołanie do projektu w bibliotece typów programu Excel dla programu Visual C# .NET i udostępnia przykładowy kod do automatyzacji programu Excel.

Tworzenie klienta usługi Automation dla programu Microsoft Excel

  1. Uruchom program Microsoft Visual Studio .NET.

  2. W menu Plik kliknij pozycję Nowy, a następnie kliknij pozycję Projekt. Wybierz pozycję Aplikacja systemu Windows z typów projektów języka Visual C#. Formularz 1 jest tworzony domyślnie.

  3. Dodaj odwołanie do biblioteki obiektów programu Microsoft Excel. Aby to zrobić, wykonaj następujące kroki.

    1. W menu Projekt kliknij pozycję Dodaj odwołanie.
    2. Na karcie COM znajdź bibliotekę obiektów programu Microsoft Excel, a następnie kliknij pozycję Wybierz.

    Uwaga Pakiet Microsoft Office 2003 obejmuje podstawowe zestawy międzyoperacyjności (PIA). Pakiet Microsoft Office XP nie zawiera identyfikatorów PIA, ale można je pobrać.

    1. Kliknij przycisk OK w oknie dialogowym Dodawanie odwołań, aby zaakceptować wybrane opcje. Jeśli zostanie wyświetlony monit o wygenerowanie otok dla wybranych bibliotek, kliknij przycisk Tak.
  4. W menu Widok wybierz pozycję Przybornik, aby wyświetlić przybornik, a następnie dodaj przycisk do formularza Form1.

  5. Kliknij dwukrotnie przycisk Button1. Zostanie wyświetlone okno kodu formularza.

  6. W oknie kodu zastąp następujący kod:

    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    

    Z:

    private void button1_Click(object sender, System.EventArgs e)
    {
    Excel.Application oXL;
    Excel._Workbook oWB;
    Excel._Worksheet oSheet;
    Excel.Range oRng;
    
    try
    {
    //Start Excel and get Application object.
    oXL = new Excel.Application();
    oXL.Visible = true;
    
    //Get a new workbook.
    oWB = (Excel._Workbook)(oXL.Workbooks.Add( Missing.Value ));
    oSheet = (Excel._Worksheet)oWB.ActiveSheet;
    
    //Add table headers going cell by cell.
    oSheet.Cells[1, 1] = "First Name";
    oSheet.Cells[1, 2] = "Last Name";
    oSheet.Cells[1, 3] = "Full Name";
    oSheet.Cells[1, 4] = "Salary";
    
    //Format A1:D1 as bold, vertical alignment = center.
    oSheet.get_Range("A1", "D1").Font.Bold = true;
    oSheet.get_Range("A1", "D1").VerticalAlignment = 
    Excel.XlVAlign.xlVAlignCenter;
    
    // Create an array to multiple values at once.
    string[,] saNames = new string[5,2];
    
    saNames[ 0, 0] = "John";
    saNames[ 0, 1] = "Smith";
    saNames[ 1, 0] = "Tom";
    saNames[ 1, 1] = "Brown";
    saNames[ 2, 0] = "Sue";
    saNames[ 2, 1] = "Thomas";
    saNames[ 3, 0] = "Jane";
    saNames[ 3, 1] = "Jones";
    saNames[ 4, 0] = "Adam";
    saNames[ 4, 1] = "Johnson";
    
    //Fill A2:B6 with an array of values (First and Last Names).
         oSheet.get_Range("A2", "B6").Value2 = saNames;
    
    //Fill C2:C6 with a relative formula (=A2 & " " & B2).
    oRng = oSheet.get_Range("C2", "C6");
    oRng.Formula = "=A2 & \" \" & B2";
    
    //Fill D2:D6 with a formula(=RAND()*100000) and apply format.
    oRng = oSheet.get_Range("D2", "D6");
    oRng.Formula = "=RAND()*100000";
    oRng.NumberFormat = "$0.00";
    
    //AutoFit columns A:D.
    oRng = oSheet.get_Range("A1", "D1");
    oRng.EntireColumn.AutoFit();
    
    //Manipulate a variable number of columns for Quarterly Sales Data.
    DisplayQuarterlySales(oSheet);
    
    //Make sure Excel is visible and give the user control
    //of Microsoft Excel's lifetime.
    oXL.Visible = true;
    oXL.UserControl = true;
    }
    catch( Exception theException ) 
    {
    String errorMessage;
    errorMessage = "Error: ";
    errorMessage = String.Concat( errorMessage, theException.Message );
    errorMessage = String.Concat( errorMessage, " Line: " );
    errorMessage = String.Concat( errorMessage, theException.Source );
    
    MessageBox.Show( errorMessage, "Error" );
    }
    }
    
    private void DisplayQuarterlySales(Excel._Worksheet oWS)
    {
    Excel._Workbook oWB;
    Excel.Series oSeries;
    Excel.Range oResizeRange;
    Excel._Chart oChart;
    String sMsg;
    int iNumQtrs;
    
    //Determine how many quarters to display data for.
    for( iNumQtrs = 4; iNumQtrs >= 2; iNumQtrs--)
    {
    sMsg = "Enter sales data for ";
    sMsg = String.Concat( sMsg, iNumQtrs );
    sMsg = String.Concat( sMsg, " quarter(s)?");
    
    DialogResult iRet = MessageBox.Show( sMsg, "Quarterly Sales?", 
    MessageBoxButtons.YesNo );
    if (iRet == DialogResult.Yes)
    break;
    }
    
    sMsg = "Displaying data for ";
    sMsg = String.Concat( sMsg, iNumQtrs );
    sMsg = String.Concat( sMsg, " quarter(s)." );
    
    MessageBox.Show( sMsg, "Quarterly Sales" );
    
    //Starting at E1, fill headers for the number of columns selected.
    oResizeRange = oWS.get_Range("E1", "E1").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Formula = "=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\"";
    
    //Change the Orientation and WrapText properties for the headers.
    oResizeRange.Orientation = 38;
    oResizeRange.WrapText = true;
    
    //Fill the interior color of the headers.
    oResizeRange.Interior.ColorIndex = 36;
    
    //Fill the columns with a formula and apply a number format.
    oResizeRange = oWS.get_Range("E2", "E6").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Formula = "=RAND()*100";
    oResizeRange.NumberFormat = "$0.00";
    
    //Apply borders to the Sales data and headers.
    oResizeRange = oWS.get_Range("E1", "E6").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Borders.Weight = Excel.XlBorderWeight.xlThin;
    
    //Add a Totals formula for the sales data and apply a border.
    oResizeRange = oWS.get_Range("E8", "E8").get_Resize( Missing.Value, iNumQtrs);
    oResizeRange.Formula = "=SUM(E2:E6)";
    oResizeRange.Borders.get_Item( Excel.XlBordersIndex.xlEdgeBottom ).LineStyle 
    = Excel.XlLineStyle.xlDouble;
    oResizeRange.Borders.get_Item( Excel.XlBordersIndex.xlEdgeBottom ).Weight 
    = Excel.XlBorderWeight.xlThick;
    
    //Add a Chart for the selected data.
    oWB = (Excel._Workbook)oWS.Parent;
    oChart = (Excel._Chart)oWB.Charts.Add( Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value );
    
    //Use the ChartWizard to create a new chart from the selected data.
    oResizeRange = oWS.get_Range("E2:E6", Missing.Value ).get_Resize( 
    Missing.Value, iNumQtrs);
    oChart.ChartWizard( oResizeRange, Excel.XlChartType.xl3DColumn, Missing.Value,
    Excel.XlRowCol.xlColumns, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value );
    oSeries = (Excel.Series)oChart.SeriesCollection(1);
    oSeries.XValues = oWS.get_Range("A2", "A6");
    for( int iRet = 1; iRet <= iNumQtrs; iRet++)
    {
    oSeries = (Excel.Series)oChart.SeriesCollection(iRet);
    String seriesName;
    seriesName = "=\"Q";
    seriesName = String.Concat( seriesName, iRet );
    seriesName = String.Concat( seriesName, "\"" );
    oSeries.Name = seriesName;
    }  
    
    oChart.Location( Excel.XlChartLocation.xlLocationAsObject, oWS.Name );
    
    //Move the chart so as not to cover your data.
    oResizeRange = (Excel.Range)oWS.Rows.get_Item(10, Missing.Value );
    oWS.Shapes.Item("Chart 1").Top = (float)(double)oResizeRange.Top;
    oResizeRange = (Excel.Range)oWS.Columns.get_Item(2, Missing.Value );
    oWS.Shapes.Item("Chart 1").Left = (float)(double)oResizeRange.Left;
    }
    
    
  7. Przewiń w górę okna kodu. Dodaj następujący wiersz na końcu listy dyrektyw using:

    using Excel = Microsoft.Office.Interop.Excel;
    using System.Reflection; 
    

Testowanie klienta usługi Automation

  1. Naciśnij klawisz F5, aby skompilować i uruchomić program.
  2. Kliknij przycisk Button1 w formularzu. Program uruchamia program Excel i wypełnia dane w nowym arkuszu.
  3. Po wyświetleniu monitu o wprowadzenie kwartalnych danych sprzedaży kliknij przycisk Tak. Wykres połączony z danymi kwartalnym jest dodawany do arkusza.

Informacje

Aby uzyskać więcej informacji, zobacz witrynę sieci Web Microsoft Developer Network (MSDN).