Bu örnekte C# Windows Formda bulunan DataGridView denetimi içindeki verileri nasıl Ms Excel dosyasına aktarabileceğinizi göstereceğim.
DataGridView, Windows Forms uygulamalarında verilerin görsel olarak görüntülenmesini sağlayan bir kullanıcı arayüz elemanıdır. DataGridView, satır ve sütunlar şeklinde verileri görüntüler ve verilere görsel olarak erişim, düzenleme, sıralama, filtreleme gibi işlemler yapabilme imkanı sunar.
DataGridView için farklı veritabanlarından (Access, SQL Server, MySql vb.) ve değişik yöntemlerle verilerinizi çekebilirsiniz veya programatik olarak verilerinizin yüklenmesini sağlayabilirsiniz.
Şimdi konumuza dönelim. DataGridview içindeki verileri excel’ e aktarmak için aşağıdaki adımları takip edebilirsiniz.
Adım 1: Formumuzu aşağıdaki gibi tasarlıyoruz.
Adım 2: Microsoft.Office.Interop.Excel NuGet paketini yüklemek için Solution Explorer penceresinden projemiz üzerine sağ tıklayarak Manage Nuget Package tıklıyoruz.
Gelen pencerede arama bölümüne Excel yazarak alttaki görselde görüldüğü gibi paketimizi yüklüyoruz.
Adım 3: İlk olarak Microsoft.Office.Interop.Excel kütüphanesini using ile import edelim.
1 2 3 |
using Microsoft.Office.Interop.Excel; |
Adım 4: Şimdi de verilerin Excel dosyamıza aktarımını sağlayacak metodumuzu oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
private void ExportToExcel(DataGridView dataGridView) { Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Visible = true; Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value); Microsoft.Office.Interop.Excel.Worksheet sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1]; for (int i = 0; i < dataGridView.Columns.Count; i++) { sheet1.Cells[1, i + 1] = dataGridView.Columns[i].HeaderText; } for (int i = 0; i < dataGridView.Rows.Count; i++) { for (int j = 0; j < dataGridView.Columns.Count; j++) { sheet1.Cells[i + 2, j + 1] = dataGridView.Rows[i].Cells[j].Value.ToString(); } } //workbook.SaveAs("D:\\ornek.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, true, Type.Missing, Type.Missing); //workbook.Close(); //excel.Quit(); } |
Yukarıdaki kodları kısaca şu şekilde açıklayabiliriz.
- İlk olarak, Microsoft.Office.Interop.Excel kütüphanesi import edilir.
- Daha sonra, ExportToExcel() adında bir fonksiyon tanımlanır. Bu fonksiyon DataGridView tipinde bir parametre alır.
- İçerisinde, Microsoft.Office.Interop.Excel uygulaması oluşturulur ve görünür hale getirilir.
- Excel dosyası oluşturulur ve ilk sayfasına erişilir.
- DataGridView sütunlarındaki başlıklar, Excel sayfasındaki ilk satıra yazılır.
- Daha sonra, DataGridView verileri, Excel sayfasındaki diğer satırlarına yazılır.
- Son olarak, Excel dosyası belirli bir yere kaydedilir ve çalışma kitabı kapatılır.
- Son olarak, Excel uygulaması sonlandırılır.
Son üç satır kodu yorum satırı olarak görmektesiniz. Bu haliyle programı çalıştırdığınızda excel dosyası açılarakverilerin bu dosyaya aktarıldığını göreceksiniz.
Eğer kodları yorum satırı olmaktan çıkarırsanız bu defa D: sürücüsünde ornek.xlsx isimli bir excel dosyası açılarak aktarılan veriler kaydedilip dosyanın kapatıldığını göreceksiniz.
Adım 5: Şimdi de deneme amaçlı DataGridview içine birkaç veri girelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void Form1_Load(object sender, EventArgs e) { dataGridView1.ColumnCount = 3; dataGridView1.Columns[0].Name = "Ad"; dataGridView1.Columns[1].Name = "Soyad"; dataGridView1.Columns[2].Name = "Telefon"; dataGridView1.Rows.Add(); dataGridView1.Rows[0].Cells[0].Value = "Yazılım"; dataGridView1.Rows[0].Cells[1].Value = "Kodlama"; dataGridView1.Rows[0].Cells[2].Value = "23165135"; dataGridView1.Rows[1].Cells[0].Value = "Tasarım"; dataGridView1.Rows[1].Cells[1].Value = "Kodlama"; dataGridView1.Rows[1].Cells[2].Value = "75251212"; } |
Adım 6: Şimdi bu verilerin Excel dosyasına aktarılması için Button için kodumuzu oluşturalım.
1 2 3 4 5 6 |
private void button1_Click(object sender, EventArgs e) { ExportToExcel(dataGridView1); } |
Ekran Çıktısı:
Kodlarımızın tamamı aşağıdaki gibi olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; namespace DataGrid_Excel { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void ExportToExcel(DataGridView dataGridView) { Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Visible = true; Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value); Microsoft.Office.Interop.Excel.Worksheet sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1]; for (int i = 0; i < dataGridView.Columns.Count; i++) { sheet1.Cells[1, i + 1] = dataGridView.Columns[i].HeaderText; } for (int i = 0; i < dataGridView.Rows.Count; i++) { for (int j = 0; j < dataGridView.Columns.Count; j++) { sheet1.Cells[i + 2, j + 1] = dataGridView.Rows[i].Cells[j].Value.ToString(); } } //workbook.SaveAs("D:\\ornek.xlsx", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, true, Type.Missing, Type.Missing); //workbook.Close(); //excel.Quit(); } private void Form1_Load(object sender, EventArgs e) { dataGridView1.ColumnCount = 3; dataGridView1.Columns[0].Name = "Ad"; dataGridView1.Columns[1].Name = "Soyad"; dataGridView1.Columns[2].Name = "Telefon"; dataGridView1.Rows.Add(); dataGridView1.Rows[0].Cells[0].Value = "Yazılım"; dataGridView1.Rows[0].Cells[1].Value = "Kodlama"; dataGridView1.Rows[0].Cells[2].Value = "23165135"; dataGridView1.Rows[1].Cells[0].Value = "Tasarım"; dataGridView1.Rows[1].Cells[1].Value = "Kodlama"; dataGridView1.Rows[1].Cells[2].Value = "75251212"; } private void button1_Click(object sender, EventArgs e) { ExportToExcel(dataGridView1); } } } |
Yukarıdaki örnek oluşturulduğunda datagridview denetimindeki tüm verilerin Excel dosyasına aktarıldığını görmekteyiz. Eğer DataGridView üzerinde gizlediğimiz alanlar varsa ve bunların aktarılmasını istemiyorsak kodlarımızı aşağıdaki gibi düzenleyebiliriz.
Örneğin Soyadı kısmını DataGridView üzerinde gizleyelim.
1 2 3 |
dataGridView1.Columns[1].Visible = false; |
ve şimdi gizli alanların Excel dosyasına aktarılmaması için metodumuzu aşağıdaki gibi düzenleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
private void ExportToExcel(DataGridView dgv) { Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Visible = true; Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value); Microsoft.Office.Interop.Excel.Worksheet sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1]; int colIndex = 0; foreach (DataGridViewColumn col in dgv.Columns) { if (!col.Visible) continue; colIndex++; excel.Cells[1, colIndex] = col.HeaderText; } int rowIndex = 0; foreach (DataGridViewRow row in dgv.Rows) { rowIndex++; colIndex = 0; foreach (DataGridViewCell cell in row.Cells) { if (!dgv.Columns[cell.ColumnIndex].Visible) continue; colIndex++; excel.Cells[rowIndex + 1, colIndex] = cell.Value; } } Microsoft.Office.Interop.Excel.Range c1 = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[1, 1]; Microsoft.Office.Interop.Excel.Range c2 = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[rowIndex, colIndex]; Microsoft.Office.Interop.Excel.Range range = sheet1.Range[c1, c2]; range.Columns.AutoFit(); } |
Sonuç: