Listviewdeki veriyi excel e aktarma

Database veya herhangi bir veri kaynağından listview e aktardığınız verileri Listview den Excel’e veri aktarıp Excel dosyasında kayıt edebilirsiniz. Daha çok raporlama projelerinde Excel ile ilişkilendirerek kullanabileceğiniz bu uygulamayı nasıl yaparız basit bir örnek ile öğrenelim.

listview-excel-aktar

Resimdeki gibi boş bir forma listview kontrolü ve bir buton ekleyerek kod tarafına geçebiliriz. Buradaki örnekte listview i daha önceden bir şekilde doldurmuştum, konumuz aktarım olduğu için listview veri girilmesi gibi konulara girip de kod kısmını karıştırmamak istiyorum. Burada amacımız listviewdeki veriyi Excel dosyasına aktarmak.

csharp-excel-veri-aktarimi

Kod kısmına geçmeden projeye Microsoft Excel 15 Object Library referans olarak eklemeniz gerekir. Bunu Referance Manager içindeki COM kütüphanesi içinde bulabilirsiniz. Bu referansı eklemeden Excel dosyası oluşturma kodları hata verir. Ayrıca using Microsoft.Office.Interop.Excel; de kod tarafında using tarafında eklemeniz gerekir.

Gerekli ayarlamaları yaptıktan sonra kodlamaya artık geçebiliriz.

private void btnExcel_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(1);
Microsoft.Office.Interop.Excel.Worksheet ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
//Kolon başlıkları sabit olduğu için listviewdeki veri aktarılmadan önce sabit verileri excel e giriyoruz.
object hucre;
Range rr;
string str;

hucre = ws.Cells[1, 1];
rr = ws.get_Range(hucre, hucre);
str = "İD";
rr.Value2 = str;
rr.Font.Bold = true;
rr.Font.Size = 12;

hucre = ws.Cells[1, 2];
rr = ws.get_Range(hucre, hucre);
str = "Adı";
rr.Value2 = str;
rr.Font.Bold = true;
rr.Font.Size = 12;

hucre = ws.Cells[1, 3];
rr = ws.get_Range(hucre, hucre);
str = "Soyadı";
rr.Value2 = str;
rr.Font.Bold = true;
rr.Font.Size = 12;
//toplam üç kolon girdik. Stilini değiştirdik.

int dikey = 2;
int yatay = 2;
foreach (ListViewItem lvi in listView1.Items)
{

dikey = 1;
foreach (ListViewItem.ListViewSubItem lvs in lvi.SubItems)
{
ws.Cells[yatay, dikey] = lvs.Text;
dikey++;
//Excel kolon genişliğini buradan aayarlıyoruz.
ws.Columns.ColumnWidth = 12;
}
yatay++;
}
}

Gerekli kod açıklamaları kod içinde mevcut. Fakat birkaç şey söylemeden yazımı sonlandırmak istemiyorum. Burada kod içinde Excel dosyasını oluşturduktan sonra ilk önce kolon başlıklarını girmemiz gerekiyor. Bunları girmezsek kolon başlıkları haliyle excel e aktarılmaz. Foreach döngülerini kullanarak Excel dosyamıza yazdırdık.

ws.Columns.ColumnWidth döngü içine eklememizin sebebi, normalde Excel’in standart kolon genişliğine göre yazdıracak kolon içindeki uzun veriler Excel içinde genişletmeden gözükmeyecektir. Yada ws.Columns.AutoFit(); ile kolon içindeki verinin genişliğine göre otomatik Excel kolonunu genişletebilirsiniz.

Yaptığımız örneğin kodlarını buradan indirebilirsiniz.

Listview içinde toplama işlemi

Listview’i çok severiz vesselam. Hele ki veri giriş-çıkış, gösterme işlemlerinde vazgeçilmezlerimiz arasındadır. Görüntüde listview sadece basit bir kontrol gibi gözükür. Ama birçok işimizi listview yardımı ile hallede bilmekteyiz. Bu kontrolü daha fazla sakız yapmadan başlıkta belirttiğim meseleye gelelim.

Mevzumuz şu; herhangi bir yerden listviewe girilen aynı isimdeki değerleri farklı satıra yazdırmadan mevcut satır üzerine yazdırmak. Örnekle açıklayacak olursak, stok takip programında listview üzerinden stoklarını tuttuğumuz ürünler için, aynı üründen eklediğimizde o ürünün sadece miktarını, adetini veya fiyatının üzerine ekleyerek yazdırmak. Bir nevi aynı isimdeki şeylerin rakamsal değerlerini toplayarak tek satırda birleştirmek.

Senaryo veya örnek aklınızda biraz canlandı ise ufak bir örnek ile pekiştirebiliriz. Resimde görüldüğü gibi 2 textbox bir buton ve birde baş rolümüz olan listview kontrolünü forma sürükleyin. Textbox’un biri eklenenin adı, diğerinde ise eklenenin miktarı girişi yapılmakta. Kendi kendinize ben hazırım diyorsanız butona çift tıklayıp kodlamaya geçe biliriz.

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
private void button1_Click(object sender, EventArgs e)
        {
            string adi = txtadi.Text;
            int miktar = int.Parse(txtmiktar.Text);


            bool varmi=false;

            foreach (ListViewItem item in listView1.Items)
            {
                if (item.Text == adi)
                {
                    varmi = true;
                }
            }

            if (varmi)
            {
                foreach (ListViewItem i in listView1.Items)
                {
                    if (i.Text == adi)
                    {
                        int icindeki = int.Parse(i.SubItems[1].Text);
                        icindeki += miktar;
                        i.SubItems[1].Text = Convert.ToString(icindeki);
                    }
                }
            }
            else
            {
                ListViewItem lv = new ListViewItem();
                lv.Text = adi.ToString();
                lv.SubItems.Add(miktar.ToString());
                listView1.Items.Add(lv);
            }

        }

Görüldüğü üzere ilk olarak textbox ları doğru bir şekilde değişkenlere atadık. Ardından programın kilit kodu olan bool tipli değişkeni false olarak tanımladık. Bunu yaptıktan sonra foreach ile girilmek istenenin adını listView1 kontrolünün içinde arattık. Eğer içinde varsa önceden false olarak tanımladığımız varmi değişkenine true değerini atadık.

Akabinde bu atanan true değeri ile if-else kullanarak tekrar listView1 içinde aynı isimdeki girdinin miktarı üzerine girilen miktarı topladık. Eğer daha önce aynı isimde girdi girilmemiş ise listView1’e yeni satır isim ve miktarı ile ekledik…

Form içinde alt form açmak

Bazen birden fazla form ile çalışmak isteye biliriz. Böyle durumlarda düz mantıkla projemizde çalışacağımız kadar form oluştururuz. Bunu birkaç form ile halledebiliriz. Ancak iş kullanıcının istediği doğrultusunda açılması gerek form olduğunda yapışıp kalabiliriz. Bunu önlemek için yardımımıza MDI formlar koşuyor.

MDI form mantığını Excel için örnek verebiliriz. Biliyorsunuz ki Excel içinde birden fazla excel dosyası açıp çalışabilmek deyiz. Adobe Photoshop programını da örnek göstere biliriz. İki ayrı resim ile çalışıldığında Photoshop içinde iki ayrı çalışma sayfası açılır onları istediğimiz yere Photoshop içinde hareket ettirebiliyoruz.

Örnekleri ve hikayeyi fazla uzatmadan MDI, form içinde form açma uygulamasına geçelim. Öncelikle bir tane ana form oluşturalım. Bunun için formun IsMdiContainer özelliğini True olarak ayarlayın.(Resimdeki gibi form arkaplan gri renkte olacak)

Form içinde alt form açmak için anaforma bir adet menü oluşturmamız gerekecek. Toolbox daki MenuStrip kontrolünü sürükleyip bırakarak oluşturabiliriz. Menü otomatik en üste çıkacak, özellikler bölümünden konumunu ayarlaya bilirsiniz. Üzerine tıklayarak menü isimlerini basit bir şekilde oluşturun.

Örneğe uygun olarak resimdeki gibi oluşturabilirsiniz. Ardından açılacak olan alt form için yeni windows form ekleyin. Formun IsMdiContainer özelliğini False olarak bırakıp, Name özelliğini altform olarak yazarsanız örneğimizdeki kodları daha iyi anlayabilirsiniz.

Çalışır vaziyetteki örneğimiz

Bunları yaptıktan sonra kod kısmına geçebiliriz. İlk önce yeni alt form oluşturmak için Yeni Form Aç menümüze çift tıklayıp Click olayına alttaki kodları yazalım.

1
2
3
4
5
6
7
8
9
10
11
12
int formsayim = 1;  // formsayim değişkenini global olarak tanımlayın !

 int formno= formsayim++;

            altform cocuk = new altform();

            cocuk.Name = "cocukform" + formno.ToString();
            cocuk.Text= "Yeni Alt Form " + formno.ToString();

            cocuk.MdiParent = this;

            cocuk.Show();

Açılan her yeni form için form numarasını 1 arttırarak yeni çocuk formun name özelliğine atadık. Sırası ile kapat menüsüne çift tıklayıp Clik olayına alttaki kodları yazalım

1
2
3
4
5
 if (this.ActiveMdiChild != null)
            {
                Form frm = ActiveMdiChild;
                frm.Close();
            }

Buradaki kod açılı form varsa en onu kapatır. Son olarak hepsini kapat menüsüne de çift tıklayıp Clik olayına alttaki kodları yazalım.

1
2
3
4
foreach (Form frm in this.MdiChildren)
            {
                frm.Close();
            }

foreach döngüsü ile form içindeki tüm çocuk formları kapatır.

Girilen ifadeyi tersten yazdırma

tersten-yazdirma

Bu örnekte girilen bir sayı veya kelimeyi tersten yazdırmayı öğrenelim. Kullanacağımız ürünler; foreach döngüsü ve girilen kelimeyi küçük harfe dönüştürmek için ToLower metodu.

Resimde gördüğünüz gibi bir form ekranı oluşturup, button1_Click kısmına;

 

1
2
3
4
5
6
7
8
9
string kelime = textBox1.Text;
string terskelime = "";
foreach (char harf in kelime)
{
terskelime = harf.ToString() + terskelime;
}
terskelime = terskelime.ToLower();

label1.Text = terskelime;