Automatisieren von Microsoft Excel aus Microsoft Visual C#.NET

Zusammenfassung

In diesem Artikel wird das Erstellen eines Automatisierungsclients für Microsoft Excel mithilfe von Microsoft Visual C# .NET veranschaulicht.

Weitere Informationen

Automatisierung ist ein Prozess, der es Anwendungen, die in Sprachen wie Visual C# .NET geschrieben sind, ermöglicht, andere Anwendungen programmgesteuert zu steuern. Mit der Automatisierung in Excel können Sie Aktionen wie das Erstellen einer neuen Arbeitsmappe, das Hinzufügen von Daten zur Arbeitsmappe oder das Erstellen von Diagrammen ausführen. Mit Excel und anderen Microsoft Office-Anwendungen können nahezu alle Aktionen, die Sie manuell über die Benutzeroberfläche ausführen können, auch programmgesteuert mithilfe der Automatisierung ausgeführt werden.

Excel macht diese programmgesteuerte Funktionalität über ein Objektmodell verfügbar. Das Objektmodell ist eine Auflistung von Klassen und Methoden, die als Gegenstück zu den logischen Komponenten von Excel dienen. Es gibt z. B. ein Application-Objekt, ein Workbook-Objekt und ein Worksheet-Objekt, von denen jedes die Funktionalität dieser Excel-Teile enthält. Um über Visual C# .NET auf das Objektmodell zuzugreifen, können Sie einen Projektverweise auf die Typbibliothek festlegen.

In diesem Artikel wird das Festlegen des richtigen Projektverweises auf die Excel-Typbibliothek für Visual C# .NET veranschaulicht und Beispielcode zum Automatisieren von Excel bereitgestellt.

Erstellen eines Automatisierungsclients für Microsoft Excel

  1. Starten Sie Microsoft Visual Studio .NET.

  2. Klicken Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt. Wählen Sie "Windows-Anwendung" aus den Visual C#-Projekttypen aus. Form1 wird standardmäßig erstellt.

  3. Fügen Sie einen Verweis auf die Microsoft Excel-Objektbibliothek hinzu. Gehen Sie dazu wie folgt vor:

    1. On the Project menu, click Add Reference.
    2. Suchen Sie auf der Registerkarte COM nach der Microsoft Excel-Objektbibliothek, und klicken Sie auf "Auswählen".

    Hinweis Microsoft Office 2003 enthält primäre Interopassemblys (PRIMARY Interop Assemblies, PIAs). Microsoft Office XP enthält keine PIAs, sie können jedoch heruntergeladen werden.

    1. Klicken Sie im Dialogfeld "Verweise hinzufügen" auf "OK", um Ihre Auswahl zu übernehmen. Wenn Sie aufgefordert werden, Wrapper für die ausgewählten Bibliotheken zu generieren, klicken Sie auf "Ja".
  4. Wählen Sie im Menü "Ansicht" die Toolbox aus, um die Toolbox anzuzeigen, und fügen Sie formular1 eine Schaltfläche hinzu.

  5. Doppelklicken Sie auf Schaltfläche1. Das Codefenster für das Formular wird angezeigt.

  6. Ersetzen Sie im Codefenster den folgenden Code:

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

    mit:

    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. Scrollen Sie zum oberen Rand des Codefensters. Fügen Sie die folgende Zeile am Ende der Liste der verwendenden Direktiven hinzu:

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

Testen des Automatisierungsclients

  1. Drücken Sie F5, um das Programm zu erstellen und auszuführen.
  2. Klicken Sie im Formular auf "Schaltfläche1". Das Programm startet Excel und füllt Daten auf einem neuen Arbeitsblatt auf.
  3. Wenn Sie aufgefordert werden, vierteljährliche Umsatzdaten einzugeben, klicken Sie auf "Ja". Ein Diagramm, das mit vierteljährlichen Daten verknüpft ist, wird dem Arbeitsblatt hinzugefügt.

References

Weitere Informationen finden Sie auf der MSDN-Website (Microsoft Developer Network).