Automatisieren von Microsoft Excel mit Microsoft Visual C#.NET

Zusammenfassung

Dieser Artikel beschreibt, wie Sie mithilfe von Microsoft Visual C# .NET einen Automatisierungsclient für Microsoft Excel erstellen.

Weitere Informationen

Automatisierung ist ein Prozess, der es Anwendungen, die in Sprachen wie Visual C# .NET geschrieben sind, ermöglicht, andere Anwendungen durch ein Programm zu steuern. Wenn Sie Excel automatisieren, können Sie neue Arbeitsmappen erstellen, der Arbeitsmappe Daten hinzufügen, Diagramme erstellen oder andere Aktionen schnell und komfortabel durchführen. In Excel und anderen Microsoft Office-Anwendungen kann mithilfe der Automatisierung nahezu jeder Vorgang, der manuell über die Benutzeroberfläche möglich ist, auch mithilfe eines Programms umgesetzt werden.

Diese programmgesteuerte Funktion führt Excel über ein Objektmodell aus. Das Objektmodell stellt eine Sammlung von Klassen und Methoden dar, die als Gegenstücke zu den logischen Excel-Komponenten dienen. Es gibt z. B. ein Objekt Application, ein Objekt Workbook und ein Objekt Worksheet. Jedes dieser Objekte beinhaltet die jeweilige Funktionalität der entsprechenden Excel-Komponenten. Damit Sie Zugriff auf das Objektmodell von Visual C# .NET erhalten, können Sie eine Projektreferenz zur Typbibliothek einrichten.

Dieser Artikel beschreibt, wie Sie eine entsprechende Projektreferenz zur Excel-Typbibliothek für Visual C# .NET einrichten, und enthält einen Beispielcode, wie Sie in Excel Vorgänge automatisieren können.

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 anschließend auf Projekt. Wählen Sie aus den Projekttypen von Visual C# die Option Windows-Anwendung aus. Form1 wird standardmäßig erstellt.
  3. Fügen Sie einen Verweis auf die Microsoft Excel-Objektbibliothek hinzu. Gehen Sie hierzu folgendermaßen vor:
    1. Klicken Sie im Menü Projekt auf Verweis hinzufügen.
    2. Suchen Sie auf der Registerkarte COM den Eintrag Microsoft Excel Object Library, und klicken Sie auf Auswählen.

      Hinweis Microsoft Office 2003 beinhaltet Primary Interop-Assemblys (PIAs). Microsoft Office XP beinhaltet keine PIAs, sie können jedoch heruntergeladen werden.
      Weitere Informationen zu Office XP-PIAs finden Sie im folgenden Artikel der Microsoft Knowledge Base:

      328912 Primäre Interop-Assemblys (PIAs) für Microsoft Office XP stehen zum Download zur Verfügung

    3. Klicken Sie im Dialogfeld Verweise hinzufügen auf OK, um Ihre Auswahl zu übernehmen. Klicken Sie auf Ja, wenn Sie gefragt werden, ob für die von Ihnen gewählten Bibliotheken Wrapper erstellt werden sollen.
  4. Wählen Sie im Menü Ansicht die Option Toolbox, um die Toolbox anzuzeigen, und fügen Sie anschließend zu Form1 eine Schaltfläche hinzu.
  5. Doppelklicken Sie auf Button1 (Schaltfläche 1). Das Codefenster für das Formular erscheint.
  6. Ersetzen Sie im Codefenster den folgenden Code
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    durch:
    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. Gehen Sie im Codefenster per Bildlauf ganz nach oben. Fügen Sie am Ende der Liste der using-Direktiven die folgende Zeile hinzu:
    using Excel = Microsoft.Office.Interop.Excel;
    using System.Reflection;

Testen des Automatisierungsclients

  1. Drücken Sie die Taste [F5], um das Programm zu erstellen und auszuführen.
  2. Klicken Sie im Formular auf Button1. Das Programm startet Excel und füllt ein neues Arbeitsblatt mit Daten.
  3. Klicken Sie auf Ja, wenn Sie dazu aufgefordert werden, Quartalsverkaufszahlen einzugeben. Zum Arbeitsblatt wird ein Diagramm hinzugefügt, das mit den Quartalszahlen verknüpft ist.

Informationsquellen

Weitere Informationen finden Sie auf folgender Website des Microsoft Developer Network (MSDN):
Microsoft Office Development with Visual Studio (in Englisch)
http://msdn2.microsoft.com/de-de/library/aa188489.aspx
Eigenschaften

Artikelnummer: 302084 – Letzte Überarbeitung: 27.01.2014 – Revision: 1

Feedback