Zamanlı bilgisayar işlem programı

Her junior yazılımcının karşılaşacağı ödev babında program ile merhaba. BEnzer konu her ne kadar paylaşılmışsa da alternatif olarak paylaşmak istedim.

otomatik-bilsiyara-kapatma-programi

Aşağıdaki bağlantıdan indirebileceğiniz zamanlı bilgisayar işlem programı ile bilgisayarı belirlediğiniz zaman kapatıp veya yeniden başlatabilirsiniz. Yada resimdeki gibi bir form ekranı tasarlayarak alttaki kodlar yardımı ile yapabilirsiniz.

Form tasarlarken kullandığım kontroller; birkaç label, buton, maskedtextbox(zamanı saat ve dakika formatın da girebilmek için), datetimepicker, radiobuton, timer ve notifyicon. Yaptığım işlemleri kod tarafına geçmeden adım adım anlatırsam konuyu daha verimli aktaracağımı düşünüyorum;

  • Anlık zamanı gösterebilmek için timer kontrolünün tick olayına bir label a anlık saati gösterdik. Timer ın Interval değerini 1000 yaparak saniyede bir anlık saati label da otomatik gösterdik.
  • Zamanlayıcı çalıştırmak için ilgili buton yardımı ile maskedtextbox ve datetimepicker seçilen değeri metod yardımı ile datetime tipli değişkene atadık. Zamanlayıcı çalıştırmak için eklenen timer ı aktif ettik.
  • Aktif edilen zamanlayıcı timer ı her saniyede bir şimdiki zaman(saat) ile ayarlanan saati karşılaştırdık.
  • Ayarlanan zaman ile şimdiki zaman eşit ise radiobuton da seçilen işlemi yapmasını istedik.
  • NotifyIcon kontrolü ile programı yani formu gizlediğimiz de sağ alt köşede mesaj iletisi vermesi için ayarladık.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
 private void tmrSimdikiZaman_Tick(object sender, EventArgs e)
        {
            lblSimdikiSaat.Text = DateTime.Now.ToLongTimeString();
        }
       
        DateTime alarmZamani;
        DateTime ayarZamani;
        private void btnKur_Click(object sender, EventArgs e)
        {
            if (txtSaat.Text == "")
            {
                MessageBox.Show("Girilen değerleri kontrol et \n Alanlardan herhangi birini boş bırakma !");
                return;
            }
            else
            {

                alarmayar(dateTimePicker1.Value.Date);
            }
        }

        private void alarmayar(DateTime zaman)
        {

            alarmZamani = zaman;
            alarmZamani = alarmZamani.AddHours(Convert.ToInt32(txtSaat.Text.Substring(0, 2)));
            alarmZamani = alarmZamani.AddMinutes(Convert.ToInt32(txtSaat.Text.Substring(3, 2)));


            if (DateTime.Now >= alarmZamani)
            {
                MessageBox.Show("Geçmiş zamana alarm kuramazsınız !!!");
                return;
            }
            else
            {

                tmrAlarmZamani.Enabled = true;
                btnKur.Enabled = false;
                if (rbKapat.Checked == true)
                {
                    lblMesaj.Text = "Bilgisayar " + txtSaat.Text +  " zamanına kapatılması için ayarlandı.";
                }
                else if (rbYeniden.Checked == true)
                {
                     lblMesaj.Text = "Bilgisayar " + txtSaat.Text + " zamanına yeniden başlatılması için ayarlandı.";
                }
                else
                {
                    lblMesaj.Text = txtSaat.Text +  " için herhangi bir görev ayarlanmamış";
                }
            }
        }

        private void tmrAlarmZamani_Tick(object sender, EventArgs e)
        {
            ayarZamani = DateTime.Now;

            if (ayarZamani.ToString() == alarmZamani.ToString())
            {
                tmrAlarmZamani.Enabled = false;

                if (rbKapat.Checked)
                {
                    notifyIcon1.BalloonTipText = "Bilgisayarınız kapatılıyor...";
                    notifyIcon1.ShowBalloonTip(3);
                    System.Diagnostics.Process.Start("shutdown", "-s -f -t 0");
                }
                else if (rbYeniden.Checked)
                {
                    notifyIcon1.BalloonTipText = "Bilgisayarınız yeniden başlatılıyor...";
                    notifyIcon1.ShowBalloonTip(3);
                    System.Diagnostics.Process.Start("shutdown", "-r -f -t 0");
                }
                else
                {
                    lblMesaj.Text = "Zaman Geldi";
                    notifyIcon1.BalloonTipText = "Zaman Geldi";
                    notifyIcon1.ShowBalloonTip(5);
                }

            }
        }

        private void btnIptal_Click(object sender, EventArgs e)
        {
            tmrAlarmZamani.Enabled = false;
            btnKur.Enabled = true;
            rbYeniden.Checked = false;
            rbKapat.Checked = false;
            lblMesaj.Text = "Herhangi bir görevi yok !";
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (FormWindowState.Minimized == WindowState)
            {
                Hide();
                notifyIcon1.BalloonTipText = lblMesaj.Text;
                notifyIcon1.ShowBalloonTip(5);
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (tmrAlarmZamani.Enabled == true)
            {
                if (MessageBox.Show("Zamanlandırlmış bir görev olduğu için uygulama kapatılamıyor. \nUygulamayı ve görevi kapatmakta karalımısınız ?", "Uyarı !", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    Application.Exit();
                }
             
            }
        }

       

        private void notifyIcon1_Click(object sender, EventArgs e)
        {
            this.Show();
            WindowState = FormWindowState.Normal;
        }

Listview eleman ekleme sıralı silme

Listview’i sevenler derneği açılsa üye olan ilk insan ben olurum herhalde. Bir kontrol bu kadar sevilmez… Neyse konuya dönelim, database den listview çekilen onlarca veri içinde listview üzerinden silme işlemi yaptığınızda db den verinin silindiğini gösterebilmek için listview i bir şekilde yenileriz.

Listview üzerin herhangi bir elemanı sildikten sonra focus alanı listview listesinin en başındaki elemana focuslanır. Örnek verecek olursak, e-posta adresimizdeki 30. sıradaki bir maili sildiğimizde otomatik olarak bir sonraki mail işaretlenir yani focus olur. Ancak bu olay listview de müdahele etmeden yapılamıyor.

listview-eleman-ekleme-silme

Mevzuyu anlatabildiysem listview e eleman nasıl eklenir, nasıl silinir, silinen elemandan sırasına göre elemana nasıl focus edilir görelim. Resimdeki gibi bir form ekranı düzenleyip listview e eleman ekleme kodu ile başlayalım.

Listview e eleman eklemek için;

1
2
3
4
5
6
7
 private void btnEkle_Click(object sender, EventArgs e)
        {
            ListViewItem lv = new ListViewItem();
            lv.Text = txtAdi.Text;
            lv.SubItems.Add(txtSoyadi.Text);
            listView1.Items.Add(lv);
        }

Listviewden sıralı eleman silmek için;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 private void btnSil_Click(object sender, EventArgs e)
        {
            int secilenEleman = 0;
            if (listView1.Items.Count > 0)
            {
                secilenEleman = listView1.SelectedItems[0].Index;
            }

            listView1.SelectedItems[0].Remove();

            listView1.Focus();
            listView1.Items[secilenEleman].Selected = true;

        }

Hali hazırda örneği indirmek için alttaki bağlantıyı kullanabilirsiniz.

Dinamik kontrol oluşturma ve sürükle bırak

Dinamik oluşturulan kontrolü çalışma zamanında kontrol etmek de diyebiliriz. Masaüstü form uygulamalarımızda bazen kullanıcılarımızdan çalışma anında kontrol oluşturmasını isteye bilir, bu oluşturulan dinamik kontrolü sürükle bırak yöntemi ile istediği yere konumlandırmak isteye biliriz. Hata oluşturduğu bu kontrolün özelliklerini(text, name) kullandırabiliriz.

dinamik-kontrol-surukle-birak

Şekildeki gibi bir form ekranı hazırladıktan sonra olayı ele alalım.(Beyaz panel içindeki butonları oluşturmayın!) Burada yapılan işlem şu şekilde cereyan etmekte; sol taraftaki butonu panel içine sürükleyip bırakıyoruz. Bırakıldıktan sonra panel içine yeni bir buton oluşturuluyor. Çalışma anında oluşturulan bu butonu panel içinde istediğimiz yere konumlandırabilir, tıkladığımızda butonun özelliklerini alabiliriz. Mevzumuz bu dostlar…

Kod kısmına geçmeden önce şimdiden söyleyeyim, kod kısmı biraz karışık gözükebilir. Örneği metotları ile birlikte teker teker yazdığınızda mevzunun o kadar zor olmadığını anlayacaksınız. Butonun; MouseDown, MouseLeave, MouseMove özelliklerine gelerek butona sürükle bırak özelliği veriyoruz. Çalışma zamanında oluşturulacak buton için gerekli metotları ekliyoruz.

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
76
77
78
79
80
81
82
83
bool tasimaBasladi;
        int x;
        int y;
        protected void dinamikMetod(object sender, EventArgs e)
        {
            Button dinamikButon = (sender as Button);
            MessageBox.Show("Tıkdığın buton adı " + dinamikButon.Text);

        }
        protected void dinamikBasla(object sender, MouseEventArgs e)
        {
            tasimaBasladi = true;
        }
        protected void dinamikDur(object sender, EventArgs e)
        {
            tasimaBasladi = false;
        }
        protected void dinamikTasi(object sender, MouseEventArgs e)
        {
            Button dinamikButon = (sender as Button);
            if (tasimaBasladi == true && e.Button == MouseButtons.Left)
            {
                dinamikButon.Left += e.X - dinamikButon.Width / 2;
                dinamikButon.Top += e.Y - dinamikButon.Height / 2;
            }

            lblx.Text = Convert.ToString(dinamikButon.Location.X);
            lbly.Text = Convert.ToString(dinamikButon.Location.Y);
        }


        private void btnTasinan_MouseDown(object sender, MouseEventArgs e)
        {
            tasimaBasladi = true;
        }

        private void btnTasinan_MouseLeave(object sender, EventArgs e)
        {
            tasimaBasladi = false;
            int i = 0;
            foreach (Control ktn in panel1.Controls)
            {
                if (ktn is Button)
                {
                    i = i + 1;
                }
            }

            Button btn = new Button();
            btn.Name = i.ToString();

            btn.AutoSize = false;

            btn.Size = new Size(80, 30);
            btn.Text = "Buton " + i.ToString();
            btn.Font = new Font(btn.Font.FontFamily.Name, 8);
            btn.Location = new Point(x, y);
            panel1.Controls.Add(btn);
            btnTasinan.Location = new Point(x: 12, y: 125);
            btn.Click += new EventHandler(dinamikMetod);

            btn.MouseDown += new MouseEventHandler(dinamikBasla);

            btn.MouseLeave += new EventHandler(dinamikDur);

            btn.MouseMove += new MouseEventHandler(dinamikTasi);


        }

        private void btnTasinan_MouseMove(object sender, MouseEventArgs e)
        {
            if (tasimaBasladi == true && e.Button == MouseButtons.Left)
            {
                btnTasinan.Left += e.X - btnTasinan.Width / 2;
                btnTasinan.Top += e.Y - btnTasinan.Height / 2;
            }
            lblx.Text = Convert.ToString(btnTasinan.Location.X);
            lbly.Text = Convert.ToString(btnTasinan.Location.Y);

            x = btnTasinan.Location.X;
            y = btnTasinan.Location.Y;
        }

Windows formda internet bağlantısı kontrolü

C# veya VB.Net de masaüstü uygulamalarında kullanıcının internet bağlantısı kontrol etmenin en kolay yolu internetin daimi olan siteye(google.com) ping atarak kontrol etmek. İnternet bağlantısını bir çok yöntem ile kontrol edebiliriz. En basit, en kolayı google.com ip adresine ping atmak.

internet-baglanti-kontrol

Bir form ekranına buton ekleyerek butonun clik olayına gelerek kodlamaya başlayabiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
 private void button1_Click(object sender, EventArgs e)
        {
            Ping ping = new Ping();
            PingReply pingStatus = ping.Send(IPAddress.Parse("208.69.34.231"));
            if (pingStatus.Status == IPStatus.Success)
            {
                MessageBox.Show("Internet Var");
            }
            else
            {
                MessageBox.Show("Internet Yok");
            }
        }

Ping ve IPAddress sınıflarını kullanabilmek için projeye eklememiz gerekenler;

1
2
using System.Net;
using System.Net.NetworkInformation;

Dll kullanarak barkod oluşturmak

Daha önceki yazımda(Barkod oluşturma programı yapımı) hatırlayacak olursanız, metin fontu yardımı ile windows form arayüzünde label kontrolünün font özelliği kullanarak iyi, kötü barkod oluşturabildik. Biraz basit yöntemle olduğu için, ihtiyacı karşılayamamakta. Daha önceki yazının güncellemesi niteliğindeki bu yazımda metin fontu değilde hali hazırda var olan barkod oluşturma kütüphanesini(dll) kullanarak basit bir şekilde formda oluşturalım.

barkod-olusturma-programi

Örneğe başlamadan önce indirmeniz gereken dll dosyasını yapılan örnek ile birlikte alttaki buton yardımı ile indirebilirsiniz.

Like or Tweet this page to reveal the content.

Barkod dll indirdikten sonra resimdeki gibi basit bir form tasarlayalım. Formda görldüğü gibi textboxlar(uzunluk, genişlik, barkodun değeri), barkod tip isimlerinin görüleceği combobox, buton ve barkodun oluşturulacağı picturebox. Bunları ekledikten sonra kod kısmına geçmeden referans olarak indirilen dll dosyasını örneğe ekleyin(Projeye sağ tuş Add Reference seçip browser kısmında dll ekleyebilirsiniz).

Gerekli dosya ve görünümü bitirdikten sonra buton clik olayına gelerek kod kısmına geçebiliriz.

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 private void button1_Click(object sender, EventArgs e)
{
BarcodeLib.Barcode b = new BarcodeLib.Barcode();

int genislik = Convert.ToInt32(txtGenislik.Text);
int yukseklik = Convert.ToInt32(txtYukseklik.Text);
b.Alignment = BarcodeLib.AlignmentPositions.CENTER;

BarcodeLib.TYPE type = BarcodeLib.TYPE.UNSPECIFIED;
switch (cbBarkod.SelectedItem.ToString())
{
case "UPC-A":
type = BarcodeLib.TYPE.UPCA;
break;

case "UPC-E":
type = BarcodeLib.TYPE.UPCE;
break;

case "UPC 2 Digit Ext.":
type = BarcodeLib.TYPE.UPC_SUPPLEMENTAL_2DIGIT;

break;
case "UPC 5 Digit Ext.":
type = BarcodeLib.TYPE.UPC_SUPPLEMENTAL_5DIGIT;

break;
case "EAN-13":
type = BarcodeLib.TYPE.EAN13;

break;
case "JAN-13":
type = BarcodeLib.TYPE.JAN13;

break;
case "EAN-8":
type = BarcodeLib.TYPE.EAN8;

break;
case "ITF-14":
type = BarcodeLib.TYPE.ITF14;

break;
case "Codabar":
type = BarcodeLib.TYPE.Codabar;

break;
case "PostNet":
type = BarcodeLib.TYPE.PostNet;

break;
case "Bookland/ISBN":
type = BarcodeLib.TYPE.BOOKLAND;

break;
case "Code 11":
type = BarcodeLib.TYPE.CODE11;

break;
case "Code 39":
type = BarcodeLib.TYPE.CODE39;

break;
case "Code 39 Extended":
type = BarcodeLib.TYPE.CODE39Extended;

break;
case "Code 93":
type = BarcodeLib.TYPE.CODE93;

break;
case "LOGMARS":
type = BarcodeLib.TYPE.LOGMARS;

break;
case "MSI":
type = BarcodeLib.TYPE.MSI_Mod10;

break;
case "Interleaved 2 of 5":
type = BarcodeLib.TYPE.Interleaved2of5;

break;
case "Standard 2 of 5":
type = BarcodeLib.TYPE.Standard2of5;

break;
case "Code 128":
type = BarcodeLib.TYPE.CODE128;

break;
case "Code 128-A":
type = BarcodeLib.TYPE.CODE128A;

break;
case "Code 128-B":
type = BarcodeLib.TYPE.CODE128B;

break;
case "Code 128-C":
type = BarcodeLib.TYPE.CODE128C;

break;
case "Telepen":
type = BarcodeLib.TYPE.TELEPEN;

break;
case "FIM":
type = BarcodeLib.TYPE.FIM;

break;
default:
MessageBox.Show("Barkod türü belirtin !");
break;
}
try
{
if (type != BarcodeLib.TYPE.UNSPECIFIED)
{
pbBarkod.Image = b.Encode(type, txtMetin.Text, genislik, yukseklik);
}

pbBarkod.Width = pbBarkod.Image.Width;
pbBarkod.Height = pbBarkod.Image.Height;

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}

Combobox içine kütüphanede bulunan barkod tip isimlerini eklemeyi unutmayın. Switch-case ile combobox içindeki text e göre işlem yapacağı için isimleri ekteki örnekten faydalanarak veya istediğiniz barkod adını yazarak çalıştırabilirsiniz.

Bir çok yerde bulamayacağınız Ean 13 gibi barkod tiplerini buradaki kütüphane yardımı ücretsiz bir şekilde faydalana bilirsiniz.

Mac adresini öğrenme

C# veya VB.net projelerimizden kullanmak için bilgisayarınızın mac adresini öğrenmek isteyebiliriz. Örneğin lisanslama, tekil kullanım vs. ihtiyaçlar için mac adresi ile işlemler yapmak isteyebiliriz. Hikayeyi fazla uzatmadan bilgisayarın mac adresini nasıl öğreniriz, basit bir uygulama ile öğrenelim.

mac-adres-ogrenme

Resimdeki gibi form ekranına bir buton ekleyip kod kısmına geçebiliriz. Mac adresini bulabilmek için Management nesnesine ihtiyacımız olacak. Projemize eklemek için projeye sağ tuş tıklayıp Add Referance e tıklayıp System.Management resimdeki gibi ekleyin.

mac-adresi-system-managament

Referansı ekledikten sonra kod kısmında using System.Management; ekleyin. Bunları yaptıktan sonra bilgisayarın mac adresini mesaj olarak alabilmek için butonun clik olayına tıklayarak kod kısmında devam edebiliriz.

C#

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(MAC());
}

private string MAC()
{
ManagementClass manager = new ManagementClass("Win32_NetworkAdapterConfiguration");
foreach (ManagementObject obj in manager.GetInstances())
{
if ((bool)obj["IPEnabled"])
{
return obj["MacAddress"].ToString();
}
}
return String.Empty;
}

Mac adresini gösterebilmek MessageBox içerisine MAC metodundan dönen sonucu gösterdik. İşlem bu kadar.

VB.net

Private Sub button1_Click(sender As Object, e As EventArgs)
    MessageBox.Show(MAC())
End Sub

Private Function MAC() As String
    Dim manager As New ManagementClass("Win32_NetworkAdapterConfiguration")
    For Each obj As ManagementObject In manager.GetInstances()
        If CBool(obj("IPEnabled")) Then
            Return obj("MacAddress").ToString()
        End If
    Next
    Return [String].Empty
End Function

Yapılan uygulamayı yukarıdaki buton yardımıyla indirebilirsiniz.

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.