C# ile Excel’e Hükmedin – 2 (Doküman Düzenleme, Veri Çekme, DatagridView’da Gösterme-Düzenleme)

Uzun zamandır yeni yazı paylaşmıyorum. Yaz okulu, 3.sınıfın verdiği zorluklar, staj, proje vs. olunca malesef blog’a ayıracak vakit bulamadım. Kaynak kodu verdiğim için bazı kodları malesef açıklamayacağım. Eğer anlamazsanız yorum yaparak sorabilirsiniz. Daha tamamlamam gereken Android yazısı var. Unuttum zannetmeyin 😀 Daha önceki yazıda yeni excel dokümanı oluşturma, yazma ve kaydetmeye değişmiştik. C# ve Excel ile ilgili olan son yazımda Excel dokümanından satır-sutün girerek combobox’a veri çekme, datagridview’da gösterme ve düzenlemeye ayrıntıya girmeden değineceğim. İlk olarak daha önceki yazıdaki gibi excel dosyasını arkaplanda açacak butonu ekleyelim. Gerisini aşağıdaki gibi yapabilirsiniz.

excel-edit-form

Yükle butonuna daha önce yaptığımız gibi aşağıdaki kodu ekliyoruz.


private void button1_Click(object sender, EventArgs e)
{
DialogResult result = openFileDialog1.ShowDialog();
ExcelUygulama = new Excel.Application();
ExcelProje = ExcelUygulama.Workbooks.Open(openFileDialog1.FileName);
ExcelSayfa = (Excel.Worksheet)ExcelProje.Worksheets.get_Item(1);
ExcelRange = ExcelSayfa.UsedRange;
ExcelSayfa = (Excel.Worksheet)ExcelUygulama.ActiveSheet;

ExcelUygulama.Visible = false;
ExcelUygulama.AlertBeforeOverwriting = false;

label1.Text = openFileDialog1.FileName+" adlı dosya yüklendi.";

rowCnt = ExcelRange.Rows.Count + 1;
columnCnt = ExcelRange.Columns.Count + 1;

Daha sonra numeric up-downları kullanarak girdiğimiz satır-sütundaki veri veya verileri combobox’a yükleyeceğiz.(checkbox’lar sayesinde satır-sutün seçimlerini ayrı ayrı aktif ediyoruz. Eğer etmezsek seçilen diğer özellikteki tüm verileri combobox’a ekleyecektir.)  Ardından combobox’ta seçtiğimiz verinin textbox’a yeni değerini yazarak ve butona basarak değerini değiştireceğiz. Şimdilik bu kısmı yapalım. Daha sonra bunlardan ayrı bir şekilde çalışan datagridview’e tüm tabloyu çekip, üzerinde işlem yapıp kaydedeceğiz. Aslında ilk önce datayı datagridview’e yükleyip oradan okusak bizim için daha kolay olurdu. Ancak burada amaç nasıl yapıldığını göstermek olduğu için ilk önce datagridview kullanmadan veri çekeceğiz.


private void button5_Click(object sender, EventArgs e)
{
if (checkBox1.Checked == true && checkBox2.Checked == true)
{
object hucre = ExcelSayfa.Cells[numericUpDown1.Value, numericUpDown2.Value];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
if (bolge.Value2 != null)
{
string veri = bolge.Value2.ToString();
comboBox1.Items.Clear();
comboBox1.Items.Add(veri);
comboBox1.SelectedIndex = 0;
}
else
{
MessageBox.Show("Bos bir alan sectiniz.");
}
}
else if (checkBox1.Checked == true && checkBox2.Checked == false)
{
comboBox1.Items.Clear();
for (int i = 1; i < columnCnt; i++)
{
object hucre = ExcelSayfa.Cells[numericUpDown1.Value, i];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
if (bolge.Value2 != null)
{
string veri = bolge.Value2.ToString();
comboBox1.Items.Add(veri);
comboBox1.SelectedIndex = 0;
}
else
{
MessageBox.Show("Bos bir alan sectiniz.");
}
}
}
else if (checkBox1.Checked == false && checkBox2.Checked == true)
{
comboBox1.Items.Clear();
for (int i = 1; i < rowCnt; i++)
{
object hucre = ExcelSayfa.Cells[i, numericUpDown2.Value];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
if (bolge.Value2 != null)
{
string veri = bolge.Value2.ToString();
comboBox1.Items.Add(veri);
comboBox1.SelectedIndex = 0;
}
else
{
MessageBox.Show("Bos bir alan sectiniz.");
}
}
}
else if (checkBox1.Checked == false && checkBox2.Checked == false)
{
comboBox1.Items.Clear();
for (int i = 1; i < rowCnt; i++)
{
for (int a = 1; a < columnCnt; a++)
{
object hucre = ExcelSayfa.Cells[i, a];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
if (bolge.Value2 != null)
{
string veri = bolge.Value2.ToString();
comboBox1.Items.Add(veri);
comboBox1.SelectedIndex = 0;
}
else
{
MessageBox.Show("Bos bir alan sectiniz.");
}
}
}
}
}

Yukarıdaki kod yenile butonuna aittir. Veriyi çekip combobox’a yazmakla görevlidir. Burada tabloda ortalarda biryerde boş bir hücre olması durumunda program doğru çalışmayacaktır. Bunun sebebi combobox’a verileri sırayla kaydetmesi ve benim düzenle butonu kullanırken o sıraya göre kayıt yapmamdır. Bunu aşmak için boşlukları da combobox’a ekleyebilirsiniz. Mesela aşağıdaki gibi;


if (bolge.Value2 != null)
{
string veri = bolge.Value2.ToString();
comboBox1.Items.Add(veri);
comboBox1.SelectedIndex = 0;
}
else
{

<strong>comboBox1.Items.Add("");</strong>
MessageBox.Show("Bos bir alan sectiniz.");
}

Şimdi aldığımız veriyi textbox ile düzenleyip kayıt edelim.


private void button2_Click(object sender, EventArgs e)
{
if (checkBox1.Checked == true && checkBox2.Checked == true)
{
object hucre = ExcelSayfa.Cells[numericUpDown1.Value, numericUpDown2.Value];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
bolge.Value2 = textBox1.Text;
yenile(0);
}
else if (checkBox1.Checked == false && checkBox2.Checked == true)
{
object hucre = ExcelSayfa.Cells[comboBox1.SelectedIndex + 1, numericUpDown2.Value];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
bolge.Value2 = textBox1.Text;
yenile(comboBox1.SelectedIndex);
}
else if (checkBox1.Checked == true && checkBox2.Checked == false)
{
object hucre = ExcelSayfa.Cells[numericUpDown1.Value, comboBox1.SelectedIndex + 1];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
bolge.Value2 = textBox1.Text;
yenile(comboBox1.SelectedIndex);
}

try
{
ExcelProje.Save();
}
catch (Exception)
{

MessageBox.Show("Düzenleme Yapılan Dosyanın Kapalı Olduğundan Emin Olunuz...");
}
}

Artık istediğimiz satır-sütundaki hücreden veri alıp değiştirebiliyoruz. Sıra datagridview’ı kullanmakta;


private void button3_Click(object sender, EventArgs e)
{
String sdbconnection = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + openFileDialog1.FileName + "; Extended Properties='Excel 12.0; TypeGuessRows=0; HDR=YES; IMEX=1'";
OleDbConnection dbconnection = new OleDbConnection(sdbconnection);
dbconnection.Open();
OleDbDataAdapter dbadapter = new OleDbDataAdapter("Select * from [Sayfa1$]", dbconnection);
DataTable dtable = new DataTable();
dbadapter.Fill(dtable);
dataGridView1.DataSource = dtable;
}

Excel’den datagridview’e veri aktarımı yukarıdaki gibi yapılıyor. Datagridview’de değiştirdiğimiz hücre değerini excel’e yansıtmak için ise aşağıdaki kodu kullanmanız gerekiyor.


private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
object hucre = ExcelSayfa.Cells[dataGridView1.CurrentCell.RowIndex + 2, dataGridView1.CurrentCell.ColumnIndex + 1];
Excel.Range bolge = ExcelSayfa.get_Range(hucre, hucre);
bolge.Value2 = dataGridView1.CurrentCell.Value;
}

Tüm yapmak istediklerimizi yaptık. Bu yazıyla beraber “C# ile Excel’e Hükmedin” yazıları sona ermiştir. Farklı uygulama alanlarında C# üzerine yazılarıma devam edeceğim. Ancak Excel için bu iki yazının yeterli olduğunu düşünüyorum.  Bir sonraki yazımda görüşmek üzere…

Projeyi buradan indirebilirsiniz. (Bu dosyaki proje yazıdaki kodlardan daha günceldir.)

16728 Total Views 1 Views Today

Yorumu formunu geç

  1. iyi çalışmalar benm aradığım şu elimdeki bi exceldosyasına veri kaydetme eğer orda veri varsa guncelleme
    örn: elimde personel.xlsx diye bi exele var bunun a12 h5 gibi hücrelerine veri girmek ve ya bu verilerin üzerine yazmak istiyorum nasl yapabilirim tekeküler

    1. Zaten yazıda istediğiniz şey yapılıyor. Birkaç değişiklik ve ekleme yapacaksınız.

  2. ohhhhh yaptımmm
    mrk eden arkadaşlar varsa buyrun kodları

    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    excel.Visible = true;//bu kod excel uygullmasını kullanıcıya gosteriyor.
    Microsoft.Office.Interop.Excel.Workbook kitap = excel.Workbooks.Open(“C:/Users/kullanici/Documents/visual studio 2010/Projects/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/personel.xlsx”);

    Microsoft.Office.Interop.Excel.Worksheet ANASAYFAS = (Microsoft.Office.Interop.Excel.Worksheet)kitap.Worksheets.get_Item(1);

    Microsoft.Office.Interop.Excel.Range range;
    range = ANASAYFAS.get_Range(“A10”, System.Reflection.Missing.Value);
    range.set_Value(System.Reflection.Missing.Value, textBox1.Text);

    • Mustafa on 16 Kasım 2015 at 18:32
    • Cevapla

    Excelde veri sekmesindeki “Bağlantıyı yenile” butonuna c# form üzerinden nasıl tıklayabilirm?

    • Metin on 09 Mayıs 2017 at 18:33
    • Cevapla

    Merhaba hocam; anlatımınız için teşekkürler.
    Benim excel tablomdaki sutun isimleri tek satırda degil.Acaba farklı satır ve sutunların altındaki verileri duzgun bir sekilde nasıl cekebilirim.Bunları daha sonra sql aktarmak istiyorum.

    excel tabloma ait ornek resim
    https://ibb.co/b9YnGQ

    • Emrah İpekyol on 31 Ağustos 2017 at 12:47
    • Cevapla

    73.500 kayıtı çok hızlı bir şekilde içeri aktardı. Teşekkürler.

    • mutlu on 14 Kasım 2017 at 10:38
    • Cevapla

    hocam birleştirilmiş satırlar varsa datagride düzgün bir şekilde çekemiyor kaymalar oluyor bunu nasıl çözebilirim yardımcı olursanız sevinirim

    • esin on 18 Aralık 2017 at 10:24
    • Cevapla

    word’den excel’e veri aktarımı?
    :[:(
    lütfen yardımcı olun kodumda her ikisinide açıyor ama aktarmayı bir türlü yapamadım

Bir cevap yazın

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.