Automatizace Microsoft Excelu z Microsoft Visual C#.NET

Souhrn

Tento článek ukazuje, jak vytvořit klienta automation pro Microsoft Excel pomocí microsoft Visual C# .NET.

Další informace

Automatizace je proces, který umožňuje aplikacím napsaným v jazycích, jako je Visual C# .NET, programově řídit jiné aplikace. Automatizace do Excelu umožňuje provádět akce, jako je vytvoření nového sešitu, přidání dat do sešitu nebo vytváření grafů. V Excelu a dalších aplikacích Microsoft Office je možné prostřednictvím automatizace provádět prakticky všechny akce, které můžete provádět ručně prostřednictvím uživatelského rozhraní.

Excel zpřístupňuje tuto programovou funkci prostřednictvím objektového modelu. Objektový model je kolekce tříd a metod, které slouží jako protějšky logických komponent aplikace Excel. Například existuje objekt Application, objekt Workbook a objekt Worksheet, z nichž každý obsahuje funkce těchto částí aplikace Excel. Pokud chcete získat přístup k objektového modelu z Visual C# .NET, můžete nastavit odkaz na projekt na knihovnu typů.

Tento článek ukazuje, jak nastavit správný odkaz na projekt na knihovnu typů excelu pro Visual C# .NET a poskytuje ukázkový kód pro automatizaci Excelu.

Vytvoření klienta automation pro Microsoft Excel

  1. Spusťte Microsoft Visual Studio .NET.

  2. V nabídce Soubor klikněte na Nový a potom klikněte na Project. V typech projektů Visual C# vyberte aplikaci pro Windows. Formulář1 je ve výchozím nastavení vytvořen.

  3. Přidejte odkaz na knihovnu objektů aplikace Microsoft Excel. Postupujte takto:

    1. V nabídce Projekt klikněte na Přidat odkaz.
    2. Na kartě COM vyhledejte Microsoft Excel Object Library a klepněte na tlačítko Vybrat.

    Poznámka Microsoft Office 2003 obsahuje primární sestavení vzájemné spolupráce (PIA). Sada Microsoft Office XP neobsahuje osobní údaje, ale je možné je stáhnout.

    1. Kliknutím na tlačítko OK v dialogovém okně Přidat odkazy potvrďte výběry. Pokud se zobrazí výzva k vygenerování obálek pro vybrané knihovny, klikněte na tlačítko Ano.
  4. V nabídce Zobrazení vyberte sadu nástrojů, aby se zobrazila sada nástrojů, a pak přidejte tlačítko do formuláře Form1.

  5. Poklikáte na Tlačítko1. Zobrazí se okno kódu formuláře.

  6. V okně kódu nahraďte následující kód:

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

    S:

    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. Posuňte se do horní části okna kódu. Na konec seznamu direktiv using přidejte následující řádek:

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

Testování klienta služby Automation

  1. Stisknutím klávesy F5 sestavte a spusťte program.
  2. Ve formuláři klikněte na Tlačítko1. Aplikace spustí aplikaci Excel a naplní data na novém listu.
  3. Po zobrazení výzvy k zadání čtvrtletních údajů o prodeji klikněte na tlačítko Ano. Do listu se přidá graf propojený se čtvrtletními daty.

Odkazy

Další informace naleznete na webu Microsoft Developer Network (MSDN).