Numéro d'article: 302084 - Dernière mise à jour: mercredi 17 janvier 2007 - Version: 7.2

Comment faire pour automatiser Microsoft Excel à partir de Microsoft Visual C# .NET

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Ancien nº de publication de cet article : F302084
Agrandir tout | Réduire tout

Résumé

Cet article explique comment créer un client Automation pour Microsoft Excel à l'aide de Visual C# .NET.

Plus d'informations

Automation est un processus qui permet à des applications écrites dans des langages tels que Visual C#.NET de contrôler d'autres applications par programme. Automation vers Excel permet d'exécuter des actions telles que la création d'un nouveau classeur, l'ajout des données au classeur ou la création de graphiques. Que ce soit avec Excel ou d'autres applications Microsoft Office, pratiquement toutes les actions pouvant être effectuées manuellement par le biais de l'interface utilisateur peuvent l'être également par programme à l'aide d'Automation.

Excel fournit cette fonctionnalité de programmation par le biais d'un modèle d'objet. Le modèle d'objet est une collection de classes et de méthodes qui correspondent aux composants logiques d'Excel. Par exemple, les objets Application, Workbook et Worksheet contiennent les fonctionnalités des composants correspondants dans Excel. Pour accéder au modèle d'objet à partir de Visual C# .NET, vous pouvez définir une référence de projet à la bibliothèque de types.

Cet article explique comment définir la référence de projet appropriée à la bibliothèque de types Excel pour Visual C# .NET et fournit un exemple de code pour automatiser Excel.

Création d'un client Automation pour Microsoft Excel

  1. Démarrez Microsoft Visual Studio .NET.
  2. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet. Sélectionnez Application Windows dans les types de projets Visual C#. Form1 est créé par défaut.
  3. Ajoutez une référence à la Bibliothèque d'objets Microsoft Excel. Pour cela, procédez comme suit :
    1. Dans le menu Projet, cliquez sur Ajouter une référence.
    2. Sous l'onglet COM, recherchez Bibliothèque d'objets Microsoft Excel et cliquez sur Sélectionner.

      Remarque Microsoft Office 2003 inclut des assemblys PIA (Primary Interop Assemblies). Microsoft Office XP n'inclut pas d'assemblys PIA, mais ils peuvent être téléchargés. Pour plus d'informations sur les assemblys PIA Office XP, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
      328912  (http://support.microsoft.com/kb/328912/ ) Assemblys PIA Microsoft Office XP disponibles pour téléchargement
    3. Cliquez sur OK dans la boîte de dialogue Ajouter une référence pour accepter vos sélections. Si vous êtes invité à générer des wrappers pour les bibliothèques que vous avez sélectionnées, cliquez sur Oui.
  4. Dans le menu Affichage, sélectionnez Boîte à outils pour afficher la boîte à outils et ajoutez un bouton à Form1.
  5. Double-cliquez sur Button1. La fenêtre de code du formulaire s'affiche.
  6. Dans la fenêtre de code, remplacez le code suivant
    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    					
    par :
    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. Allez en haut de la fenêtre de code. Ajoutez la ligne suivante à la fin de la liste des directives d'utilisation :
    using Excel = Microsoft.Office.Interop.Excel;
    using System.Reflection; 
    					

Test du client Automation

  1. Appuyez sur la touche F5 pour générer et exécuter le programme.
  2. Cliquez sur Button1 dans le formulaire. Le programme démarre Excel et met des données dans une nouvelle feuille de calcul.
  3. Lorsque vous êtes invité à entrer les données des ventes trimestrielles, cliquez sur Oui. Un graphique lié aux données trimestrielles est ajouté à la feuille de calcul.

Références

Pour plus d'informations, reportez-vous au site Web MSDN (Microsoft Developer Network) à l'adresse suivante (en anglais) :
Développement de Microsoft Office avec Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx (http://msdn.microsoft.com/library/en-us/dnoxpta/html/vsofficedev.asp)

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# .NET 2003 Initiation
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002
Mots-clés : 
kbpia kbautomation kbhowto KB302084
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.