Bu makalede ClosedXML.Report kütüphanesinin kullanımını ele alacağım. Daha önce ClosedXML kütüphanesi kullanarak .NET tabanlı projelerimizde excel içe aktarma, excel dışa aktarma gibi konuları bir makale serisi halinde detaylıca anlatmaya çalışmıştım.
ClosedXML.Report kütüphanesi ise excel üzerinde oluşturduğumuz rapor şablonlarına data binding (veri bağlama) imkanı sağlıyor. Bu kütüphanenin github reposuna buradan ulaşıp daha detaylı işlemler için inceleyebilirsiniz.
Bu makaledeki örnekte basit bir sipariş raporu hazırlayacağım. İlk olarak projemize Manage NuGet Packages üzerinden ClosedXML.Report kütüphanesini ekleyelim.
Ardından sipariş için modellerimizi oluşturalım.
Order.cs
public class Order {
public Order() {
OrderItems = new List<OrderItem>();
}
public int IDOrder { get; set; }
public DateTime OrderDate { get; set; }
public string CustomerName { get; set; }
public string CustomerAddress { get; set; }
public string CustomerPhone { get; set; }
public List<OrderItem> OrderItems { get; set; }
}
public class OrderItem {
public int OrderNo { get; set; }
public string ProductBrand { get; set; }
public string ProductName { get; set; }
public decimal Price { get; set; }
public decimal Quantity { get; set; }
}
Şimdi bir tane excel şablonu oluşturuyoruz. Excel şablonunun görüntüsü aşağıdaki gibidir;
NOT!
Binding işlemi için {{PropertyName}} şeklinde bir format kullanıyoruz. Hücre içine yazdığımız {{CustomerName}} Order sınıfımızdaki CustomerName property'sini ifade etmektedir. {{item.ProductName}} ise OrderItem sınıfımızdaki ProductName property'sini ifade ediyor.
OrderItem için burada dikkat edilmesi gereken önemli bir detay var. Excelde Formüller sekmesi altından Ad Yöneticisi menüsüne girerek yeni bir Ad tanımı yapmamız gerekiyor. Bu tanımlamayı yaparken Ad kısmına OrderItems yani item olarak referans alınacak property adını yazıyoruz. Başvuru yeri olarak da item bilgilerinin yazılacağı hücreleri seçiyoruz.
<<group>> keyword'ü bize gruplama imkanı sağlıyor. Bu şablon örneğinde ben siparişteki ürünleri Marka bazlı gruplayacağım.
<<sum>> keyword'ü ise o sütun için alt toplam alma imkanı sağlamaktadır. Farklı keyword'ler için ClosedXML.Report dökümanlarına bakılabilir. Belki daha sonra talep olursa ben de daha detaylı bir makale hazırlayabilirim.
<<sort>> keyword'ü ise hangi sütun altına yazdıysak o sütuna göre sıralama sağlar.
Şablonumuz da hazır olduğuna göre örnek bir sipariş oluşturup raporu export almayı deneyebiliriz.
public Order CreateAndGetOrder() {
Order order = new Order {
IDOrder = 1,
CustomerName = "ENES TAŞ",
CustomerAddress = "X MAH. Y SK. NO:Z KEPEZ ANTALYA",
CustomerPhone = "0 111 222 33 44",
OrderDate = DateTime.Now
};
order.OrderItems.Add(new OrderItem {
OrderNo = 1,
ProductBrand = "APPLE",
ProductName = "IPhone XS 256GB Space Gray",
Price = 10000,
Quantity = 2
});
order.OrderItems.Add(new OrderItem {
OrderNo = 2,
ProductBrand = "APPLE",
ProductName = "IPhone XS 256GB Gold",
Price = 10500,
Quantity = 1
});
order.OrderItems.Add(new OrderItem {
OrderNo = 3,
ProductBrand = "Xiaomi",
ProductName = "Mi 10 256GB 5G",
Price = 9999,
Quantity = 2
});
order.OrderItems.Add(new OrderItem {
OrderNo = 4,
ProductBrand = "Huawei",
ProductName = "P40 Pro 256GB",
Price = 11999,
Quantity = 1
});
return order;
}
Şimdi de controller'ımıza oluşturduğumuz siparişi excel şablonumuza bind eden ve export edecek olan metodumuzu yazalım.
[HttpGet]
[Route("export/order-report")]
public IActionResult ExportOrderReport() {
byte[] excelFile;
var filePath = Path.Combine(_env.ContentRootPath, "template", "OrderTemplate.xlsx");
var template = new XLTemplate(filePath);
Order order = CreateAndGetOrder();
template.AddVariable(order);
template.Generate();
using (MemoryStream ms = new MemoryStream()) {
// Dosyayı bir path belirterek de kaydedebiliriz, biz burada stream olarak kaydedeceğiz
template.SaveAs(ms);
// Stream olarak kaydettiğiniz dosyayı byte array olarak alıyoruz, bunu client'a response olarak döneceğiz
excelFile = ms.ToArray();
}
//Eğer JavaScript değil de direkt actionresult için belirtilen route'u tetikleyerek dosyayı indirmek istiyorsanız bu alternatifi kullanabilirsiniz.
return File(excelFile, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
View tarafından metodumuzu şu şekilde çağırabiliriz;
<a href="/export/order-report" class="btn btn-primary">Export Order Report (ClosedXML.Report Lib) (.NET CORE)</a>
Excel çıktımızın sonucu;
Excel çıktımızda grupladığımız sütunda başlıklar Total şeklinde ingilizce geldi. Bu başlıkları <<group>> keyword'ünde aşağıdaki gibi bir kullanım ile türkçeleştirebiliriz.
<<group TotalLabel="Toplam">>
Bu makale ve daha önce ClosedXML ile ilgili yazmış olduğum makalelerdeki örneklerin tamamını içeren kaynak kodlara aşağıdaki linkten erişebilirsiniz.
https://github.com/enestas/netcore-closedxml-using
Faydalı olması dileğiyle, görüşmek üzere.