C Sharp İle MS Excel Dosyasını Okumak Ve Yazmak

Excel tartışmasız mükemmel bir program. Bence bu güne kadar geliştirilmiş en mükemmel
uygulama. Adı da İngilizce “Excellent” kelimesinden türetilmiştir. Detaylarını
bilip kullananlar üzerlerindeki işleri ona yıkar ve rahat ederler.

Excel aklınıza ne kadar firma geliyorsa hepsinde kullanılanda bir uygulamadır.

Kimisi Word kullanır gibi kullansa da :) neredeyse bütün firmalar Excel kullanır.

Yazdığımız uygulamalarda da zaman zaman Excel dosyası çıktısı vermek zorunda kalabiliriz.
Bazı durumlarda kullandığımız class’ların (Mesela CrystalReport) Excel çıktısı
veren metotları vardır. Ama olmadığı zaman nasıl yaparız. Onun için basit bir örnek
yaptım.

C# içinde Excel kullanmamız gerekiyorsa, Excel library’sini referans olarak
göstermemiz gerekiyor. “Add reference” kısmında “Com” sekmesinde
kullanabileceğiniz Excel libraryleri göreceksiniz. Ofis 2003 çıktısı için Microsoft
Excel 11.0 Object library’yi ekliyoruz. Birde Excel Com bir nesne, metotların
aldığı bazı parametrelerde “Missing.Value” kullanmamız gerekiyor bunun
için de Reflection ‘ı kullanacağımızı belirtmemiz gerekiyor.

using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;

Sonrasında yapmak istediklerimizi yazabiliriz.

Örnek’de bir excel dosyasını okumak ve içine bir şeyler yazmak canlandırılıyor.

Ayrıca bir datagrid otomatik olarak excel dosyası olarak kaydedilebilir. bunu yapabileceğimiz
bir metodu da örneğe ekledim.

Örneğin Kodları

protected void Page_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    ExcelOku(dt);
 
    ExcelYaz(dt);
 
    ExcelYeniDosyayaYaz("YeniDosya", dt);
 
    Response.Write("İşlem Tamamlandı");
}
private void ExcelYeniDosyayaYaz(string p, DataTable _excel)
{
    try
    {
        Excel.Application xlApp = new Excel.Application();
 
        if (xlApp == null)
        {
            throw new Exception("Excel Başlatılamadı. Excel Kurulu Olmaya Bilir.");
        }
 
        xlApp.Visible = false;
        xlApp.DisplayAlerts = false;
 
        Excel.Workbook wb = xlApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
 
        Excel.Worksheet ws = (Excel.Worksheet)wb.Sheets[1];
 
        for (int i = 1; i <= _excel.Rows.Count; i++)
        {
            int r = i + 1;
            Excel.Range _UrunAdi = (Excel.Range)ws.Cells[r, 1];
            Excel.Range _Marka = (Excel.Range)ws.Cells[r, 2];
            Excel.Range _Bolge = (Excel.Range)ws.Cells[r, 3];
            Excel.Range _Adet = (Excel.Range)ws.Cells[r, 4];
            Excel.Range _Fiyat = (Excel.Range)ws.Cells[r, 5];
            Excel.Range _Tutar = (Excel.Range)ws.Cells[r, 6];
            Excel.Range _Tarih = (Excel.Range)ws.Cells[r, 7];
 
            int j = i - 1;
            _UrunAdi.Formula = _excel.Rows[j][0].ToString();
            _Marka.Formula = _excel.Rows[j][1].ToString();
            _Bolge.Formula = _excel.Rows[j][2].ToString();
            _Adet.Formula = _excel.Rows[j][3].ToString();
            _Fiyat.Formula = _excel.Rows[j][4].ToString();
            _Tutar.Formula = _excel.Rows[j][5].ToString();
            _Tarih.Formula = _excel.Rows[j][6].ToString();
        }
 
        ws.Cells.EntireColumn.AutoFit();
 
        wb.SaveAs(Server.MapPath("YeniExcel.xls"), Missing.Value, Missing.Value,
        Missing.Value, Missing.Value, Missing.Value,
        Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value,
        Missing.Value, Missing.Value, Missing.Value, Missing.Value);
 
        wb.Close(true, Missing.Value, Missing.Value);
        xlApp.Quit();
 
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message + " ");
    }
}
private void ExcelOku(DataTable BosDt)
{
    try
    {
        Excel.Application xlApp = new Excel.Application();
 
        if (xlApp == null)
        {
            throw new Exception("Excel Başlatılamadı. Excel Kurulu Olmaya Bilir.");
        }
 
        xlApp.Visible = false;
        xlApp.DisplayAlerts = false;
 
        Excel.Workbook wb = xlApp.Workbooks.Open(
                        Server.MapPath(ConfigurationManager.AppSettings["OkunacakExcelFile"]),
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value);
 
        Excel.Worksheet ws = (Excel.Worksheet)wb.Sheets[1];
 
        Excel.Range satirSayisiIcin = ws.Cells.SpecialCells(
        Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell, Missing.Value);
 
        for (int c = 0; c < satirSayisiIcin.Column; c++)
        {
        BosDt.Columns.Add("C_" + c.ToString());
        }
 
        for (int i = 1; i <= satirSayisiIcin.Row; i++)
        {
            int r = i + 1;
            Excel.Range _UrunAdi = (Excel.Range)ws.Cells[r, 1];
            Excel.Range _Marka = (Excel.Range)ws.Cells[r, 2];
            Excel.Range _Bolge = (Excel.Range)ws.Cells[r, 3];
            Excel.Range _Adet = (Excel.Range)ws.Cells[r, 4];
            Excel.Range _Fiyat = (Excel.Range)ws.Cells[r, 5];
            Excel.Range _Tutar = (Excel.Range)ws.Cells[r, 6];
            Excel.Range _Tarih = (Excel.Range)ws.Cells[r, 7];
 
            int j = i - 1;
            BosDt.Rows.Add(_UrunAdi.Formula, _Marka.Formula, _Bolge.Formula, _Adet.Formula,
            _Fiyat.Formula, _Tutar.Formula, _Tarih.Formula);
        }
 
        ws.Cells.EntireColumn.AutoFit();
 
        wb.Close(true, Missing.Value, Missing.Value);
        xlApp.Quit();
 
    }
    catch (Exception ex)
    {
        Response.Write(ex.Message + " ");
    }
}
private void ExcelYaz(DataTable _excel)
{
    try
    {
        Excel.Application xlApp = new Excel.Application();
 
        if (xlApp == null)
        {
            throw new Exception("Excel Başlatılamadı. Excel Kurulu Olmaya Bilir.");
        }
 
        xlApp.Visible = false;
        xlApp.DisplayAlerts = false;
 
        Excel.Workbook wb = xlApp.Workbooks.Open(
                                Server.MapPath(ConfigurationManager.AppSettings["BosExcelFile"]),
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
        Missing.Value, Missing.Value);
 
        Excel.Worksheet ws = (Excel.Worksheet)wb.Sheets[1];
 
        for (int i = 1; i <= _excel.Rows.Count; i++)
        {
            int r = i + 1;
            Excel.Range _UrunAdi = (Excel.Range)ws.Cells[r, 1];
            Excel.Range _Marka = (Excel.Range)ws.Cells[r, 2];
            Excel.Range _Bolge = (Excel.Range)ws.Cells[r, 3];
            Excel.Range _Adet = (Excel.Range)ws.Cells[r, 4];
            Excel.Range _Fiyat = (Excel.Range)ws.Cells[r, 5];
            Excel.Range _Tutar = (Excel.Range)ws.Cells[r, 6];
            Excel.Range _Tarih = (Excel.Range)ws.Cells[r, 7];
 
            int j = i - 1;
            _UrunAdi.Formula = _excel.Rows[j][0].ToString();
            _Marka.Formula = _excel.Rows[j][1].ToString();
            _Bolge.Formula = _excel.Rows[j][2].ToString();
            _Adet.Formula = _excel.Rows[j][3].ToString();
            _Fiyat.Formula = _excel.Rows[j][4].ToString();
            _Tutar.Formula = _excel.Rows[j][5].ToString();
            _Tarih.Formula = _excel.Rows[j][6].ToString();
        }
 
        ws.Cells.EntireColumn.AutoFit();
 
        wb.Close(true, Missing.Value, Missing.Value);
        xlApp.Quit();
 
    }
    catch (Exception ex)
    {
         Response.Write(ex.Message + " ");
    }
}
private void DataGridToExcel()
{
    Response.Clear();
    Response.AddHeader("content-disposition", "attachment;filename=Projects.xls");
    Response.Charset = "iso-8859-9";
    Response.ContentType = "application/vnd.xls";
    Response.ContentEncoding = System.Text.Encoding.Default;
 
    StringWriter stringWrite = new StringWriter();
    HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
 
    DataGrid dg = new DataGrid();
    dg.ID = "Deneme";
 
    DataTable dt = new DataTable();
    dt.Columns.Add("A");
    dt.Columns.Add("B");
 
    dt.Rows.Add("Deneme", "1");
    dt.Rows.Add("Deneme", "2");
 
    dg.DataSource = dt;
    dg.DataBind();
 
    dg.HeaderStyle.BackColor = System.Drawing.Color.White;
    dg.RenderControl(htmlWrite);
    Response.Write(stringWrite.ToString());
    Response.End();
}

Kaynaklar

asp.net forum

msdn blog

Visual Studio 2008 ile hazırlandı.
Kodları
indirmek için Tıklayınız

Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

Bu hatayı aldığımızda kültür sorunu yaşıyor olabiliriz. Workbook a birşey eklemeden
önce thread’in kültürünü değiştirerek sorunu çözebiliyoruz.

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

Msdn forum post
http://support.microsoft.com/kb/306022/
http://support.microsoft.com/default.aspx?scid=kb;en-us;320369
http://msdn.microsoft.com/en-us/library/aa168494.aspx

Be Sociable, Share!

    Category: Csharp - C#, Excel - 17 comments »

    17 Responses to “C Sharp İle MS Excel Dosyasını Okumak Ve Yazmak”

    1. serdar

      xlApp.DisplayAlerts = false;

      satırını eklediğinizde de “Old format or invalid type library. (Exception from HRESULT: 0×80028018 (TYPE_E_INVDATAREAD))” hatası alabiliyorsunuz.

      bu satırı açıklama yaparak sorunu aşabiliriz.

    2. arzu

      Merhabalar Serdar Bey

      Verdiğiniz örneği VS 2008 Office 2007 kurulu sistemimde çalıştırdığımda xlApp´Workbook´Open satırında “SystemRuntimeInteropServicesCOMException: Eski biçim veya geçersiz kitaplık türü HRESULT özel durum döndürdü: 0x80028018 TYPEEINVDATAREAD” hatasını alıyorum Bunula ilgili bir çözümünüz olmuşmuydu acaba

    3. serdar

      merhaba,

      Thread.CurrentThread.CurrentCulture = new CultureInfo(“en-US”);

      sanırım bu sorunu da çözecektir.

    4. Mehmet

      Merhaba Serdar Bey,
      Yukarıdaki kodu c# formuna ekledim fakat Sistem “new CultureInfo” bolumunu tanımıyor ve hata veriyor:S yardımcı olursanız sevinirim…

      Simdiden ALLAH razı olsun

    5. Mehmet

      :):) kendi hatamı buldum burayada yazayım dedim…
      Thread.CurrentThread.CurrentCulture = new CultureInfo(”en-US”);
      yukarıdaki kodu calistirmak icin cs sayfasının ustune asagidaki kodları yerlestirmeniz gerekiyor…

      using System.Threading;
      using System.Globalization;

    6. Fatih

      Merhaba, ben
      System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CreateSpecificCultur(”en-GB”);
      kullanmak istiyor ve excelle bir data table gönderip save yaptırmak istiyorum. Ama (“eng-GB”) kullanırsam
      Excel.Workbook ekitap=exeluygulama.Workbook.Add(true); kısmında aynı eski biçim ve geçersiz kitaplık türü hatasını veriyor. Ve (“eng-US”) kullanmak istemiyorum. Lütfen yardım edin. (“eng-GB”) li excele kaydetme kodları varsa çok mutlu olacağım. Şimdiden çok teşekkür ederim. Allah razı olsun.

    7. Mustafa

      Merhabalar,
      Bilgisayara format attıktan sonra ;
      System.Runtime.InteropServices.COMException (0x80010105): Sunucu bir istisna attı. (HRESULT özel durum döndürdü: 0x80010105 (RPC_E_SERVERFAULT))
      şeklinde hata vermeye başladı.Neden olduğunu anlayamadım.

    8. serdar

      Mustafa, format sonrası kurduğun ofis versiyonundan olabilir. ya da güncellemeleri eksik kurmuş olabilir misin?

    9. serdar

      Fatih, şu yazıdaki yöntemle bir dene istersen.

      http://www.serdarb.com/csharp-c/insert-datatable-to-excel-sheet/

    10. Mustafa

      valla hepsi tam zaten önceden update falanda yapmadım office 2003 olmadı
      sonra office 2007 kurdum aynı hatayı verdi formattan önce ve sonrasında herhengi bi değişiklik yapmadım.Türkçe kaynakta bulamadım bu hatayla ilgili.

    11. serdar

      örnek dosya gönder istersen bide koddan bakalım. aklıma bi çözüm gelmedi…

    12. Mustafa

      System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
      System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(“en-US”);
      Excel.Application xlApp;
      Excel.Workbook xlWorkBook;
      Excel.Worksheet xlWorkSheet;
      object misValue = System.Reflection.Missing.Value;

      xlApp = new Excel.ApplicationClass();
      xlWorkBook = xlApp.Workbooks.Add(misValue);

      kodun baş kısmı ve sadece son satırda hata veriyor.
      Başka web sitelerda alakası olmayan excel kodlarını denedim yine workbook da hata veriyor.

    13. serdar

      bi yorum yapamadım malesef.

    14. Cuneyt

      Sagol Serdar! Sayenizde lanet olasi INVDATAERROR hatasi almaktan kurtuldum. Cok tesekkur ederim.

    15. Yavuz

      OleDb sınıfı varken, bu yöntemin eziyet olduğunu düşünüyorum. Bunları zor bulan arakdaşlar. Oledb Connection ile Excel’ e access e bağlanır gibi bağlanıp, daha hızlı ve performanslı bir şekilde okuma, yazma işlemlerini yapabilirsiniz.

    16. Esma

      Merabalar,

      yazınız çok yararlı gerçekten…
      Ben exceldeki tüm verileri listview, datagrid vs. içine almak istiyorum. Sizin bu uygulamanızı denemeye çalıştım fakat bazı yerlerin altını çizdi, bazı kütüphaneler eksik sanırım. Örneğin;StringWriter kelimelerinin altınızı çiziyordu. using System.IO kütüphanesini eklediğimde düzeldi. Response, HeaderStyle, RenderControl, MapPath, ConfigurationManager, HtmlTextWriter… bunlardada sorun oldu, acaba bunlaradamı kütüphane eklemem gerekiyor,eklemem gerekiyorsa hangilerini eklemem gerekiyor? Şimdiden teşekkürler …

    17. s.gural

      Thread.CurrentThread.CurrentCulture = new CultureInfo(“en-US”);

      çok teşekkürler

    Back to top