Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En Microsoft Visual Basic 6.0-version av den här artikeln finns i 247412.
Den här stegvisa artikeln beskriver flera metoder för att överföra data till Microsoft Excel 2002 från ett Microsoft Visual C# 2005- eller Microsoft Visual C# .NET-program. Den här artikeln beskriver också fördelarna och nackdelarna med varje metod så att du kan välja den lösning som fungerar bäst för din situation.
Översikt
Den teknik som används oftast för att överföra data till en Excel-arbetsbok är Automation. Med Automation kan du anropa metoder och egenskaper som är specifika för Excel-uppgifter. Automation ger dig största flexibilitet för att ange platsen för dina data i arbetsboken, formatera arbetsboken och göra olika inställningar vid körning.
Med Automation kan du använda flera tekniker för att överföra dina data:
- Överför datacell efter cell.
- Överföra data i en matris till ett cellområde.
- Överför data i en ADO-postuppsättning till ett cellområde med hjälp av metoden CopyFromRecordset.
- Skapa ett QueryTable-objekt i ett Excel-kalkylblad som innehåller resultatet av en fråga på en ODBC- eller OLEDB-datakälla.
- Överför data till Urklipp och klistra sedan in innehållet i Urklipp i ett Excel-kalkylblad.
Du kan också använda flera metoder som inte nödvändigtvis kräver att Automation överför data till Excel. Om du kör ett program på serversidan kan detta vara en bra metod för att ta bort huvuddelen av databehandlingen från dina klienter.
Om du vill överföra dina data utan Automation kan du använda följande metoder:
- Överför dina data till en tabbavgränsad eller kommaavgränsad textfil som Excel senare kan parsa i celler i ett kalkylblad.
- Överför dina data till ett kalkylblad med hjälp av ADO.NET.
- Överför XML-data till Excel (version 2002 och 2003) för att tillhandahålla data som är formaterade och ordnade i rader och kolumner.
Den här artikeln innehåller en diskussion och ett kodexempel för var och en av dessa tekniker. Avsnittet "Create the Complete Sample Visual C# 2005 or Visual C# .NET Project", senare i den här artikeln, visar hur du skapar ett Visual C# .NET-program som kör varje teknik.
Tekniker
Använda Automation för att överföra datacell efter cell
Med Automation kan du överföra data till ett kalkylblad en cell i taget:
// 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();
Överföring av datacell per cell är en acceptabel metod om du har en liten mängd data. Du har flexibiliteten att placera data var som helst i arbetsboken och du kan formatera cellerna villkorligt vid körning. Det är dock inte en bra idé att använda den här metoden om du har en stor mängd data att överföra till en Excel-arbetsbok. Varje Range-objekt som du hämtar vid körning resulterar i en gränssnittsbegäran som innebär dataöverföringar långsammare. Dessutom har Microsoft Windows 95, Microsoft Windows 98 och Microsoft Windows Millennium Edition (Me) en begränsning på 64 kilobyte (KB) för gränssnittsbegäranden. Om du har fler än 64 kB gränssnittsbegäranden kan Automation-servern (Excel) sluta svara, eller så kan du få felmeddelanden som anger att det finns ont om minne.
Återigen är överföring av datacell efter cell endast acceptabelt för små mängder data. Om du måste överföra stora datamängder till Excel kan du överväga att använda någon av de andra metoderna som beskrivs i den här artikeln för att överföra data i grupp.
Om du vill ha mer information och ett exempel på hur du automatiserar Excel med Visual C# .NET klickar du på artikelnumret nedan för att visa artikeln i Microsoft Knowledge Base:
302084 HOWTO: Automatisera Microsoft Excel från Microsoft Visual C# .NET
Använda Automation för att överföra en matris med data till ett intervall i ett kalkylblad
Du kan överföra en matris med data till ett område med flera celler samtidigt:
// 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();
Om du överför dina data med hjälp av en matris i stället för cell för cell kan du uppnå en enorm prestandavinst med en stor mängd data. Överväg följande rader från ovan nämnda kod som överför data till 300 celler i kalkylbladet:
objRange = objSheet.get_Range("A2", m_objOpt);
objRange = objRange.get_Resize(100,3);
objRange.Value = objData;
Den här koden representerar två gränssnittsbegäranden: en för range-objektet som range-metoden returnerar och en annan för range-objektet som metoden Resize returnerar. Överföring av datacellen efter cell kräver däremot begäranden om 300 gränssnitt till Range-objekt. När det är möjligt kan du dra nytta av att överföra dina data i grupp och minska antalet gränssnittsbegäranden som du gör.
Om du vill ha mer information om hur du använder matriser för att hämta och ange värden i intervall med Excel Automation klickar du på artikelnumret nedan för att visa artikeln i Microsoft Knowledge Base:
302096 HOWTO: Automatisera Excel med Visual C# .NET för att fylla eller hämta data i ett intervall med matriser
Använda Automation för att överföra en ADO-postuppsättning till ett kalkylbladsintervall
Objektmodellerna för Excel 2000, Excel 2002 och Excel 2003 tillhandahåller metoden CopyFromRecordset för överföring av en ADO-postuppsättning till ett intervall i ett kalkylblad. Följande kod illustrerar hur du automatiserar Excel för att överföra innehållet i tabellen Beställningar i Northwind-exempeldatabasen med hjälp av metoden 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();
Obs!
CopyFromRecordset fungerar endast med ADO Recordset-objekt. Du kan inte använda den DataSet som du skapar med hjälp av ADO.NET med metoden CopyFromRecordset. Flera exempel i avsnitten som följer visar hur du överför data till Excel med ADO.NET.
Använda Automation för att skapa ett QueryTable-objekt i ett kalkylblad
Ett QueryTable-objekt representerar en tabell som skapas från data som returneras från en extern datakälla. När du automatiserar Excel kan du skapa en QueryTable genom att ange en anslutningssträng till en OLE DB eller en ODBC-datakälla och en SQL-sträng. Excel genererar postuppsättningen och infogar postuppsättningen i kalkylbladet på den plats som du anger. QueryTable-objekt har följande fördelar jämfört med metoden CopyFromRecordset:
- Excel hanterar skapandet av postuppsättningen och dess placering i kalkylbladet.
- Du kan spara frågan med QueryTable-objektet och uppdatera den senare för att hämta en uppdaterad postuppsättning.
- När en ny QueryTable läggs till i kalkylbladet kan du ange att data som redan finns i celler i kalkylbladet ska flyttas för att hantera nya data (mer information finns i egenskapen RefreshStyle).
Följande kod visar hur du automatiserar Excel 2000, Excel 2002 eller Excel 2003 för att skapa en ny QueryTable i ett Excel-kalkylblad med hjälp av data från Northwind-exempeldatabasen:
// 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();
Använda Urklipp i Windows
Du kan använda Urklipp i Windows för att överföra data till ett kalkylblad. Om du vill klistra in data i flera celler i ett kalkylblad kan du kopiera en sträng där kolumner avgränsas med TAB-tecken och rader avgränsas med vagnreturer. Följande kod illustrerar hur Visual C# .NET kan använda Windows Urklipp för att överföra data till 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();
Skapa en avgränsad textfil som Excel kan parsa i rader och kolumner
Excel kan öppna tab- eller kommaavgränsade filer och parsa data korrekt i celler. Du kan använda den här funktionen när du vill överföra en stor mängd data till ett kalkylblad medan du använder lite, om någon, Automation. Detta kan vara en bra metod för ett klient-serverprogram eftersom textfilen kan genereras på serversidan. Du kan sedan öppna textfilen på klienten med hjälp av Automation där det är lämpligt.
Följande kod illustrerar hur du genererar en tabbavgränsad textfil från data som läss med 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();
Den ovan nämnda koden använder ingen Automation. Men om du vill kan du använda Automation för att öppna textfilen och spara filen i Excel-arbetsboksformat, ungefär så här:
// 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();
Överföra data till ett kalkylblad med hjälp av ADO.NET
Du kan använda Microsoft Jet OLE DB-providern för att lägga till poster i en tabell i en befintlig Excel-arbetsbok. En tabell i Excel är bara ett cellområde. intervallet kan ha ett definierat namn. Vanligtvis innehåller den första raden i intervallet rubrikerna (eller fältnamnen) och alla senare rader i intervallet innehåller posterna.
Följande kod lägger till två nya poster i en tabell i Book7.xls. Tabellen i det här fallet är 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();
När du lägger till poster med ADO.NET enligt det här exemplet behålls formateringen i arbetsboken. Varje post som läggs till i en rad lånar formatet från raden före den.
Om du vill ha mer information om hur du använder ADO.NET klickar du på artikelnumren nedan för att visa artiklarna i Microsoft Knowledge Base:
306636 HOW TO: Connect to a Database and Run a Command by Using ADO.NET and Visual C# .NET (Anslut till en databas och kör ett kommando med hjälp av ADO.NET och Visual C# .NET
314145 HOW TO: Fyll i ett DataSet-objekt från en databas med hjälp av Visual C# .NET
307587 INSTRUKTIONER: Uppdatera en databas från ett DataSet-objekt med hjälp av Visual C# .NET
Om du vill ha mer information om hur du använder Jet OLEDB-providern med Excel-datakällor klickar du på artikelnumren nedan för att visa artiklarna i Microsoft Knowledge Base:
278973 EXEMPEL: ExcelADO visar hur du använder ADO för att läsa och skriva data i Excel-arbetsböcker
257819 HOWTO: Använda ADO med Excel-data från Visual Basic eller VBA
Överföra XML-data (Excel 2002 och Excel 2003)
Excel 2002 och 2003 kan öppna alla XML-filer som är välformade. Du kan öppna XML-filer direkt med hjälp av kommandot Öppna på Arkiv-menyn eller programmatiskt med hjälp av antingen Open- eller OpenXML-metoderna i arbetsbokssamlingen. Om du skapar XML-filer för användning i Excel kan du även skapa formatmallar för att formatera data.
Skapa det fullständiga visualiseringsexemplet C# .NET-projekt
Skapa en ny mapp med namnet C:\ExcelData. Exempelprogrammet lagrar Excel-arbetsböcker i den här mappen.
Skapa en ny arbetsbok som exemplet ska skriva till:
- Starta en ny arbetsbok i Excel.
- På Blad1 i den nya arbetsboken skriver du FirstName i cell A1 och LastName i cell B1.
- Välj A1:B1.
- Peka på Namn på Infoga-menyn och klicka sedan på Definiera. Skriv namnet MyTable och klicka sedan på OK.
- Spara arbetsboken som C:\Exceldata\Book7.xls.
- Avsluta Excel.
Starta Microsoft Visual Studio 2005 eller Microsoft Visual Studio .NET. Peka på Nytt på Redigera-menyn, och klicka sedan på Projekt. Under Visual C#-projekt eller Visual C# väljer du Windows-program. Som standard skapas Form1.
Lägg till en referens till Excel-objektbiblioteket och den primära ADODB-interopsammansättningen. Gör så här:
- Klicka på Lägg till referens på Projekt-menyn.
- Leta upp ADODB på fliken NET och klicka sedan på Välj.
Obs! I Visual Studio 2005 behöver du inte klicka på Välj.
3. På fliken COM letar du upp Microsoft Excel 10.0-objektbiblioteket eller Microsoft Excel 11.0-objektbiblioteket och klickar sedan på Välj.Obs! I Visual Studio 2005 behöver du inte klicka på Välj.
Obs! Om du använder Microsoft Excel 2002 och du inte redan har gjort det rekommenderar Microsoft att du laddar ned och sedan installerar Microsoft Office XP Primary Interop Assemblies (PIA).
I dialogrutan Lägg till referenser klickar du på OK för att acceptera dina val.
Lägg till en kombinationsrutekontroll och en knappkontroll i Form1.
Lägg till händelsehanterare för händelsen Formulärinläsning och Klicka på händelser för knappkontrollen:
- Dubbelklicka på Formulär1 i designvyn för Form1.cs.
Hanteraren för formulärets inläsningshändelse skapas och visas i Form1.cs.
2. På menyn Visa klickar du på Designer för att växla till designvyn.
3. Dubbelklicka på Knapp1.Hanteraren för knappens Klicka-händelse skapas och visas i Form1.cs.
Ersätt följande kod i Form1.cs:
private void Form1_Load(object sender, System.EventArgs e) { } private void button1_Click(object sender, System.EventArgs e) { }
Med:
// 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
Obs! Du måste ändra koden i Visual Studio 2005. Som standard lägger Visual C# till ett formulär i projektet när du skapar ett Windows Forms projekt. Formuläret heter Form1. De två filerna som representerar formuläret heter Form1.cs och Form1.designer.cs. Du skriver koden i Form1.cs. Filen Form1.designer.cs är den plats där Windows Forms Designer skriver koden som implementerar alla åtgärder som du utförde genom att dra och släppa kontroller från verktygslådan.
Mer information om Windows Forms Designer i Visual C# 2005 finns på följande webbplats för Microsoft Developer Network (MSDN):
Skapa ett projekt (Visual C#) Obs! Om du inte har installerat Office i standardmappen (C:\Program Files\Microsoft Office) ändrar du m_strNorthwind konstanten i kodexemplet så att den matchar installationssökvägen för Northwind.mdb.
Lägg till följande i Using-direktiv i Form1.cs:
using System.Reflection; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel;
Tryck på F5 för att skapa och köra exemplet.
Referenser
För mer information, besök följande Microsoft-webbplats: