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:
IndexAction Method:- Dinamik veri listeleri (
data1vedata2) oluşturur. CreateExcelFilefonksiyonunu çağırarak Excel dosyasını oluşturur.- Excel dosyasını indirilebilir bir dosya olarak döner.
CreateExcelFileMethod:- 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
MemoryStreamkullanarak 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();
}
}
}
}
}