Gegevens overdragen naar een Excel-werkmap met behulp van Visual C# 2005 of Visual C# .NET

Zie 247412 voor een Microsoft Visual Basic 6.0-versie van dit artikel.

In dit stapsgewijze artikel worden verschillende methoden beschreven voor het overdragen van gegevens naar Microsoft Excel 2002 vanuit een Microsoft Visual C# 2005- of Microsoft Visual C# .NET-programma. In dit artikel worden ook de voor- en nadelen van elke methode beschreven, zodat u de oplossing kunt selecteren die het beste bij uw situatie past.

Overzicht

De techniek die het meest wordt gebruikt om gegevens over te dragen naar een Excel-werkmap is Automation. Met Automation kunt u methoden en eigenschappen aanroepen die specifiek zijn voor Excel-taken. Automatisering biedt u de grootste flexibiliteit voor het opgeven van de locatie van uw gegevens in de werkmap, het opmaken van de werkmap en het maken van verschillende instellingen tijdens runtime.

Met Automation kunt u verschillende technieken gebruiken om uw gegevens over te dragen:

  • Gegevenscel per cel overdragen.
  • Gegevens in een matrix overdragen naar een celbereik.
  • Gegevens in een ADO-recordset overdragen naar een celbereik met behulp van de methode CopyFromRecordset.
  • Maak een QueryTable-object op een Excel-werkblad dat het resultaat bevat van een query op een ODBC- of OLEDB-gegevensbron.
  • Breng gegevens over naar het klembord en plak de inhoud van het klembord in een Excel-werkblad.
    U kunt ook verschillende methoden gebruiken waarvoor automation niet noodzakelijkerwijs vereist is om gegevens over te dragen naar Excel. Als u een programma aan de serverzijde uitvoert, kan dit een goede methode zijn om het grootste deel van de gegevensverwerking van uw clients te verwijderen.

Als u uw gegevens wilt overdragen zonder Automation, kunt u de volgende methoden gebruiken:

  • Breng uw gegevens over naar een tekstbestand met door tabs gescheiden of door komma's gescheiden tekstbestanden dat excel later kan parseren in cellen op een werkblad.
  • Breng uw gegevens over naar een werkblad met behulp van ADO.NET.
  • XML-gegevens overdragen naar Excel (versie 2002 en 2003) om gegevens op te geven die zijn opgemaakt en gerangschikt in rijen en kolommen.

In dit artikel vindt u een discussie en een codevoorbeeld voor elk van deze technieken. In de sectie 'Create the Complete Sample Visual C# 2005 or Visual C# .NET Project' verderop in dit artikel ziet u hoe u een Visual C# .NET-programma maakt waarmee elke techniek wordt uitgevoerd.

Technieken

Automatisering gebruiken om gegevenscel per cel over te dragen

Met Automation kunt u gegevens één cel tegelijk overbrengen naar een werkblad:

// 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();

Het overdragen van gegevenscel per cel is een acceptabele methode als u een kleine hoeveelheid gegevens hebt. U hebt de flexibiliteit om gegevens overal in de werkmap op te nemen en u kunt de cellen voorwaardelijk opmaken tijdens runtime. Het is echter geen goed idee om deze methode te gebruiken als u een grote hoeveelheid gegevens hebt om over te dragen naar een Excel-werkmap. Elk bereikobject dat u tijdens runtime verkrijgt, resulteert in een interfaceaanvraag die betekent dat gegevens langzamer worden overgebracht. Daarnaast hebben Microsoft Windows 95, Microsoft Windows 98 en Microsoft Windows Millennium Edition (Mij) een beperking van 64 kilobyte (KB) voor interfaceaanvragen. Als u meer dan 64 kB aan interfaceaanvragen hebt, reageert de Automation-server (Excel) mogelijk niet meer of ontvangt u foutberichten die wijzen op onvoldoende geheugen.

Ook hier is het overdragen van gegevenscel per cel alleen acceptabel voor kleine hoeveelheden gegevens. Als u grote gegevenssets naar Excel moet overdragen, kunt u een van de andere methoden gebruiken die in dit artikel worden besproken om gegevens bulksgewijs over te dragen.

Klik voor meer informatie en voor een voorbeeld van het automatiseren van Excel met Visual C# .NET op het artikelnummer hieronder om het artikel in de Microsoft Knowledge Base weer te geven:

302084 HOWTO: Microsoft Excel automatiseren vanuit Microsoft Visual C# .NET

Automatisering gebruiken om een matrix met gegevens over te dragen naar een bereik op een werkblad

U kunt een matrix met gegevens overdragen naar een bereik van meerdere cellen tegelijk:

// 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();

Als u uw gegevens overdraagt met behulp van een matrix in plaats van cel voor cel, kunt u een enorme prestatiewinst realiseren met een grote hoeveelheid gegevens. Houd rekening met de volgende regels van de bovengenoemde code waarmee gegevens worden overgebracht naar 300 cellen in het werkblad:

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

Deze code vertegenwoordigt twee interfaceaanvragen: een voor het bereikobject dat door de methode Bereik wordt geretourneerd en een voor het bereikobject dat door de methode Resize wordt geretourneerd. Het overdragen van de gegevenscel per cel vereist daarentegen aanvragen voor 300 interfaces naar bereikobjecten. Waar mogelijk kunt u profiteren van het bulksgewijs overdragen van uw gegevens en het verminderen van het aantal interfaceaanvragen dat u doet.

Voor meer informatie over het gebruik van matrices om waarden in bereiken op te halen en in te stellen met Excel Automation, klikt u op het onderstaande artikel om het artikel in de Microsoft Knowledge Base weer te geven:

302096 PROCEDURE: Excel automatiseren met Visual C# .NET om gegevens in een bereik op te vullen of te verkrijgen met behulp van matrices

Automation gebruiken om een ADO-recordset over te dragen naar een werkbladbereik

De objectmodellen voor Excel 2000, Excel 2002 en Excel 2003 bieden de methode CopyFromRecordset voor het overbrengen van een ADO-recordset naar een bereik op een werkblad. De volgende code laat zien hoe u Excel kunt automatiseren om de inhoud van de tabel Orders in de Northwind-voorbeelddatabase over te dragen met behulp van de methode 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();

Opmerking

CopyFromRecordset werkt alleen met ADO Recordset-objecten. U kunt de gegevensset die u maakt niet gebruiken met behulp van ADO.NET met de methode CopyFromRecordset. Verschillende voorbeelden in de volgende secties laten zien hoe u gegevens overdraagt naar Excel met ADO.NET.

Automation gebruiken om een querytabelobject op een werkblad te maken

Een QueryTable-object vertegenwoordigt een tabel die is gebouwd op basis van gegevens die worden geretourneerd vanuit een externe gegevensbron. Wanneer u Excel automatiseert, kunt u een querytabel maken door een connection string aan een OLE DB of een ODBC-gegevensbron en een SQL-tekenreeks op te geven. Excel genereert de recordset en voegt de recordset in het werkblad in op de locatie die u opgeeft. QueryTable-objecten bieden de volgende voordelen ten opzichte van de methode CopyFromRecordset:

  • Excel verwerkt het maken van de recordset en de plaatsing ervan op het werkblad.
  • U kunt de query opslaan met het QueryTable-object en deze later vernieuwen om een bijgewerkte recordset te verkrijgen.
  • Wanneer er een nieuwe querytabel aan het werkblad wordt toegevoegd, kunt u opgeven dat gegevens die al in cellen op het werkblad aanwezig zijn, moeten worden verplaatst om de nieuwe gegevens te verwerken (zie de eigenschap RefreshStyle voor meer informatie).

De volgende code laat zien hoe u Excel 2000, Excel 2002 of Excel 2003 kunt automatiseren om een nieuwe querytabel te maken in een Excel-werkblad met behulp van gegevens uit de Voorbeelddatabase Noordenwind:

// 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();

Het Windows Klembord gebruiken

U kunt het Klembord van Windows gebruiken om gegevens over te dragen naar een werkblad. Als u gegevens in meerdere cellen in een werkblad wilt plakken, kunt u een tekenreeks kopiëren waarin kolommen worden gescheiden door TAB-tekens en rijen worden gescheiden door regelterugloop. De volgende code laat zien hoe Visual C# .NET het Klembord van Windows kan gebruiken om gegevens over te dragen naar 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();

Een tekstbestand met scheidingstekens maken dat in Excel kan worden geparseerd in rijen en kolommen

In Excel kunnen door tabs of komma's gescheiden bestanden worden geopend en de gegevens correct in cellen worden geparseerd. U kunt deze functie gebruiken wanneer u een grote hoeveelheid gegevens naar een werkblad wilt overdragen terwijl u weinig, indien aanwezig, Automatisering gebruikt. Dit kan een goede benadering zijn voor een client-serverprogramma omdat het tekstbestand aan de serverzijde kan worden gegenereerd. U kunt het tekstbestand vervolgens openen bij de client, met behulp van Automation waar dit geschikt is.

De volgende code laat zien hoe u een tekstbestand met tabscheidingstekens genereert op basis van gegevens die worden gelezen met 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(); 

De bovengenoemde code maakt geen gebruik van Automation. Als u wilt, kunt u automation echter gebruiken om het tekstbestand te openen en het bestand op te slaan in de Indeling van de Excel-werkmap, vergelijkbaar met deze:

// 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();

Gegevens overdragen naar een werkblad met behulp van ADO.NET

U kunt de Microsoft Jet OLE DB-provider gebruiken om records toe te voegen aan een tabel in een bestaande Excel-werkmap. Een tabel in Excel is slechts een celbereik; het bereik kan een gedefinieerde naam hebben. Normaal gesproken bevat de eerste rij van het bereik de kopteksten (of veldnamen) en alle latere rijen in het bereik bevatten de records.

Met de volgende code worden twee nieuwe records toegevoegd aan een tabel in Book7.xls. De tabel in dit geval is Blad1:

// 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();

Wanneer u records toevoegt met ADO.NET zoals in dit voorbeeld wordt weergegeven, blijft de opmaak in de werkmap behouden. Voor elke record die aan een rij wordt toegevoegd, wordt de notatie uit de rij ervoor geleend.

Klik op de onderstaande artikelnummers voor meer informatie over het gebruik van ADO.NET om de artikelen in de Microsoft Knowledge Base weer te geven:

306636 PROCEDURE: Verbinding maken met een database en een opdracht uitvoeren met behulp van ADO.NET en Visual C# .NET

314145 PROCEDURE: Een DataSet-object uit een database vullen met behulp van Visual C# .NET

307587 PROCEDURE: Een database bijwerken vanuit een DataSet-object met behulp van Visual C# .NET

Voor meer informatie over het gebruik van de Jet OLEDB-provider met Excel-gegevensbronnen klikt u op de onderstaande artikelnummers om de artikelen in de Microsoft Knowledge Base weer te geven:

278973 VOORBEELD: ExcelADO laat zien hoe u ADO gebruikt om gegevens te lezen en schrijven in Excel-werkmappen

257819 HOWTO: ADO gebruiken met Excel-gegevens uit Visual Basic of VBA

XML-gegevens overdragen (Excel 2002 en Excel 2003)

In Excel 2002 en 2003 kunt u elk XML-bestand openen dat goed is opgemaakt. U kunt XML-bestanden rechtstreeks openen met behulp van de opdracht Openen in het menu Bestand of programmatisch met behulp van de methoden Openen of OpenXML van de verzameling Workbooks. Als u XML-bestanden maakt voor gebruik in Excel, kunt u ook opmaakmodellen maken om de gegevens op te maken.

Het volledige voorbeeld van een Visual C# .NET-project maken

  1. Maak een nieuwe map met de naam C:\ExcelData. In het voorbeeldprogramma worden Excel-werkmappen in deze map opgeslagen.

  2. Maak een nieuwe werkmap waarnaar het voorbeeld moet schrijven:

    1. Start een nieuwe werkmap in Excel.
    2. Typ op Blad1 van de nieuwe werkmap Voornaam in cel A1 en Achternaam in cel B1.
    3. Selecteer A1:B1.
    4. Wijs in het menu Invoegen naam aan en klik op Definiëren. Typ de naam MyTable en klik op OK.
    5. Sla de werkmap op als C:\Exceldata\Book7.xls.
    6. Sluit Excel af.
  3. Start Microsoft Visual Studio 2005 of Microsoft Visual Studio .NET. Wijs in het menu Bestand naar Nieuw en klik vervolgens op Project. Selecteer Windows-toepassing onder Visual C#-projecten of Visual C#. Standaard wordt Form1 gemaakt.

  4. Voeg een verwijzing toe naar de Excel-objectbibliotheek en de primaire ADODB-assembly. Ga hiervoor als volgt te werk:

    1. Klik in het menu Project op Verwijzing toevoegen.
    2. Zoek ADODB op het tabblad NET en klik op Selecteren.

    Opmerking In Visual Studio 2005 hoeft u niet op Selecteren te klikken.
    3. Ga op het tabblad COM naar microsoft Excel 10.0-objectbibliotheek of Microsoft Excel 11.0-objectbibliotheek en klik op Selecteren.

    Opmerking In Visual Studio 2005 hoeft u niet op Selecteren te klikken.

    Opmerking Als u Microsoft Excel 2002 gebruikt en u dit nog niet hebt gedaan, raadt Microsoft u aan de Primaire interop-assembly's (PIA's) van Microsoft Office XP te downloaden en vervolgens te installeren.

  5. Klik in het dialoogvenster Verwijzingen toevoegen op OK om uw selecties te accepteren.

  6. Voeg een besturingselement keuzelijst met invoervak en een knopbesturingselement toe aan Form1.

  7. Gebeurtenis-handlers toevoegen voor de gebeurtenis Formulier laden en klik-gebeurtenissen van het besturingselement Knop:

    1. Dubbelklik in de ontwerpweergave voor Form1.cs op Form1.

    De handler voor de gebeurtenis Laden van het formulier wordt gemaakt en wordt weergegeven in Form1.cs.
    2. Klik in het menu Beeld op Designer om over te schakelen naar de ontwerpweergave.
    3. Dubbelklik op Knop1.

    De handler voor de klik-gebeurtenis van de knop wordt gemaakt en wordt weergegeven in Form1.cs.

  8. Vervang in Form1.cs de volgende code:

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

    Met:

            // 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
    
    

    Opmerking U moet de code wijzigen in Visual Studio 2005. In Visual C# wordt standaard één formulier aan het project toegevoegd wanneer u een Windows Forms project maakt. Het formulier heeft de naam Form1. De twee bestanden die het formulier vertegenwoordigen, hebben de naam Form1.cs en Form1.designer.cs. U schrijft de code in Form1.cs. Het bestand Form1.designer.cs is de locatie waar de Windows Forms Designer de code schrijft die alle acties implementeert die u hebt uitgevoerd door besturingselementen uit de werkset te slepen en neer te zetten.

    Voor meer informatie over de Windows Forms Designer in Visual C# 2005 gaat u naar de volgende Msdn-website (Microsoft Developer Network):

    Een project maken (Visual C#) Opmerking Als u Office niet hebt geïnstalleerd in de standaardmap (C:\Program Files\Microsoft Office), wijzigt u de constante m_strNorthwind in het codevoorbeeld zodat deze overeenkomt met uw installatiepad voor Northwind.mdb.

  9. Voeg het volgende toe aan de using-instructies in Form1.cs:

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. Druk op F5 om het voorbeeld te bouwen en uit te voeren.

Verwijzingen

Ga naar de volgende Microsoft-website voor meer informatie:

Microsoft Office-ontwikkeling met Visual Studio