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
Visual Studio 2008 ile hazırlandı.
Kodları
indirmek için Tıklayınız
Old format or invalid type library. (Exception from HRESULT: 0×80028018 (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
Category: Csharp - C#, Excel - 14 comments »





February 10th, 2009 at 8:43 am
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.
February 11th, 2009 at 1:07 am
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ü: 0×80028018 TYPEEINVDATAREAD” hatasını alıyorum Bunula ilgili bir çözümünüz olmuşmuydu acaba
February 11th, 2009 at 3:28 am
merhaba,
Thread.CurrentThread.CurrentCulture = new CultureInfo(“en-US”);
sanırım bu sorunu da çözecektir.
August 22nd, 2009 at 5:32 am
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
August 22nd, 2009 at 5:34 am
:):) 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;
September 16th, 2009 at 12:49 am
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.
September 21st, 2009 at 8:04 pm
Merhabalar,
Bilgisayara format attıktan sonra ;
System.Runtime.InteropServices.COMException (0×80010105): Sunucu bir istisna attı. (HRESULT özel durum döndürdü: 0×80010105 (RPC_E_SERVERFAULT))
şeklinde hata vermeye başladı.Neden olduğunu anlayamadım.
September 22nd, 2009 at 12:32 am
Mustafa, format sonrası kurduğun ofis versiyonundan olabilir. ya da güncellemeleri eksik kurmuş olabilir misin?
September 22nd, 2009 at 12:41 am
Fatih, şu yazıdaki yöntemle bir dene istersen.
http://www.serdarb.com/csharp-c/insert-datatable-to-excel-sheet/
October 3rd, 2009 at 7:14 pm
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.
October 5th, 2009 at 11:39 pm
örnek dosya gönder istersen bide koddan bakalım. aklıma bi çözüm gelmedi…
October 9th, 2009 at 5:18 am
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.
November 8th, 2009 at 3:02 am
bi yorum yapamadım malesef.
July 27th, 2010 at 2:34 am
Sagol Serdar! Sayenizde lanet olasi INVDATAERROR hatasi almaktan kurtuldum. Cok tesekkur ederim.