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




