Slik automatiserer du Microsoft Excel fra Microsoft Visual C#.NET

Sammendrag

Denne artikkelen viser hvordan du oppretter en automatiseringsklient for Microsoft Excel ved hjelp av Microsoft Visual C# .NET.

Mer informasjon

Automatisering er en prosess som gjør det mulig for programmer som er skrevet på språk som Visual C# .NET å programmatisk kontrollere andre programmer. Automatisering til Excel gjør det mulig å utføre handlinger som å opprette en ny arbeidsbok, legge til data i arbeidsboken eller opprette diagrammer. Med Excel og andre Microsoft Office-programmer kan nesten alle handlingene du kan utføre manuelt gjennom brukergrensesnittet, også utføres programmatisk ved hjelp av automatisering.

Excel viser denne programmatiske funksjonaliteten gjennom en objektmodell. Objektmodellen er en samling klasser og metoder som fungerer som motstykker til de logiske komponentene i Excel. Det finnes for eksempel et programobjekt, et arbeidsbokobjekt og et regnearkobjekt, som hver inneholder funksjonaliteten til disse delene av Excel. Hvis du vil ha tilgang til objektmodellen fra Visual C# .NET, kan du angi en prosjektreferanse til typebiblioteket.

Denne artikkelen viser hvordan du angir riktig prosjektreferanse til Excel-typebiblioteket for Visual C# .NET og gir eksempelkode for å automatisere Excel.

Opprette en automatiseringsklient for Microsoft Excel

  1. Start Microsoft Visual Studio .NET.

  2. Klikk Ny på Fil-menyen, og klikk deretter Prosjekt. Velg Windows-program fra visualobjekt C#-prosjekttypene. Skjema1 er opprettet som standard.

  3. Legg til en referanse i objektbiblioteket i Microsoft Excel. Dette gjør du slik:

    1. Klikk Legg til referanse på Prosjekt-menyen.
    2. Finn objektbiblioteket i Microsoft Excel på COM-fanen, og klikk Velg.

    Merk Microsoft Office 2003 inkluderer primære interop-samlinger (PIAer). Microsoft Office XP inkluderer ikke PIAer, men de kan lastes ned.

    1. Klikk OK i dialogboksen Legg til referanser for å godta valgene. Hvis du blir bedt om å generere wrappers for bibliotekene du valgte, klikker du Ja.
  4. Velg Verktøykasse på Vis-menyen for å vise verktøykassen, og legg deretter til en knapp i Skjema1.

  5. Dobbeltklikk Knapp1. Kodevinduet for skjemaet vises.

  6. Erstatt følgende kode i kodevinduet:

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

    Med:

    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. Rull til toppen av kodevinduet. Legg til følgende linje på slutten av listen over bruk av direktiver:

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

Test automatiseringsklienten

  1. Trykk F5 for å bygge og kjøre programmet.
  2. Klikk Knapp1 i skjemaet. Programmet starter Excel og fyller ut data i et nytt regneark.
  3. Når du blir bedt om å angi kvartalsvise salgsdata, klikker du Ja. Et diagram som er koblet til kvartalsvise data, legges til i regnearket.

Referanser

Hvis du vil ha mer informasjon, kan du se webområdet for Microsoft Developer Network (MSDN).