KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO

Excel Export için ReportModel Yapısı ve Kullanımı

Yorum bırakın


Excel export işlemi için daha öncede yazdığım yazıya buradan ulaşabilirsiniz. Bu yazımda sizlere excel export işleminde kullanabileceğiniz esnek bir ReportModel’den bahsedeceğim. Bu yapıları kullanarak oluşturacağınız bir ReportModel’i excel export işleminde kullanabilirsiniz. Böylece elinizde esnek bir yapı olacaktır. Dilediğiniz şekilde excel tabloları oluşturabilirsiniz.

Verilerinizi veritabanından çektikten sonra Report Model’i oluşturmanız yeterli olacaktır. Excel tablosunda görünmesini istediğiniz özellikleri(property) içeren anonim(anonymous) tipi oluşturmanız yeterlidir.

Öncelikle nasıl kullanıldığını içeren Helper class’ı sizlerele paylaşıyorum. Diğer class’larda yazının ilerleyen kısımların mevcut. Kod aralarında açıklama satırları mevcuttur. Anlaşılacağını umuyorum.

 

MyExcelHelper.cs

using ExcelExportSample.Model;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ExcelExportSample
{
    public class MyExcelHelper
    {
        public void WriteToExcel(RDExportReportModel exportReportModel, string path)
        {
            // Excel dosya erişimi için gerekli tanımlar yapılır.
            Microsoft.Office.Interop.Excel.Application xlApp;
            Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;

            xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            // Başlık(Header) hücrelerin renklenmesi sağlanır.
            xlWorkSheet.Cells["1:1"].Font.Bold = true;
            xlWorkSheet.Cells["1:1"].Font.Color = Color.Red;

            int colIndex = 65;  //A

            // Excel tablo Header'lar yazılır.
            foreach (RDExportReportColumnModel column in exportReportModel.ExportData.Keys)
            {
                string cellIndex = char.ConvertFromUtf32(colIndex);
                string cellHeader = column.ColumnName;

                xlWorkSheet.Cells[string.Concat(cellIndex, 1)].Value = cellHeader;

                if (column.ColumnWidth > 0)
                    xlWorkSheet.Cells[string.Concat(cellIndex, 1)].ColumnWidth = column.ColumnWidth;

                if (!string.IsNullOrEmpty(column.Format))
                    xlWorkSheet.Cells[string.Concat(cellIndex, ":", cellIndex)].NumberFormat = column.Format;

                colIndex++;
            }

            colIndex = 65;  //A

            // Her bir kolon için dönülerek, kolon kolon veriler yazılır.
            foreach (RDExportReportColumnModel column in exportReportModel.ExportData.Keys)
            {
                string cellIndex = char.ConvertFromUtf32(colIndex);
                int rowIndex = 2;

                // Değerler satır satır hücrelere yazılır.
                // Yazma işlemi kolon kolon yapılır.
                // Her kolon satur satır işlenir, sonra diğer kolona geçilir.
                foreach (RDExportReportCellModel cellModel in exportReportModel.ExportData[column])
                {
                    xlWorkSheet.Cells[string.Concat(cellIndex, rowIndex)].Value = cellModel.Value.ToString();
                    rowIndex++;
                }

                colIndex++;
            }

            // Excel dosya kaydedilir.
            xlWorkBook.SaveAs(path, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();
        }

        public void SaveSampleExcelExportFile()
        {
            RDExportReportModel reportModel = new RDExportReportModel();
            reportModel.ExportData = new Dictionary>();

            // Örnek veri bu veri veritabanından geliyor olsun.
            var sampleData = new List>() {
                new Tuple("Murat","Başeren"),
                new Tuple("Şükran","Başeren"),
                new Tuple("Belinay","Başeren")
            };

            // Veritabanından gelen veriyi istediğimiz bir model'e dönüştürüyoruz.
            var data = (from x in sampleData
                        select new
                         {
                             FirstName = x.Item1,
                             LastName = x.Item2
                         }).ToList();

            // Kolon ve verisi oluşturulur.
            reportModel.ExportData.Add(
                RDExportReportColumnModel.CreateColumnModel("ExportExcel#", "FirstName"),
                new List(
                    data.Select(x =>
                        new RDExportReportCellModel()
                        {
                            Value = x.FirstName
                        })));


            // Kolon ve verisi oluşturulur.
            reportModel.ExportData.Add(
                    RDExportReportColumnModel.CreateColumnModel("ExportExcel#", "LastName"),
                    new List(
                        data.Select(x =>
                            new RDExportReportCellModel()
                            {
                                Value = x.FirstName
                            })));

            // Excel export yapılır.
            WriteToExcel(reportModel, Application.StartupPath + @"\sample.xls");
        }
    }
}

RDExportReportModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcelExportSample.Model
{
    public class RDExportReportModel
    {
        /// 
        /// Verileri kolon ve kolona ait hücre değerleri olarak saklıyoruz. Dolayısı ile satırları elde etmek için aşağıdaki metotlar kullanılır.
        /// 
        public Dictionary<RDExportReportColumnModel, List> ExportData { get; set; }

        /// 
        /// Verilen satır index 'ine ait satır verilerini getirir.
        /// 
        /// 
        /// 
        public RDExportReportRowModel GetRow(int rowIndex)
        {
            RDExportReportRowModel rowModel = new RDExportReportRowModel();
            rowModel.Cells = new List();

            this.ExportData.Values.ToList().ForEach(
                x =>
                {
                    rowModel.Cells.Add(
                        new RDExportReportCellModel()
                        {
                            Value = x[rowIndex].Value
                        });
                });

            return rowModel;
        }

        /// 
        /// Tüm satırları verir.
        /// 
        /// 
        public List GetRows()
        {
            List rows = new List();

            int rowCount = this.ExportData[this.ExportData.Keys.First()].Count;

            for (int i = 0; i < rowCount; i++)
            {
                RDExportReportRowModel rowModel = new RDExportReportRowModel();
                rowModel.Cells = new List(this.ExportData.Keys.Count);

                foreach (RDExportReportColumnModel column in this.ExportData.Keys)
                {
                    rowModel.Cells.Add(
                        new RDExportReportCellModel()
                        {
                            Value = this.ExportData[column][i].Value
                        });
                }

                rows.Add(rowModel);
            }

            return rows;
        }
    }
}

RDExportReportColumnModel.cs


namespace ExcelExportSample.Model
{
    public class RDExportReportColumnModel
    {
        public string ColumnName { get; set; }
        public int ColumnWidth { get; set; }
        public string Format { get; set; }


        /// 
        /// 
        /// 
        /// Localization section.
        /// Localization key. For example; "{0}#{1}"
        /// 
        public static RDExportReportColumnModel CreateColumnModel(string section, string key)
        {
            return new RDExportReportColumnModel() { 
                ColumnName = Localization.Get(section, key) 
            };
        }
    }

    public class Localization
    {
        public static string Get(string section, string key)
        {
            // Burada veritabanından okunan localization eşlemesinin karşılığı elde edilir. Örnek; Login#Username gibi anahtar veritabanından sorgulanır.
            return section + "#" + key;
        }
    }
}

RDExportReportRowModel.cs

using System.Collections.Generic;
using System.Drawing;

namespace ExcelExportSample.Model
{
    public class RDExportReportRowModel
    {
        public List Cells { get; set; }
    }
}

RDExportReportCellModel.cs

namespace ExcelExportSample.Model
{
    public class RDExportReportCellModel
    {
        public object Value { get; set; }
    }
}

Örnek kullanım;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcelExportSample
{
    class Program
    {
        static void Main(string[] args)
        {
            MyExcelHelper myExcelHelper = new MyExcelHelper();
            myExcelHelper.SaveSampleExcelExportFile();
        }

    }
}

Proje dosyası için tıklayınız..

Reklamlar

Yazar: K. Murat BAŞEREN, MBA, MCP

I am a senior software developer, MCP, consultant, blogger, former chemist and software trainer. My interests range from software developer to technology. I am also interested in web development, education, and coffee.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s