C# İLE EXCEL DOSYASINA YAZMAK

C# ile Microsoft Office programlarına erişmek konusundaki ikinci yazımızda Excel üzerinde hangi işlemleri yapabileceğimizi inceleyeceğiz. Projemize Office bileşenini nasıl referans olarak ekleyeceğimizi ilk yazımızda1 bahsettiğimiz için bu yazımızda tekrar bahsetmeyeceğiz.Öncelikle C# ile Excel programını kullanırken, Microsoft.Office.Interop.Excel sınıfının bize sağladığı ve çok kullanacağımız birkaç nesneden bahsetmek istiyorum.

Workbook: Microsoft Excel çalışma kitabını temsil eder.
Worksheet: Çalışma kitabı içindeki çalışma sayfalarını temsil eder.
Range: Bir çalışma sayfasında bir veya daha fazla hücrenin oluşturduğu alanı temsil eder. 
      Programda ilk yapmamız gereken şey “using Microsoft.Office.Interop.Excel” satırını eklemektir. 
      ApplicationClass ExcelUyg = new ApplicationClass(); 
Satırı ile yeni bir excel uygulamsı çalıştırıyoruz, görev yöneticisini takip ederek de bu işlemi görebilirsiniz. Çalıştırdığımız excel uygulamasını sonlandrımak için ise 
      ExcelUyg.Quit(); 
komutunu kullanıyoruz. 

C# ile excel proglamlamaya giriş

Excel programı üzerinde yeni bir çalışma kitabı oluşturmak için aşağıdaki kod yeterli olacaktır. 
      object Missing = Type.Missing;     
      ApplicationClass ExcelUyg = new ApplicationClass();     
      ExcelUyg.Visible = true;     
      Workbook calismaKitap = ExcelUyg.Workbooks.Add(Missing); 
Açıtığımız çalışma kitabını üzerinde işlem yapmak için, çalışma kitabındaki ilk çalışma sayfasını kullanacağız. İlk çalışma sayfasına erişmek için kullanacağımız kod şu şekilde 
      Worksheet calismaSayfa = (Worksheet)calismaKitap.Worksheets[1]; 
Unutmayalım ki Office nesneslerinin indexleyicileri 1 den başlar yani Worksheets[0] şeklinde kullanırsak program hata üretecektir.Artık çalışma sayfası üzerinde değişiklik yapmaya hazırız.

C# ile excele veri aktarma

Beklenenin aksine Excel’e ait bir hücre(cell) sınıfı yoktur. Bu nedenle hücreleri object anahtar kelimesini kullanarak tanımlayacağız. 
      object Hucre_1 = calismaSayfa.Cells[1, 1];     
      object Hucre_2 = calismaSayfa.Cells[1, 3];     
      Range Alan = calismaSayfa.get_Range(Hucre_1, Hucre_2);     
      Alan.MergeCells = true;     
      Alan.Value2 = "C# ile Excel"
Burada Hucre_1 değişekenine çalışma sayfasında 1. Satır ve 1. Sütundaki hücreyi (A1 hücresi), ve Hucre_2 değişkenine de çalışma sayfasında 1. Satır ve 2. Sütundaki hücreyi (C1 hücresi) atadık, ve A1 hücresinden C1 hücresine kadar olan alanı Bolge değişkenine atadık. Bu alandaki hücreleri birleşitirdik ve “C# ile Excel” metnini yazdık.

C# ile Excel hücrelerini biçimlendirmek

Muhtemelen sadece yazmak yetmeyecek, ayrıca yazdığımız metni biçimlendirmek isteyeceğiz. Excel’de renk atamak için System.Drawing.Color kullanılmaz bunun yerine renk önce tam sayıya dönüştürülmelidir. Bunun için rengi kırmızı tonu 65536, yeşil tonu 256 ile çarpılır ve mavi tonu ile toplanır. Bunun için basit bir fonksiyon kullanabiliriz.
      int RengiSayiyaCevir(Color color)
      {           
            return color.B*256*256 + color.G*256 + color.R;
      }
Bir alan üzerinde kullanabileceğimiz temel font özellikleri aşağıdaki gibidir. Burada dikkat etmemiz gereken, Font.Bold, Font.Italic boolean değil de tamsayı olarak tanımlanmış olması. 1 değerini true, 0 değerini false anlamında kullanabiliriz.
      Alan.Font.Color = RengiSayiyaCevir(Color.Red);
      Alan.Font.Name = "Courier New";
      Alan.Font.Size = 22f;
      Alan.Font.Bold = 1;
      Alan.Font.Italic = 1; 
Alanın kenarlığını bir seferde tanımlayabileceğimiz gibi, her kenar için farklı kenarlıkda verebiliriz. 
      Alan.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexNone , null);
      Alan.Borders[XlBordersIndex.xlEdgeRight].LineStyle = XlLineStyle.xlDouble;
      Alan.Borders[XlBordersIndex.xlEdgeRight].Color = RengiSayiyaCevir(Color.Blue);
      Alan.Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlMedium; 
Alan içerisindeki metni istediğmiz gibi hizalayabiliriz. 
      Alan.VerticalAlignment = XlVAlign.xlVAlignCenter;
      Alan.HorizontalAlignment = XlHAlign.xlHAlignCenter;

C# ile DataGridView içindeki verileri Excel’e taşımak

Bu işlem için yuklarıda yazdığımız kodları kullanarak basit bir fonksiyon yazacağız. 
      void ExceleAktar(Worksheet sayfa, DataGridView dgv)
      {
            for (int i = 0 ;i < dgv.Rows.Count; i++)
            {
                  for (int j = 0; j < dgv.Columns.Count; j++)
                  {
                        object Hucre = sayfa.Cells[i+1, j+1];
                        Range Alan = sayfa.get_Range(Hucre, Hucre);
                        Alan.Value2 = dgv[j, i].Value;
                  }
            }
     
Burada Excelde hücreler için satır ve sütun sayısı birden başladığı için Hucre değişkenine atama sırasında i+1 ve j+1 kullandık. Bu fonksiyonumuzu test ekmek için form üzerinde bir DataGridView ekleyerek aşağıdaki kodu çalıştırıyoruz. 
      void ExcelUygulamasi()
      {
            object Missing = Type.Missing;
            ApplicationClass ExcelUyg = new ApplicationClass();
        ExcelUyg.Visible =
true;
            Workbook calismaKitap = ExcelUyg.Workbooks.Add(Missing);
            Worksheet calismaSayfa = (Worksheet) calismaKitap.Worksheets[1];
            DataGridViewDoldur();
            ExceleAktar(calismaSayfa, dataGridView1);
      }
      void DataGridViewDoldur()
      {
            dataGridView1.Columns.Clear();
            dataGridView1.Columns.Add("A", "A");
            dataGridView1.Columns.Add("B", "B");
            dataGridView1.Columns.Add("C", "C");
            dataGridView1.Columns.Add("D", "D");
            dataGridView1.Columns.Add("E", "E");
            dataGridView1.Columns.Add("F", "F");
            dataGridView1.Columns.Add("G", "G");
            Random rnd = new Random();
            for (int i = 0; i < 8; i++)
                  dataGridView1.Rows.Add(rnd.Next(100), rnd.Next(100), rnd.Next(100), rnd.Next(100), rnd.Next(100), rnd.Next(100), rnd.Next(100));
      }
Burada DataGridView içerisine rasgele veriler ekleyip bunu excel dosyamıza gönderiyoruz. Bu verileri daha sonra Excel’de formul yazmak ve grafik çizmek için kullanacağız. Bu veriler için sütun bazında ortalama alan formülü yazalım.

C# ile Excel Formülleri ve Grafikleri

                        for (int i = 1; i < 8; i++)
      {
            object Hucre_1 = calismaSayfa.Cells[1, i];
            object Hucre_2 = calismaSayfa.Cells[8, i];
            object Hucre = calismaSayfa.Cells[10, i];
            Range Alan = calismaSayfa.get_Range(Hucre, Hucre);
            Range rng = calismaSayfa.get_Range(Hucre_1, Hucre_2);
            Alan.Formula = ExcelUyg.WorksheetFunction.Average(rng, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing);
      }    
ExcelUyg.WorksheetFunction altındaki fonksiyonların alacağı parametre sayısı sabittir, eğer bizim ihtiyacımızdan  fazlası mevcut ise bunları daha önce tanımladığımız Missing değişkeni ile tamamlayabiliriz. Burada Alan ile tanımladığız hücreye, rng ile tanımladığımız bölgedeki sayıların ortalamasını hesaplayan formül ekledik. Şimdi aynı verileri kullanarak grakik çizelim. 
      _Chart grafik1 = (Chart)calismaKitap.Charts.Add(Missing, Missing, Missing, Missing);
      object Hucre_1 = calismaSayfa.Cells[1, 1];
      object Hucre_2 = calismaSayfa.Cells[1, 7];
      Range Alan = calismaSayfa.get_Range(Hucre_1, Hucre_2);
      grafik1.SetSourceData(Alan, XlRowCol.xlRows);grafik1.ChartType = XlChartType.xlPie;
      grafik1.Location(XlChartLocation.xlLocationAsObject, calismaSayfa.Name);

Excel dosyalarını yazdırma

      PrintDialog printDialog = new PrintDialog();
      if (printDialog.ShowDialog() == DialogResult.OK)
      {
            calismaSayfa.PrintOut(Missing, Missing, printDialog.PrinterSettings.Copies, False, printDialog.PrinterSettings.PrinterName,printDialog.PrinterSettings.PrintToFile, printDialog.PrinterSettings.Collate, printDialog.PrinterSettings.PrintFileName);
      }

Excel dosyalarını kaydetme

                        object False = false;
      object True = true;
      XlFileFormat format = XlFileFormat.xlWorkbookDefault;
      calismaKitap.SaveAs("C:\\yeni.xlsx", format , Missing, Missing, Missing, False, XlSaveAsAccessMode.xlNoChange, Missing, False, Missing, Missing, Missing );  
Excel ile yapabileceklerimiz çok daha fazla olsada şimdilik bunula yetineceğiz. 

6 yorum:

  1. ılk colonda 00000000956 gibi değerler var atarken sıfırlar sılınıyor nasıl duzeltebılırm

    YanıtlaSil
  2. EXCELL aKTAR KODUM BU


    private void button2_Click(object sender, EventArgs e)
    {
    Microsoft.Office.Interop.Excel.Application excelAktar = new Microsoft.Office.Interop.Excel.Application();
    excelAktar.Visible = true;
    Microsoft.Office.Interop.Excel.Workbook workbook = excelAktar.Workbooks.Add(System.Reflection.Missing.Value);
    Microsoft.Office.Interop.Excel.Worksheet sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)excelAktar.ActiveSheet;
    sheet1.Cells.EntireColumn.Font.Size = 12;





    int StartCol = 1;
    int StartRow = 1;
    for (int j = 0; j < dataGridView1.Columns.Count; j++)
    {
    Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[1, j + 1];
    myRange.Value2 = dataGridView1.Columns[j].HeaderText;
    }
    StartRow++;

    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
    for (int j = 0; j < dataGridView1.Columns.Count; j++)
    {
    try
    {
    Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[StartRow + i, StartCol + j];

    myRange.Value2 = dataGridView1[j, i].Value == null ? "" : dataGridView1[j, i].Value.ToString();

    }
    catch
    {
    ;
    }
    }
    }
    }

    YanıtlaSil
  3. duzeldı

    myRange.NumberFormat = "@";

    YanıtlaSil
  4. Günlerdir bulamadım. Elimizde olan excel dosyasının istediğimiz sayfada birkaç hücresinin verisini değiştirip kaydetmeyi. Yeni excel açmasını istemiyorum. buna örnek bir projesi olan varsa paylaşımını rica ederim.

    YanıtlaSil
  5. "ken" bende aynı şeyi arıyorum ama bende bulamadım. Var olan bir excell dosyasında değişiklik yapmadan, yeni bir excel dosyası açmadan veri işlemek istiyorum ama bulamadım

    YanıtlaSil
  6. Bu yorum yazar tarafından silindi.

    YanıtlaSil