Visual C# 2005 veya Visual C# .NET kullanarak excel çalışma kitabına veri aktarma

Bu makalenin Microsoft Visual Basic 6.0 sürümü için bkz. 247412.

Bu adım adım makalede, Microsoft Visual C# 2005 veya Microsoft Visual C# .NET programından Microsoft Excel 2002'ye veri aktarmaya yönelik çeşitli yöntemler açıklanmaktadır. Bu makale, durumunuz için en uygun çözümü seçebilmeniz için her yöntemin avantajlarını ve dezavantajlarını da sunar.

Genel bakış

Excel çalışma kitabına veri aktarmak için en sık kullanılan teknik Otomasyon'dur. Otomasyon ile Excel görevlerine özgü yöntemleri ve özellikleri çağırabilirsiniz. Otomasyon, çalışma kitabındaki verilerinizin konumunu belirtmek, çalışma kitabını biçimlendirmek ve çalışma zamanında çeşitli ayarlar yapmak için size en büyük esnekliği sağlar.

Otomasyon ile verilerinizi aktarmak için çeşitli teknikler kullanabilirsiniz:

  • Veri hücresine göre aktarma.
  • Dizideki verileri bir hücre aralığına aktarma.
  • CopyFromRecordset yöntemini kullanarak bir ADO kayıt kümesindeki verileri bir hücre aralığına aktarın.
  • Bir ODBC veya OLEDB veri kaynağındaki sorgunun sonucunu içeren bir Excel çalışma sayfasında QueryTable nesnesi oluşturun.
  • Verileri panoya aktarın ve pano içeriğini excel çalışma sayfasına yapıştırın.
    Excel'e veri aktarmak için Otomasyon gerektirmeyen çeşitli yöntemler de kullanabilirsiniz. Sunucu tarafı bir program çalıştırıyorsanız, bu, veri işlemenin büyük bir kısmını istemcilerinizden uzaklaştırmak için iyi bir yaklaşım olabilir.

Verilerinizi Otomasyon olmadan aktarmak için aşağıdaki yaklaşımları kullanabilirsiniz:

  • Verilerinizi Excel'in daha sonra çalışma sayfasındaki hücrelere ayrıştırabileceği sekmeyle ayrılmış veya virgülle ayrılmış bir metin dosyasına aktarın.
  • ADO.NET kullanarak verilerinizi çalışma sayfasına aktarın.
  • Xml verilerini Excel'e (sürüm 2002 ve 2003) aktararak biçimlendirilmiş ve satırlara ve sütunlara yerleştirilmiş veriler sağlayın.

Bu makalede, bu tekniklerin her biri için bir tartışma ve kod örneği sağlanır. Bu makalenin devamında yer alan "Eksiksiz Örnek Visual C# 2005 veya Visual C# .NET Projesi Oluşturma" bölümünde, her tekniği yürüten bir Visual C# .NET programının nasıl oluşturulacağı gösterilmektedir.

Teknik

Veri Hücresini Hücreye Göre Aktarmak için Otomasyon Kullanma

Otomasyon ile bir çalışma sayfasına her seferinde bir hücre veri aktarabilirsiniz:

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

Az miktarda veriniz varsa, veri hücresinin hücreye aktarılması kabul edilebilir bir yaklaşımdır. Çalışma kitabının herhangi bir yerine veri yerleştirme esnekliğine sahipsiniz ve hücreleri çalışma zamanında koşullu olarak biçimlendirebilirsiniz. Ancak, Excel çalışma kitabına aktarabileceğiniz çok fazla miktarda veriniz varsa bu yaklaşımı kullanmak iyi bir fikir değildir. Çalışma zamanında edindiğiniz her Range nesnesi, veri aktarımlarının daha yavaş olduğu anlamına gelen bir arabirim isteğiyle sonuçılır. Ayrıca, Microsoft Windows 95, Microsoft Windows 98 ve Microsoft Windows Millennium Edition (Me) arabirim isteklerinde 64 kilobayt (KB) sınırlaması vardır. 64 KB'tan fazla arabirim isteğiniz varsa Otomasyon sunucusu (Excel) yanıt vermeyi durdurabilir veya yetersiz belleği gösteren hata iletileri alabilirsiniz.

Yine, veri hücresinin hücreye göre aktarılması yalnızca küçük miktarlardaki veriler için kabul edilebilir. Büyük veri kümelerini Excel'e aktarmanız gerekiyorsa, verileri toplu olarak aktarmak için bu makalede ele alınan diğer yaklaşımlardan birini kullanmayı göz önünde bulundurun.

Ek bilgi için ve Excel'i Visual C# .NET ile Otomatikleştirme örneği için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:

302084 NASıL YAPıLıR: Microsoft Visual C# .NET'ten Microsoft Excel'i otomatikleştirme

Bir Veri Dizisini Çalışma Sayfasındaki Bir Aralığa Aktarmak için Otomasyon Kullanma

Bir veri dizisini bir kerede birden çok hücre aralığına aktarabilirsiniz:

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

Verilerinizi hücre hücre yerine dizi kullanarak aktarırsanız, büyük miktarda veriyle muazzam bir performans kazancı elde edebilirsiniz. Çalışma sayfasındaki 300 hücreye veri aktaran yukarıda belirtilen koddan aşağıdaki satırları göz önünde bulundurun:

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

Bu kod iki arabirim isteğini temsil eder: biri Range yönteminin döndürdüğü Range nesnesi için, diğeri resize yönteminin döndürdüğü Range nesnesi için. Buna karşılık, veri hücresinin hücreye göre aktarılması için Range nesnelerine 300 arabirim isteği gerekir. Mümkün olduğunda verilerinizi toplu olarak aktarma ve yaptığınız arabirim isteklerinin sayısını azaltma avantajından yararlanabilirsiniz.

Excel Otomasyonu ile aralıklardaki değerleri almak ve ayarlamak için dizileri kullanma hakkında ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:

302096 NASıL YAPıLıR: Dizileri Kullanarak Aralıktaki Verileri Doldurmak veya Almak için Excel'i Visual C# .NET ile Otomatikleştirme

ADO Kayıt Kümesini Çalışma Sayfası Aralığına Aktarmak için Otomasyon Kullanma

Excel 2000, Excel 2002 ve Excel 2003 nesne modelleri, bir ADO kayıt kümesini çalışma sayfasındaki bir aralığa aktarmak için CopyFromRecordset yöntemini sağlar. Aşağıdaki kodda, CopyFromRecordset yöntemini kullanarak Northwind örnek veritabanındaki Orders tablosunun içeriğini aktarmak için Excel'i otomatikleştirme işlemi gösterilmektedir:

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

Not

CopyFromRecordset yalnızca ADO Recordset nesneleriyle çalışır. ADO.NET kullanarak oluşturduğunuz DataSet'i CopyFromRecordset yöntemiyle kullanamazsınız. Aşağıdaki bölümlerde yer alan çeşitli örnekler, ADO.NET ile Excel'e veri aktarmayı göstermektedir.

Çalışma Sayfasında QueryTable Nesnesi Oluşturmak için Otomasyon Kullanma

QueryTable nesnesi, dış veri kaynağından döndürülen verilerden oluşturulan bir tabloyu temsil eder. Excel'i otomatikleştirdiğinizde, OLE DB'ye veya ODBC veri kaynağına ve SQL dizesine bağlantı dizesi sağlayarak QueryTable oluşturabilirsiniz. Excel kayıt kümesini oluşturur ve kayıt kümesini belirttiğiniz konumdaki çalışma sayfasına ekler. QueryTable nesneleri CopyFromRecordset yöntemine göre aşağıdaki avantajları sunar:

  • Excel, kayıt kümesinin oluşturulmasını ve çalışma sayfasındaki yerleşimini işler.
  • Sorguyu QueryTable nesnesiyle kaydedebilir ve daha sonra yenileyip güncelleştirilmiş bir kayıt kümesi elde edebilirsiniz.
  • Çalışma sayfanıza yeni bir QueryTable eklendiğinde, yeni verileri işlemek için çalışma sayfasındaki hücrelerde zaten var olan verilerin kaydırılacağını belirtebilirsiniz (daha fazla bilgi için RefreshStyle özelliğine bakın).

Aşağıdaki kod, Northwind örnek veritabanındaki verileri kullanarak Excel çalışma sayfasında yeni bir QueryTable oluşturmak için Excel 2000, Excel 2002 veya Excel 2003'i otomatikleştirmeyi gösterir:

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

Windows Panosu'nı kullanma

Çalışma sayfasına veri aktarmak için Windows Panosu'nı kullanabilirsiniz. Çalışma sayfasındaki birden çok hücreye veri yapıştırmak için, sütunların SEKME karakterleriyle sınırlandırıldığı ve satırların satır başıyla sınırlandırıldığı bir dizeyi kopyalayabilirsiniz. Aşağıdaki kod, Visual C# .NET'in Verileri Excel'e aktarmak için Windows Panosu'nu nasıl kullanabileceğini gösterir:

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

Excel'in Satırlara ve Sütunlara Ayrıştırabileceği Sınırlandırılmış Metin Dosyası Oluşturma

Excel sekme veya virgülle ayrılmış dosyaları açabilir ve verileri doğru şekilde hücrelere ayrıştırabilir. Çok fazla miktarda veriyi bir çalışma sayfasına aktarmak istediğinizde bu özelliği kullanabilirsiniz; varsa çok az otomasyon kullanabilirsiniz. Metin dosyası sunucu tarafında oluşturulabileceğinden, bu bir istemci-sunucu programı için iyi bir yaklaşım olabilir. Ardından, uygun olduğu yerde Otomasyon'ı kullanarak metin dosyasını istemcide açabilirsiniz.

Aşağıdaki kodda, ADO.NET ile okunan verilerden sekmeyle sınırlandırılmış metin dosyasının nasıl oluşturulacağı gösterilmektedir:

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

Yukarıda belirtilen kod otomasyon kullanmaz. Ancak, isterseniz Otomasyon'u kullanarak metin dosyasını açabilir ve dosyayı excel çalışma kitabı biçiminde kaydedebilirsiniz; örneğin:

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

ADO.NET Kullanarak Çalışma Sayfasına Veri Aktarma

Var olan bir Excel çalışma kitabındaki bir tabloya kayıt eklemek için Microsoft Jet OLE DB sağlayıcısını kullanabilirsiniz. Excel'de tablo yalnızca bir hücre aralığıdır; aralığı tanımlı bir ada sahip olabilir. Genellikle, aralığın ilk satırı üst bilgileri (veya alan adlarını) içerir ve aralıktaki sonraki tüm satırlar kayıtları içerir.

Aşağıdaki kod, Book7.xls'deki bir tabloya iki yeni kayıt ekler. Bu örnekteki tablo Sayfa1'dir:

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

Bu örnekte gösterildiği gibi ADO.NET içeren kayıtlar eklediğinizde, çalışma kitabındaki biçimlendirme korunur. Satıra eklenen her kayıt, önceki satırdan biçimi ödünç alır.

ADO.NET kullanma hakkında ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleleri görüntülemek üzere aşağıdaki makale numaralarına tıklayın:

306636 NASIL YAPıLıR: ADO.NET ve Visual C# .NET Kullanarak Veritabanına Bağlanma ve Komut Çalıştırma

314145 NASIL YAPıLıR: Visual C# .NET Kullanarak Veritabanından DataSet Nesnesi Doldurma

307587 NASIL YAPıLıR: Visual C# .NET Kullanarak DataSet Nesnesinden Veritabanı Güncelleştirme

Jet OLEDB sağlayıcısını Excel veri kaynaklarıyla kullanma hakkında ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleleri görüntülemek üzere aşağıdaki makale numaralarına tıklayın:

278973 ÖRNEK: ExcelADO, Excel Çalışma Kitaplarında Verileri Okumak ve Yazmak için ADO Kullanma Adımlarını Gösterir

257819 NASıL YAPıLıR: Visual Basic veya VBA'dan Excel Verileri ile ADO kullanma

XML Verilerini Aktarma (Excel 2002 ve Excel 2003)

Excel 2002 ve 2003, iyi biçimlendirilmiş herhangi bir XML dosyasını açabilir. XML dosyalarını doğrudan Dosya menüsündeki Aç komutunu kullanarak veya Çalışma Kitapları koleksiyonunun Open veya OpenXML yöntemlerini kullanarak program aracılığıyla açabilirsiniz. Excel'de kullanmak üzere XML dosyaları oluşturursanız, verileri biçimlendirmek için stil sayfaları da oluşturabilirsiniz.

Eksiksiz Örnek Visual C# .NET Projesi Oluşturma

  1. C:\ExcelData adlı yeni bir klasör oluşturun. Örnek program, Excel çalışma kitaplarını bu klasörde depolar.

  2. Örneğin yazacağı yeni bir çalışma kitabı oluşturun:

    1. Excel'de yeni bir çalışma kitabı başlatın.
    2. Yeni çalışma kitabının Sayfa1'inde, A1 hücresine Ad ve B1 hücresindeki Soyadı yazın.
    3. A1:B1'i seçin.
    4. Ekle menüsünde, Ad'ın üzerine gelin ve Tanımla'ya tıklayın. MyTable adını yazın ve Tamam'a tıklayın.
    5. Çalışma kitabını C:\Exceldata\Book7.xls olarak kaydedin.
    6. Excel'den çıkın.
  3. Microsoft Visual Studio 2005 veya Microsoft Visual Studio .NET'i başlatın. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'ye tıklayın. Visual C# Projeleri veya Visual C# altında Windows Uygulaması'yı seçin. Varsayılan olarak Form1 oluşturulur.

  4. Excel nesne kitaplığına ve ADODB birincil birlikte çalışma derlemesine bir başvuru ekleyin. Bunu yapmak için şu adımları uygulayın:

    1. Proje menüsünde Başvuru Ekle'ye tıklayın.
    2. NET sekmesinde ADODB'yi bulun ve Seç'e tıklayın.

    Not Visual Studio 2005'te Seç'e tıklamanız gerekmez.
    3. COM sekmesinde, Microsoft Excel 10.0 Nesne Kitaplığı'nı veya Microsoft Excel 11.0 Nesne Kitaplığı'nı bulun ve Seç'e tıklayın.

    Not Visual Studio 2005'te Seç'e tıklamanız gerekmez.

    Not Microsoft Excel 2002 kullanıyorsanız ve henüz yapmadıysanız Microsoft, Microsoft Office XP Birincil Birlikte Çalışma Derlemelerini (PIA) indirip yüklemenizi önerir.

  5. Başvuru Ekle iletişim kutusunda Tamam'a tıklayarak seçimlerinizi kabul edin.

  6. Form1'e Birleşik Giriş Kutusu denetimi ve Düğme denetimi ekleyin.

  7. Form Yükleme olayı ve Düğme denetiminin Click olayları için olay işleyicileri ekleyin:

    1. Form1.cs'nin tasarım görünümünde Form1'e çift tıklayın.

    Formun Load olayının işleyicisi oluşturulur ve Form1.cs dosyasında görüntülenir.
    2. Görünüm menüsünde Tasarımcı'ya tıklayarak tasarım görünümüne geçin.
    3. Düğme1'e çift tıklayın.

    Düğmenin Click olayının işleyicisi oluşturulur ve Form1.cs'de görüntülenir.

  8. Form1.cs'de aşağıdaki kodu değiştirin:

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

    Ile:

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

    Not Visual Studio 2005'te kodu değiştirmeniz gerekir. Varsayılan olarak, Windows Forms proje oluşturduğunuzda Visual C# projeye bir form ekler. Form, Form1 olarak adlandırılır. Formu temsil eden iki dosya Form1.cs ve Form1.designer.cs olarak adlandırılır. Kodu Form1.cs'de yazarsınız. Form1.designer.cs dosyası, Windows Forms Tasarımcısı'nın Denetimleri Araç Kutusu'ndan sürükleyip bırakarak gerçekleştirdiğiniz tüm eylemleri uygulayan kodu yazdığı yerdir.

    Visual C# 2005'teki Windows Forms Tasarımcısı hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:

    Proje Oluşturma (Visual C#) Not Office'i varsayılan klasöre yüklemediyseniz (C:\Program Files\Microsoft Office), kod örneğindeki m_strNorthwind sabitini Northwind.mdb yükleme yolunuzla eşleşecek şekilde değiştirin.

  9. Form1.cs'deki Using yönergelerine aşağıdakileri ekleyin:

    using System.Reflection;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  10. Örneği derlemek ve çalıştırmak için F5 tuşuna basın.

Başvurular

Daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:

Visual Studio ile Microsoft Office Geliştirme