Posted in

ASP.NET Core ile Dinamik Excel Dosyası Oluşturma

ASP.NET Core projelerinde dinamik olarak Excel dosyaları oluşturmak, genellikle raporlama veya veri paylaşımı gibi işlemlerde oldukça sık ihtiyaç duyulan bir özelliktir. Bu blog yazısında, yukarıdaki kod örneğini kullanarak ClosedXML kütüphanesi yardımıyla dinamik bir Excel dosyası oluşturmayı ve bunu nasıl indirilebilir hale getireceğinizi anlatacağım.

ClosedXML Nedir?

ClosedXML, .NET uygulamalarında Excel dosyalarını kolayca oluşturmanızı ve düzenlemenizi sağlayan güçlü bir kütüphanedir. Hem .xlsx formatını destekler hem de hücre biçimlendirme, veri ekleme gibi işlemleri kolayca gerçekleştirir.

Kodun İşleyişi

1. Projenin Yapılandırılması

ClosedXML kütüphanesini kullanmadan önce proje üzerinde aşağıdaki NuGet paketini yüklemeniz gerekiyor:

dotnet add package ClosedXML

Bu paket Excel dosyaları oluşturmak ve düzenlemek için gerekli tüm özellikleri sağlar.

2. Controller’da Excel Oluşturma

Kodun temelinde iki ana fonksiyon bulunuyor:

  • Index Action Method:
  • Dinamik veri listeleri (data1 ve data2) oluşturur.
  • CreateExcelFile fonksiyonunu çağırarak Excel dosyasını oluşturur.
  • Excel dosyasını indirilebilir bir dosya olarak döner.
  • CreateExcelFile Method:
  • Verilen verilerden dinamik bir Excel dosyası oluşturur.
  • Başlık satırı ve veri satırlarını ekler.
  • Sütun başlıklarına sarı renk ekler ve sütun genişliklerini ayarlar.
  • Tüm Excel verilerini bir MemoryStream kullanarak byte dizisine dönüştürür.

3. Başlık Satırlarının Eklenmesi

Başlık satırları, her bir veri listesinin ilk elemanının anahtarları (keys) kullanılarak dinamik şekilde oluşturulur. Hücrelerin sarı renkle vurgulanması ve sütun genişliklerinin ayarlanması kodda şu şekilde yapılmıştır:

var columnNames = data.First().Keys.ToList();
for (int i = 0; i < columnNames.Count; i++)
{
    var cell = worksheet.Cell(currentRow, i + 1);
    cell.Value = columnNames[i];
    cell.Style.Fill.BackgroundColor = XLColor.Yellow; // Sarı renk ayarı
    worksheet.Column(i + 1).Width = 50; // Sütun genişliği ayarı
}

4. Dinamik Veri Ekleme

Her veri satırı, dinamik olarak belirlenen sütun isimlerine göre Excel dosyasına eklenir:

foreach (var row in data)
{
    currentRow++;
    for (int i = 0; i < columnNames.Count; i++)
    {
        worksheet.Cell(currentRow, i + 1).Value = row[columnNames[i]]?.ToString();
    }
}

5. Listeler Arasında Boşluk Bırakma

Eğer birden fazla listeyi aynı Excel dosyasına ekliyorsanız, listeler arasında boş satır bırakarak verilerin ayrışmasını sağlayabilirsiniz:

currentRow += 2; // Listeyi bitirdikten sonra 2 satır atla

Kodun Çıktısı: Örnek Excel Dosyası

Bu kod çalıştırıldığında şu şekilde bir Excel dosyası oluşturulur:

  • İlk sayfa, birden fazla listeyi içerir.
  • Başlık satırları sarı renkle vurgulanır.
  • Listeler arasında boş satırlarla görsel ayrım yapılır.

Tam Kod

using ExcelList.Models;
// Controllers/HomeController.cs
using Microsoft.AspNetCore.Mvc;
using ClosedXML.Excel;

namespace YourNamespace.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            // Dinamik liste objelerini oluşturalım
            var data1 = new List<Dictionary<string, object>>
            {
                new Dictionary<string, object> { { "ID", 1 }, { "Name", "Ürün A" }, { "Price", 100.0 } },
                new Dictionary<string, object> { { "ID", 2 }, { "Name", "Ürün B" }, { "Price", 150.5 } },
                new Dictionary<string, object> { { "ID", 3 }, { "Name", "Ürün C" }, { "Price", 200.75 } }
            };

            var data2 = new List<Dictionary<string, object>>
            {
                new Dictionary<string, object> { { "ID", 4 }, { "Name", "Ürün D" }, { "Price", 300.0 } },
                new Dictionary<string, object> { { "ID", 5 }, { "Name", "Ürün E" }, { "Price", 400.5 } },
                new Dictionary<string, object> { { "ID", 6 }, { "Name", "Ürün F" }, { "Price", 500.75 } }
            };

            // Dosya ismini burada tanımlayalım
            string fileName = "CustomExcelFileName.xlsx";

            // Excel dosyasını oluşturmak için CreateExcelFile fonksiyonunu çağırıyoruz
            var excelFile = CreateExcelFile(new List<List<Dictionary<string, object>>> { data1, data2 }, fileName);

            return File(excelFile, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
        }

        private byte[] CreateExcelFile(List<List<Dictionary<string, object>>> dataLists, string fileName)
        {
            using (var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add("Data");
                int currentRow = 1;

                foreach (var data in dataLists)
                {
                    if (data.Count > 0)
                    {
                        // Başlık satırını ekleyelim
                        var columnNames = data.First().Keys.ToList();
                        for (int i = 0; i < columnNames.Count; i++)
                        {
                            var cell = worksheet.Cell(currentRow, i + 1);
                            cell.Value = columnNames[i];
                            cell.Style.Fill.BackgroundColor = XLColor.Yellow; // Sarı renk ayarı
                            worksheet.Column(i + 1).Width = 50; // Sütun genişliği ayarı
                        }

                        // Verileri ekleyelim
                        foreach (var row in data)
                        {
                            currentRow++;
                            for (int i = 0; i < columnNames.Count; i++)
                            {
                                worksheet.Cell(currentRow, i + 1).Value = row[columnNames[i]]?.ToString();
                            }
                        }

                        // Her liste arasında boş bir satır bırak
                        currentRow += 2; // Listeyi bitirdikten sonra 2 satır atla
                    }
                }

                // Excel dosyasını hafızaya kaydedelim ve byte dizisi olarak döndürelim
                using (var stream = new MemoryStream())
                {
                    workbook.SaveAs(stream);
                    return stream.ToArray();
                }
            }
        }
    }
}

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir