C# Excel Export İşlemi

Eminim ki bir çoğumuz Excel’den data okuma ve elimizdeki datayı excel dosyasına çıkarma gereksinimi ile karşılaşmışızdır. Bunun için bir çok yöntem varken bence özellikle excel dosyasına veri aktarma işlemi(export) asp.net uygulamalarında oldukça kolayken windows form uygulamalarında yada wpf’de biraz daha zor olmaktadır. Çünkü asp.net uygulamalarında elimizde html stringini hızlı bir şekilde response nesnesini kullanarak excel, word vs. dosyalara aktarabiliyoruz.

Aşağıda görmüş olduğunuz sınıfla elimizde bulunan her hangi bir Generic List’i excel’e kolayca aktarabiliyoruz. Bunun için yapmanız gereken sadece uygulamanıza Microsoft.Office.Interop.Excel’i refere etmek.

Excel export sınıfı:

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Forms;
namespace ExcelExport
{
    public class ExportToExcelFile<T, U>
        where T : class
        where U : List<T>
    {
        public List<T> dataToPrint;
        // Excel object references.
        private Microsoft.Office.Interop.Excel.Application _excelApp = null;
        private Microsoft.Office.Interop.Excel.Workbooks _books = null;
        private Microsoft.Office.Interop.Excel._Workbook _book = null;
        private Microsoft.Office.Interop.Excel.Sheets _sheets = null;
        private Microsoft.Office.Interop.Excel._Worksheet _sheet = null;
        private Microsoft.Office.Interop.Excel.Range _range = null;
        private Microsoft.Office.Interop.Excel.Font _font = null;
        private object _optionalValue = Missing.Value;

        public void GenerateReport()
        {
            try
            {
                if (dataToPrint != null)
                {
                    if (dataToPrint.Count != 0)
                    {
                        CreateExcelRef();
                        FillSheet();
                        OpenReport();
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Rapor hazırlanırken hata oluştu...");
            }
            finally
            {
                ReleaseObject(_sheet);
                ReleaseObject(_sheets);
                ReleaseObject(_book);
                ReleaseObject(_books);
                ReleaseObject(_excelApp);
            }
        }
        private void OpenReport()
        {
            _excelApp.Visible = true;
        }
        private void FillSheet()
        {
            object[] header = CreateHeader();
            WriteData(header);
        }
        private void WriteData(object[] header)
        {
            object[,] objData = new object[dataToPrint.Count, header.Length];
            for (int j = 0; j < dataToPrint.Count; j++)
            {
                var item = dataToPrint[j];
                for (int i = 0; i < header.Length; i++)
                {
                    var y = typeof(T).InvokeMember
            (header[i].ToString(), BindingFlags.GetProperty, null, item, null);
                    objData[j, i] = (y == null) ? "" : y.ToString();
                }
            }
            AddExcelRows("A2", dataToPrint.Count, header.Length, objData);
            AutoFitColumns("A1", dataToPrint.Count + 1, header.Length);
        }
        private void AutoFitColumns(string startRange, int rowCount, int colCount)
        {
            _range = _sheet.get_Range(startRange, _optionalValue);
            _range = _range.get_Resize(rowCount, colCount);
            _range.Columns.AutoFit();
        }
        private object[] CreateHeader()
        {
            PropertyInfo[] headerInfo = typeof(T).GetProperties();
            List<object> objHeaders = new List<object>();
            for (int n = 0; n < headerInfo.Length; n++)
            {
                objHeaders.Add(headerInfo[n].Name);
            }
            var headerToAdd = objHeaders.ToArray();
            AddExcelRows("A1", 1, headerToAdd.Length, headerToAdd);
            SetHeaderStyle();

            return headerToAdd;
        }
        private void SetHeaderStyle()
        {
            _font = _range.Font;
            _font.Bold = true;
        }
        private void AddExcelRows(string startRange, int rowCount, int colCount, object values)
        {
            _range = _sheet.get_Range(startRange, _optionalValue);
            _range = _range.get_Resize(rowCount, colCount);
            _range.set_Value(_optionalValue, values);
        }
        private void CreateExcelRef()
        {
            _excelApp = new Microsoft.Office.Interop.Excel.Application();
            _books = (Microsoft.Office.Interop.Excel.Workbooks)_excelApp.Workbooks;
            _book = (Microsoft.Office.Interop.Excel._Workbook)(_books.Add(_optionalValue));
            _sheets = (Microsoft.Office.Interop.Excel.Sheets)_book.Worksheets;
            _sheet = (Microsoft.Office.Interop.Excel._Worksheet)(_sheets.get_Item(1));
        }
        private void ReleaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show(ex.Message.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
    }
}

Gerekli referansları ve yukarıda yer alan sınıfı uygulamanıza eklediten sonra yapmanız gereken sadece aşağıdaki gibidir.

Örnek uygulama:

using System.Collections.Generic;

namespace ExcelExport
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Araba> dataList = new List<Araba>();

            dataList.Add(new Araba
            {
                 Marka = "Fiat",
                  Model = "Punto Evo",
                   Renk = "Siyah"
            });

            dataList.Add(new Araba
            {
                Marka = "Opel",
                Model = "Corsa",
                Renk = "Kırmızı"
            });

            ExportToExcelFile<Araba, List<Araba>> excelExport = new ExportToExcelFile<Araba, List<Araba>>();
            excelExport.dataToPrint = dataList;
            excelExport.GenerateReport();
        }
    }
    public class Araba
    {
        public string Marka { get; set; }
        public string Model { get; set; }
        public string Renk { get; set; }
    }
}

Ben sıklıkla bu yöntemi kullanıyorum. Umarım sizinde işinize yarar.

İyi çalışmalar.

Örnek Uygulama: http://yadi.sk/d/7chECprG9XRzh

C# Excel Export İşlemi” üzerine 2 yorum

  1. dostum umudumu kaybetmiştim artık, saçma sapan birsürü şeye girdim çıktım. Çok teşekkürler. Kopyala yapıştır yapmaya başlamıştım 😀

    Cevapla

Yorum bırakın