Comment transférer des données vers un classeur Excel à l’aide de Visual C# 2005 ou Visual C# .NET

Pour obtenir une version Microsoft Visual Basic 6.0 de cet article, consultez 247412.

Cet article pas à pas décrit plusieurs méthodes de transfert de données vers Microsoft Excel 2002 à partir d’un programme Microsoft Visual C# 2005 ou Microsoft Visual C# .NET. Cet article présente également les avantages et les inconvénients de chaque méthode afin que vous puissiez sélectionner la solution qui convient le mieux à votre situation.

Vue d’ensemble

La technique la plus fréquemment utilisée pour transférer des données vers un classeur Excel est Automation. Avec Automation, vous pouvez appeler des méthodes et des propriétés spécifiques aux tâches Excel. Automation vous offre la plus grande flexibilité pour spécifier l’emplacement de vos données dans le classeur, mettre en forme le classeur et définir différents paramètres au moment de l’exécution.

Avec Automation, vous pouvez utiliser plusieurs techniques pour transférer vos données :

  • Transférer des données cellule par cellule.
  • Transférer des données d’un tableau vers une plage de cellules.
  • Transférez des données dans un jeu d’enregistrements ADO vers une plage de cellules à l’aide de la méthode CopyFromRecordset.
  • Créez un objet QueryTable dans une feuille de calcul Excel qui contient le résultat d’une requête sur une source de données ODBC ou OLEDB.
  • Transférez des données dans le Presse-papiers, puis collez le contenu du Presse-papiers dans une feuille de calcul Excel.
    Vous pouvez également utiliser plusieurs méthodes qui ne nécessitent pas nécessairement Automation pour transférer des données vers Excel. Si vous exécutez un programme côté serveur, il peut s’agir d’une bonne approche pour retirer la majeure partie du traitement des données à vos clients.

Pour transférer vos données sans Automation, vous pouvez utiliser les approches suivantes :

  • Transférez vos données vers un fichier texte délimité par des onglets ou délimité par des virgules qu’Excel peut analyser ultérieurement dans des cellules d’une feuille de calcul.
  • Transférez vos données vers une feuille de calcul à l’aide de ADO.NET.
  • Transférer des données XML vers Excel (version 2002 et 2003) pour fournir des données mises en forme et organisées en lignes et en colonnes.

Cet article fournit une discussion et un exemple de code pour chacune de ces techniques. La section « Créer l’exemple complet de projet Visual C# 2005 ou Visual C# .NET », plus loin dans cet article, montre comment créer un programme .NET Visual C# qui exécute chaque technique.

Techniques

Utiliser Automation pour transférer des données cellule par cellule

Avec Automation, vous pouvez transférer des données vers une feuille de calcul une cellule à la fois :

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));

// Add data to cells in the first worksheet in the new workbook.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objRange.Value = "Last Name";
m_objRange = m_objSheet.get_Range("B1", m_objOpt);
m_objRange.Value = "First Name";
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange.Value = "Doe";
m_objRange = m_objSheet.get_Range("B2", m_objOpt);
m_objRange.Value = "John";

// Apply bold to cells A1:B1.
m_objRange = m_objSheet.get_Range("A1", "B1");
m_objFont = m_objRange.Font;
m_objFont.Bold=true;

// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Le transfert de données cellule par cellule est une approche acceptable si vous avez une petite quantité de données. Vous avez la possibilité de placer des données n’importe où dans le classeur et vous pouvez mettre en forme les cellules de manière conditionnelle au moment de l’exécution. Toutefois, il n’est pas judicieux d’utiliser cette approche si vous avez une grande quantité de données à transférer vers un classeur Excel. Chaque objet Range que vous acquérez au moment de l’exécution génère une demande d’interface qui signifie que les transferts de données sont plus lents. En outre, Microsoft Windows 95, Microsoft Windows 98 et Microsoft Windows Millennium Edition (Me) ont une limitation de 64 kilo-octets (Ko) sur les demandes d’interface. Si vous avez plus de 64 Ko de demandes d’interface, le serveur Automation (Excel) peut cesser de répondre ou vous pouvez recevoir des messages d’erreur indiquant une mémoire insuffisante.

Là encore, le transfert de données cellule par cellule n’est acceptable que pour de petites quantités de données. Si vous devez transférer des jeux de données volumineux vers Excel, envisagez d’utiliser l’une des autres approches décrites dans cet article pour transférer des données en bloc.

Pour plus d’informations et pour obtenir un exemple d’automatisation d’Excel avec Visual C# .NET, cliquez sur le numéro d’article ci-dessous pour afficher l’article dans la Base de connaissances Microsoft :

302084 HOWTO : Automatiser Microsoft Excel à partir de Microsoft Visual C# .NET

Utiliser Automation pour transférer un tableau de données vers une plage dans une feuille de calcul

Vous pouvez transférer un tableau de données vers une plage de plusieurs cellules en même temps :

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));

// Create an array for the headers and add it to cells A1:C1.
object[] objHeaders = {"Order ID", "Amount", "Tax"};
m_objRange = m_objSheet.get_Range("A1", "C1");
m_objRange.Value = objHeaders;
m_objFont = m_objRange.Font;
m_objFont.Bold=true;

// Create an array with 3 columns and 100 rows and add it to
// the worksheet starting at cell A2.
object[,] objData = new Object[100,3];
Random rdm = new Random((int)DateTime.Now.Ticks);
double nOrderAmt, nTax;
for(int r=0;r<100;r++)
{
objData[r,0] = "ORD" + r.ToString("0000");
nOrderAmt = rdm.Next(1000);
objData[r,1] = nOrderAmt.ToString("c");
nTax = nOrderAmt*0.07;
objData[r,2] = nTax.ToString("c");
}
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange = m_objRange.get_Resize(100,3);
m_objRange.Value = objData;

// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Si vous transférez vos données à l’aide d’un tableau au lieu d’une cellule par cellule, vous pouvez réaliser un gain de performances énorme avec une grande quantité de données. Tenez compte des lignes suivantes du code susmentionné qui transfèrent des données vers 300 cellules dans la feuille de calcul :

objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;

Ce code représente deux demandes d’interface : une pour l’objet Range retourné par la méthode Range et une autre pour l’objet Range retourné par la méthode Resize. En revanche, le transfert de la cellule de données par cellule nécessite des demandes de 300 interfaces vers des objets Range. Dans la mesure du possible, vous pouvez tirer parti du transfert de vos données en bloc et de la réduction du nombre de demandes d’interface que vous effectuez.

Pour plus d’informations sur l’utilisation de tableaux pour obtenir et définir des valeurs dans des plages avec Excel Automation, cliquez sur le numéro d’article ci-dessous pour afficher l’article dans la Base de connaissances Microsoft :

302096 HOWTO : Automatiser Excel avec Visual C# .NET pour remplir ou obtenir des données dans une plage à l’aide de tableaux

Utiliser Automation pour transférer un jeu d’enregistrements ADO vers une plage de feuilles de calcul

Les modèles objet pour Excel 2000, Excel 2002 et Excel 2003 fournissent la méthode CopyFromRecordset pour transférer un jeu d’enregistrements ADO vers une plage d’une feuille de calcul. Le code suivant montre comment automatiser Excel pour transférer le contenu de la table Orders dans l’exemple de base de données Northwind à l’aide de la méthode CopyFromRecordset :

// Create a Recordset from all the records in the Orders table.
ADODB.Connection objConn = new ADODB.Connection();
ADODB._Recordset objRS = null;
objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
m_strNorthwind + ";", "", "", 0);
objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
object objRecAff;
objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, 
(int)ADODB.CommandTypeEnum.adCmdTable);

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));

// Get the Fields collection from the recordset and determine
// the number of fields (or columns).
System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
int nFields = objRS.Fields.Count;

// Create an array for the headers and add it to the
// worksheet starting at cell A1.
object[] objHeaders = new object[nFields];
ADODB.Field objField = null;
for(int n=0;n<nFields;n++)
{
objFields.MoveNext();
objField = (ADODB.Field)objFields.Current;
objHeaders[n] = objField.Name;
}
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objRange = m_objRange.get_Resize(1, nFields);
m_objRange.Value = objHeaders;
m_objFont = m_objRange.Font;
m_objFont.Bold=true;

// Transfer the recordset to the worksheet starting at cell A2.
m_objRange = m_objSheet.get_Range("A2", m_objOpt);
m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);

// Save the Workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

// Close the recordset and connection.
objRS.Close();
objConn.Close();

Remarque

CopyFromRecordset fonctionne uniquement avec les objets recordset ADO. Vous ne pouvez pas utiliser le DataSet que vous créez à l’aide de ADO.NET avec la méthode CopyFromRecordset. Plusieurs exemples dans les sections qui suivent montrent comment transférer des données vers Excel avec ADO.NET.

Utiliser Automation pour créer un objet QueryTable dans une feuille de calcul

Un objet QueryTable représente une table générée à partir de données retournées à partir d’une source de données externe. Lorsque vous automatisez Excel, vous pouvez créer un QueryTable en fournissant une chaîne de connexion à une source de données OLE DB ou ODBC et une chaîne SQL. Excel génère le jeu d’enregistrements et insère le jeu d’enregistrements dans la feuille de calcul à l’emplacement que vous spécifiez. Les objets QueryTable offrent les avantages suivants par rapport à la méthode CopyFromRecordset :

  • Excel gère la création du jeu d’enregistrements et son placement dans la feuille de calcul.
  • Vous pouvez enregistrer la requête avec l’objet QueryTable et l’actualiser ultérieurement pour obtenir un jeu d’enregistrements mis à jour.
  • Lorsqu’un nouveau QueryTable est ajouté à votre feuille de calcul, vous pouvez spécifier que les données qui existent déjà dans les cellules de la feuille de calcul doivent être déplacées pour gérer les nouvelles données (pour plus d’informations, consultez la propriété RefreshStyle).

Le code suivant montre comment automatiser Excel 2000, Excel 2002 ou Excel 2003 pour créer un QueryTable dans une feuille de calcul Excel à l’aide des données de l’exemple de base de données Northwind :

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));

// Create a QueryTable that starts at cell A1.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objQryTables = m_objSheet.QueryTables;
m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
m_strNorthwind + ";", m_objRange, "Select * From Orders");
m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
m_objQryTable.Refresh(false);

// Save the workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Utiliser le Presse-papiers Windows

Vous pouvez utiliser le Presse-papiers Windows pour transférer des données vers une feuille de calcul. Pour coller des données dans plusieurs cellules d’une feuille de calcul, vous pouvez copier une chaîne dans laquelle les colonnes sont délimitées par des caractères TAB, et les lignes sont délimitées par des retours chariot. Le code suivant illustre comment Visual C# .NET peut utiliser le Presse-papiers Windows pour transférer des données vers Excel :

// Copy a string to the Windows clipboard.
string sData = "FirstName\tLastName\tBirthdate\r\n"  +
"Bill\tBrown\t2/5/85\r\n"  +
"Joe\tThomas\t1/1/91";
System.Windows.Forms.Clipboard.SetDataObject(sData);

// Start a new workbook in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));

// Paste the data starting at cell A1.
m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
m_objRange = m_objSheet.get_Range("A1", m_objOpt);
m_objSheet.Paste(m_objRange, false);

// Save the workbook and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Créer un fichier texte délimité qu’Excel peut analyser en lignes et en colonnes

Excel peut ouvrir des fichiers délimités par des tabulations ou des virgules et analyser correctement les données dans des cellules. Vous pouvez utiliser cette fonctionnalité lorsque vous souhaitez transférer une grande quantité de données vers une feuille de calcul tout en utilisant peu, le cas échéant, Automation. Il peut s’agir d’une bonne approche pour un programme client-serveur, car le fichier texte peut être généré côté serveur. Vous pouvez ensuite ouvrir le fichier texte sur le client, à l’aide d’Automation, le cas échéant.

Le code suivant montre comment générer un fichier texte délimité par des tabulations à partir de données lues avec ADO.NET :

// Connect to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( 
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
objConn.Open();

// Execute a command to retrieve all records from the Employees table.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( 
"Select * From Employees", objConn);
System.Data.OleDb.OleDbDataReader objReader;
objReader = objCmd.ExecuteReader();

// Create the FileStream and StreamWriter object to write 
// the recordset contents to file.
System.IO.FileStream fs = new System.IO.FileStream(
m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
System.IO.StreamWriter sw = new System.IO.StreamWriter(
fs, System.Text.Encoding.Unicode);

// Write the field names (headers) as the first line in the text file.
sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
"\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
"\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));

// Write the first six columns in the recordset to a text file as
// tab-delimited.
while(objReader.Read()) 
{
for(int i=0;i<=5;i++)
{
if(!objReader.IsDBNull(i))
{
string s;
s = objReader.GetDataTypeName(i);
if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
{
sw.Write(objReader.GetInt32(i).ToString());
}
else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
{
sw.Write(objReader.GetDateTime(i).ToString("d"));
}
else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
{
sw.Write(objReader.GetString(i));
}
}
if(i<5) sw.Write("\t");
}
sw.WriteLine(); 
}
sw.Flush();// Write the buffered data to the filestream.

// Close the FileStream.
fs.Close();

// Close the reader and the connection.
objReader.Close();
objConn.Close(); 

Le code mentionné ci-dessus n’utilise aucune automatisation. Toutefois, si vous le souhaitez, vous pouvez utiliser Automation pour ouvrir le fichier texte et enregistrer le fichier au format de classeur Excel, comme suit :

// Open the text file in Excel.
m_objExcel = new Excel.Application();
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, 
Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
false, true, false, false, false, false, m_objOpt, m_objOpt, 
m_objOpt, m_objOpt, m_objOpt);

m_objBook = m_objExcel.ActiveWorkbook;

// Save the text file in the typical workbook format and quit Excel.
m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, 
m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt);
m_objBook.Close(false, m_objOpt, m_objOpt);
m_objExcel.Quit();

Transférer des données vers une feuille de calcul à l’aide de ADO.NET

Vous pouvez utiliser le fournisseur Microsoft Jet OLE DB pour ajouter des enregistrements à une table dans un classeur Excel existant. Un tableau dans Excel n’est qu’une plage de cellules ; la plage peut avoir un nom défini. En règle générale, la première ligne de la plage contient les en-têtes (ou les noms de champs) et toutes les lignes ultérieures de la plage contiennent les enregistrements.

Le code suivant ajoute deux nouveaux enregistrements à une table dans Book7.xls. Le tableau dans ce cas est Sheet1 :

// Establish a connection to the data source.
System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
"Book7.xls;Extended Properties=Excel 8.0;");
objConn.Open();

// Add two records to the table named 'MyTable'.
System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
objCmd.Connection = objConn;
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
" values ('Bill', 'Brown')";
objCmd.ExecuteNonQuery();
objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
" values ('Joe', 'Thomas')";
objCmd.ExecuteNonQuery();

// Close the connection.
objConn.Close();

Lorsque vous ajoutez des enregistrements avec ADO.NET comme indiqué dans cet exemple, la mise en forme dans le classeur est conservée. Chaque enregistrement ajouté à une ligne emprunte le format de la ligne avant celle-ci.

Pour plus d’informations sur l’utilisation de ADO.NET, cliquez sur les numéros d’article ci-dessous pour afficher les articles de la Base de connaissances Microsoft :

306636 COMMENT : se connecter à une base de données et exécuter une commande à l’aide d’ADO.NET et de Visual C# .NET

314145 COMMENT : remplir un objet DataSet à partir d’une base de données à l’aide de Visual C# .NET

307587 COMMENT : mettre à jour une base de données à partir d’un objet DataSet à l’aide de Visual C# .NET

Pour plus d’informations sur l’utilisation du fournisseur Jet OLEDB avec des sources de données Excel, cliquez sur les numéros d’article ci-dessous pour afficher les articles de la Base de connaissances Microsoft :

278973 SAMPLE : ExcelADO montre comment utiliser ADO pour lire et écrire des données dans des classeurs Excel

257819 HOWTO : Utiliser ADO avec des données Excel à partir de Visual Basic ou VBA

Transférer des données XML (Excel 2002 et Excel 2003)

Excel 2002 et 2003 peuvent ouvrir n’importe quel fichier XML bien formé. Vous pouvez ouvrir des fichiers XML directement à l’aide de la commande Ouvrir dans le menu Fichier, ou par programmation à l’aide des méthodes Open ou OpenXML de la collection workbooks. Si vous créez des fichiers XML à utiliser dans Excel, vous pouvez également créer des feuilles de style pour mettre en forme les données.

Créer l’exemple complet de projet Visual C# .NET

  1. Créez un dossier nommé C:\ExcelData. L’exemple de programme stocke les classeurs Excel dans ce dossier.

  2. Créez un classeur dans lequel l’exemple doit écrire :

    1. Démarrez un nouveau classeur dans Excel.
    2. Dans la feuille Sheet1 du nouveau classeur, tapez FirstName dans la cellule A1 et LastName dans la cellule B1.
    3. Sélectionnez A1:B1.
    4. Dans le menu Insertion, pointez sur Nom, puis cliquez sur Définir. Tapez le nom MyTable, puis cliquez sur OK.
    5. Enregistrez le classeur en tant que C:\Exceldata\Book7.xls.
    6. Quittez Excel.
  3. Démarrez Microsoft Visual Studio 2005 ou Microsoft Visual Studio .NET. On the File menu, point to New, and then click Project. Sous Projets Visual C# ou Visual C#, sélectionnez Application Windows. Par défaut, Form1 est créé.

  4. Ajoutez une référence à la bibliothèque d’objets Excel et à l’assembly d’interopérabilité principale ADODB. Pour cela, procédez comme suit :

    1. Dans le menu Projet, cliquez sur Ajouter une référence.
    2. Sous l’onglet NET, recherchez ADODB, puis cliquez sur Sélectionner.

    Remarque Dans Visual Studio 2005, vous n’avez pas besoin de cliquer sur Sélectionner.
    3. Sous l’onglet COM, recherchez la bibliothèque d’objets Microsoft Excel 10.0 ou la bibliothèque d’objets Microsoft Excel 11.0, puis cliquez sur Sélectionner.

    Remarque Dans Visual Studio 2005, vous n’avez pas besoin de cliquer sur Sélectionner.

    Remarque Si vous utilisez Microsoft Excel 2002 et que vous ne l’avez pas déjà fait, Microsoft vous recommande de télécharger et d’installer ensuite les assemblys d’interopérabilité principale (PIA) Microsoft Office XP.

  5. Dans la boîte de dialogue Ajouter des références, cliquez sur OK pour accepter vos sélections.

  6. Ajoutez un contrôle Zone de liste modifiable et un contrôle Button à Form1.

  7. Ajoutez des gestionnaires d’événements pour l’événement De chargement de formulaire et les événements Click du contrôle Button :

    1. En mode Création pour Form1.cs, double-cliquez sur Form1.

    Le gestionnaire de l’événement de chargement du formulaire est créé et apparaît dans Form1.cs.
    2. Dans le menu Affichage, cliquez sur Concepteur pour basculer vers le mode Création.
    3. Double-cliquez sur Button1.

    Le gestionnaire de l’événement Click du bouton est créé et apparaît dans Form1.cs.

  8. Dans Form1.cs, remplacez le code suivant :

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

    avec :

            // Excel object references.
            private Excel.Application m_objExcel =  null;
            private Excel.Workbooks m_objBooks = null;
            private Excel._Workbook m_objBook = null;
            private Excel.Sheets m_objSheets = null;
            private Excel._Worksheet m_objSheet = null;
            private Excel.Range m_objRange =  null;
            private Excel.Font m_objFont = null;
            private Excel.QueryTables m_objQryTables = null;
            private Excel._QueryTable m_objQryTable = null;
    
    // Frequenty-used variable for optional arguments.
            private object m_objOpt = System.Reflection.Missing.Value;
    
    // Paths used by the sample code for accessing and storing data.
            private object m_strSampleFolder = "C:\\ExcelData\\";
            private string m_strNorthwind = "C:\\Program Files\\Microsoft Office\\Office10\\Samples\\Northwind.mdb";
    
    private void Form1_Load(object sender, System.EventArgs e)
            {
                comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
    
    comboBox1.Items.AddRange(new object[]{
                                                         "Use Automation to Transfer Data Cell by Cell ", 
                                                         "Use Automation to Transfer an Array of Data to a Range on a Worksheet ", 
                                                         "Use Automation to Transfer an ADO Recordset to a Worksheet Range ", 
                                                         "Use Automation to Create a QueryTable on a Worksheet", 
                                                         "Use the Clipboard", 
                                                         "Create a Delimited Text File that Excel Can Parse into Rows and Columns", 
                                                         "Transfer Data to a Worksheet Using ADO.NET "});
                comboBox1.SelectedIndex = 0;
                button1.Text = "Go!";
            }
    
    private void button1_Click(object sender, System.EventArgs e)
            {
                switch (comboBox1.SelectedIndex)
                {
                    case 0 : Automation_CellByCell(); break;
                    case 1 : Automation_UseArray(); break;
                    case 2 : Automation_ADORecordset(); break;
                    case 3 : Automation_QueryTable(); break;
                    case 4 : Use_Clipboard(); break;
                    case 5 : Create_TextFile(); break;
                    case 6 : Use_ADONET(); break;
                }
    
    //Clean-up
                m_objFont = null;
                m_objRange = null;
                m_objSheet = null;
                m_objSheets = null;
                m_objBooks = null;
                m_objBook = null;
                m_objExcel = null;
                GC.Collect();
    
    }
    
    private void Automation_CellByCell()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
    // Add data to cells of the first worksheet in the new workbook.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objRange.set_Value(m_objOpt,"Last Name");
                m_objRange = m_objSheet.get_Range("B1", m_objOpt);
                m_objRange.set_Value(m_objOpt,"First Name");
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange.set_Value(m_objOpt,"Doe");
                m_objRange = m_objSheet.get_Range("B2", m_objOpt);
                m_objRange.set_Value(m_objOpt,"John");
    
    // Apply bold to cells A1:B1.
                m_objRange = m_objSheet.get_Range("A1", "B1");
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book1.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Automation_UseArray()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
    
    // Create an array for the headers and add it to cells A1:C1.
                object[] objHeaders = {"Order ID", "Amount", "Tax"};
                m_objRange = m_objSheet.get_Range("A1", "C1");
                m_objRange.set_Value(m_objOpt,objHeaders);
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
    // Create an array with 3 columns and 100 rows and add it to
                // the worksheet starting at cell A2.
                object[,] objData = new Object[100,3];
                Random rdm = new Random((int)DateTime.Now.Ticks);
                double nOrderAmt, nTax;
                for(int r=0;r<100;r++)
                {
                    objData[r,0] = "ORD" + r.ToString("0000");
                    nOrderAmt = rdm.Next(1000);
                    objData[r,1] = nOrderAmt.ToString("c");
                    nTax = nOrderAmt*0.07;
                    objData[r,2] = nTax.ToString("c");
                }
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange = m_objRange.get_Resize(100,3);
                m_objRange.set_Value(m_objOpt,"objData");
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book2.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Automation_ADORecordset()
            {
                // Create a Recordset from all the records in the Orders table.
                ADODB.Connection objConn = new ADODB.Connection();
                ADODB._Recordset objRS = null;
                objConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    m_strNorthwind + ";", "", "", 0);
                objConn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
                object objRecAff;
                objRS = (ADODB._Recordset)objConn.Execute("Orders", out objRecAff, 
                    (int)ADODB.CommandTypeEnum.adCmdTable);
    
    // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
    
    // Get the Fields collection from the recordset and determine
                // the number of fields (or columns).
                System.Collections.IEnumerator objFields = objRS.Fields.GetEnumerator();
                int nFields = objRS.Fields.Count;
    
    // Create an array for the headers and add it to the
                // worksheet starting at cell A1.
                object[] objHeaders = new object[nFields];
                ADODB.Field objField = null;
                for(int n=0;n<nFields;n++)
                {
                    objFields.MoveNext();
                    objField = (ADODB.Field)objFields.Current;
                    objHeaders[n] = objField.Name;
                }
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objRange = m_objRange.get_Resize(1, nFields);
                m_objRange.set_Value(m_objOpt,objHeaders);
                m_objFont = m_objRange.Font;
                m_objFont.Bold=true;
    
    // Transfer the recordset to the worksheet starting at cell A2.
                m_objRange = m_objSheet.get_Range("A2", m_objOpt);
                m_objRange.CopyFromRecordset(objRS, m_objOpt, m_objOpt);
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book3.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    //Close the recordset and connection
                objRS.Close();
                objConn.Close();
    
    }
    
    private void Automation_QueryTable()
            {
                // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
    // Create a QueryTable that starts at cell A1.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objQryTables = m_objSheet.QueryTables;
                m_objQryTable = (Excel._QueryTable)m_objQryTables.Add(
                    "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                    m_strNorthwind + ";", m_objRange, "Select * From Orders");
                m_objQryTable.RefreshStyle = Excel.XlCellInsertionMode.xlInsertEntireRows;
                m_objQryTable.Refresh(false);
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book4.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Use_Clipboard()
            {
                // Copy a string to the clipboard.
                string sData = "FirstName\tLastName\tBirthdate\r\n"  +
                    "Bill\tBrown\t2/5/85\r\n"  +
                    "Joe\tThomas\t1/1/91";
                System.Windows.Forms.Clipboard.SetDataObject(sData);
    
    // Start a new workbook in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBook = (Excel._Workbook)(m_objBooks.Add(m_objOpt));
    
    // Paste the data starting at cell A1.
                m_objSheets = (Excel.Sheets)m_objBook.Worksheets;
                m_objSheet = (Excel._Worksheet)(m_objSheets.get_Item(1));
                m_objRange = m_objSheet.get_Range("A1", m_objOpt);
                m_objSheet.Paste(m_objRange, false);
    
    // Save the workbook and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book5.xls", m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Create_TextFile()
            {
                // Connect to the data source.
                System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection( 
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strNorthwind + ";");
                objConn.Open();
    
    // Execute a command to retrieve all records from the Employees  table.
                System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand( 
                    "Select * From Employees", objConn);
                System.Data.OleDb.OleDbDataReader objReader;
                objReader = objCmd.ExecuteReader();
    
    // Create the FileStream and StreamWriter object to write 
                // the recordset contents to file.
                System.IO.FileStream fs = new System.IO.FileStream(
                    m_strSampleFolder + "Book6.txt", System.IO.FileMode.Create);
                System.IO.StreamWriter sw = new System.IO.StreamWriter(
                    fs, System.Text.Encoding.Unicode);
    
    // Write the field names (headers) as the first line in the text file.
                sw.WriteLine(objReader.GetName(0) +  "\t" + objReader.GetName(1) +
                    "\t" + objReader.GetName(2) + "\t" + objReader.GetName(3) +
                    "\t" + objReader.GetName(4) + "\t" + objReader.GetName(5));
    
    // Write the first six columns in the recordset to a text file as
                // tab-delimited.
                while(objReader.Read()) 
                {
                    for(int i=0;i<=5;i++)
                    {
                        if(!objReader.IsDBNull(i))
                        {
                            string s;
                            s = objReader.GetDataTypeName(i);
                            if(objReader.GetDataTypeName(i)=="DBTYPE_I4")
                            {
                                sw.Write(objReader.GetInt32(i).ToString());
                            }
                            else if(objReader.GetDataTypeName(i)=="DBTYPE_DATE")
                            {
                                sw.Write(objReader.GetDateTime(i).ToString("d"));
                            }
                            else if (objReader.GetDataTypeName(i)=="DBTYPE_WVARCHAR")
                            {
                                sw.Write(objReader.GetString(i));
                            }
                        }
                        if(i<5) sw.Write("\t");
                    }
                    sw.WriteLine(); 
                }
                sw.Flush();// Write the buffered data to the FileStream.
    
    // Close the FileStream.
                fs.Close();
    
    // Close the reader and the connection.
                objReader.Close();
                objConn.Close(); 
    
    // ==================================================================
                // Optionally, automate Excel to open the text file and save it in the
                // Excel workbook format.
    
    // Open the text file in Excel.
                m_objExcel = new Excel.Application();
                m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
                m_objBooks.OpenText(m_strSampleFolder + "Book6.txt", Excel.XlPlatform.xlWindows, 1, 
                    Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
                    false, true, false, false, false, false, m_objOpt, m_objOpt, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);
    
    m_objBook = m_objExcel.ActiveWorkbook;
    
    // Save the text file in the typical workbook format and quit Excel.
                m_objBook.SaveAs(m_strSampleFolder + "Book6.xls", Excel.XlFileFormat.xlWorkbookNormal, 
                    m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
                    m_objOpt, m_objOpt, m_objOpt);
                m_objBook.Close(false, m_objOpt, m_objOpt);
                m_objExcel.Quit();
    
    }
    
    private void Use_ADONET()
            {
                // Establish a connection to the data source.
                System.Data.OleDb.OleDbConnection objConn = new System.Data.OleDb.OleDbConnection(
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + m_strSampleFolder +
                    "Book7.xls;Extended Properties=Excel 8.0;");
                objConn.Open();
    
    // Add two records to the table named 'MyTable'.
                System.Data.OleDb.OleDbCommand objCmd = new System.Data.OleDb.OleDbCommand();
                objCmd.Connection = objConn;
                objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                    " values ('Bill', 'Brown')";
    
    objCmd.ExecuteNonQuery();
                objCmd.CommandText = "Insert into MyTable (FirstName, LastName)" +
                    " values ('Joe', 'Thomas')";
                objCmd.ExecuteNonQuery();
    
    // Close the connection.
                objConn.Close(); 
    
    } 
    
    }  // End Class
    }// End namespace
    
    

    Notez que vous devez modifier le code dans Visual Studio 2005. Par défaut, Visual C# ajoute un formulaire au projet lorsque vous créez un projet Windows Forms. Le formulaire est nommé Form1. Les deux fichiers qui représentent le formulaire sont nommés Form1.cs et Form1.designer.cs. Vous écrivez le code dans Form1.cs. Le fichier Form1.designer.cs est l’endroit où le concepteur Windows Forms écrit le code qui implémente toutes les actions que vous avez effectuées en faisant glisser et en supprimant des contrôles de la boîte à outils.

    Pour plus d’informations sur le concepteur Windows Forms dans Visual C# 2005, visitez le site web Microsoft Developer Network (MSDN) suivant :

    Création d’un projet (Visual C#) Remarque Si vous n’avez pas installé Office dans le dossier par défaut (C:\Program Files\Microsoft Office), modifiez la constante m_strNorthwind dans l’exemple de code pour qu’elle corresponde à votre chemin d’installation pour Northwind.mdb.

  9. Ajoutez ce qui suit aux directives Using dans Form1.cs :

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. Appuyez sur F5 pour créer et exécuter l’exemple.

References

Pour plus d’informations, visitez le site web de Microsoft suivant :

Développement Microsoft Office avec Visual Studio