C#'da Excel Pivot Tablosu Nasıl Oluşturulur?
C# ile Excel pivot tabloları oluşturmak, Office Interop ile (Microsoft Office kurulumu gerektirir) veya IronXL gibi modern kütüphanelerle bağımsız olarak çalışabilir, IronXL ise üstün dağıtım esnekliği ve DevOps ortamları için çapraz platform desteği sunar.
Özet tabloların programatik olarak oluşturulması ya C# Interop ile Office bağımlılıkları gerektirir ya da bağımsız çalışan modern kütüphaneler kullanır. Örneğin, IronXL bu tür bir kütüphanedir. Bu öğretici, her iki yaklaşımı da gösterir ve geliştiricilerin özellikle Docker konteynerlerine veya Azure ve AWS gibi bulut ortamlarına dağıtım yaparken neden IronXL'i geleneksel Interop yöntemlerine kıyasla daha sık tercih ettiğini vurgular.
Bu makalede, dağıtım basitliğini mühendislerin DevOps ihtiyaç duyduğu şekilde koruyarak otomatik analiz ve hata yönetimi ile pivot tablolar ve gruplar oluşturmayı, tasarlamayı ve hesaplamayı öğreneceğiz.
Excel Pivot Tablosu Nedir?
Bir pivot tablo, Excel'in en güçlü araçlarından biridir. Buyuk veri setlerini ozetlemenin kolay bir yoludur ve .NET uygulamalarinda veri analizi icin paha bicilemezdir. Pivot tabloları, sayısal verileri kolayca görüntülemenizi, anlamanızı ve analiz etmenizi sağlar. Hem Excel'de hem de Google Sheets, Apple Numbers ve CSV Dışa Aktarımlarında mevcutturlar. Bilgileri anlamlı bir şekilde görmeyi sağlayan bir genel bakış çözümü sunarlar - insanlar için bir veri konsolu gibi davranarak bilgilerini görmelerine olanak tanır.
Kapsüllenmiş uygulamalar için, özet tabloları programlı bir şekilde oluşturmak, Docker görüntülerinizde Excel kurulumlarına olan ihtiyaçı ortadan kaldırarak, konteyner boyutunu ve dağıtım karmaşıklığını önemli ölçüde azaltır. Bu yaklaşım, modern CI/CD boru hatları ve kapsayıcı dağıtım stratejileri ile mükemmel bir şekilde hizalanır.
Önce bir özet tablo oluşturmanın yanlış yolunu inceleyelim, ardından C# ile doğru yolu öğrenelim:
C# Interop Kullanarak Excel Tablolarında Pivot Tablosu Nasıl Oluşturulur?
C# Excel Interop, COM otomasyonu aracılığıyla Excel'in pivot tablo işlevselliğine doğrudan erişim sağlar. İşte C#'ta pivot tablolar oluşturmak için araçlar ararken birçok geliştiricinin karşılaştığı geleneksel yaklaşım:
Bu Yaklaşım .NET'te Neden Demode Kabul Ediliyor?
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
// Create Excel application instance
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Data\SalesData.xlsx");
Excel.Worksheet xlSheet = (Excel.Worksheet)xlWorkbook.Sheets[1];
Excel.Worksheet xlPivotSheet = (Excel.Worksheet)xlWorkbook.Sheets.Add();
// Define data range for pivot table
Excel.Range dataRange = xlSheet.UsedRange;
// Row area and column area
// Create pivot cache and pivot table
Excel.PivotCache pivotCache = xlWorkbook.PivotCaches().Create(
Excel.XlPivotTableSourceType.xlDatabase,
dataRange,
Type.Missing);
Excel.PivotTable pivotTable = pivotCache.CreatePivotTable(
xlPivotSheet.Cells[3, 1],
"SalesPivot",
Type.Missing,
Type.Missing); // fields by field
// Configure pivot table fields
Excel.PivotField productField = (Excel.PivotField)pivotTable.PivotFields("Product");
productField.Orientation = Excel.XlPivotFieldOrientation.xlRowField;
productField.Position = 1;
Excel.PivotField regionField = (Excel.PivotField)pivotTable.PivotFields("Region");
regionField.Orientation = Excel.XlPivotFieldOrientation.xlColumnField;
regionField.Position = 1;
Excel.PivotField salesField = (Excel.PivotField)pivotTable.PivotFields("Sales");
pivotTable.AddDataField(salesField, "Sum of Sales", Excel.XlConsolidationFunction.xlSum);
// Save and cleanup
xlWorkbook.SaveAs(@"C:\Data\PivotReport.xlsx");
xlWorkbook.Close();
xlApp.Quit();
// Release COM objects to prevent memory leaks
Marshal.ReleaseComObject(pivotTable);
Marshal.ReleaseComObject(pivotCache);
Marshal.ReleaseComObject(xlPivotSheet);
Marshal.ReleaseComObject(xlSheet);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlApp);
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
// Create Excel application instance
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Data\SalesData.xlsx");
Excel.Worksheet xlSheet = (Excel.Worksheet)xlWorkbook.Sheets[1];
Excel.Worksheet xlPivotSheet = (Excel.Worksheet)xlWorkbook.Sheets.Add();
// Define data range for pivot table
Excel.Range dataRange = xlSheet.UsedRange;
// Row area and column area
// Create pivot cache and pivot table
Excel.PivotCache pivotCache = xlWorkbook.PivotCaches().Create(
Excel.XlPivotTableSourceType.xlDatabase,
dataRange,
Type.Missing);
Excel.PivotTable pivotTable = pivotCache.CreatePivotTable(
xlPivotSheet.Cells[3, 1],
"SalesPivot",
Type.Missing,
Type.Missing); // fields by field
// Configure pivot table fields
Excel.PivotField productField = (Excel.PivotField)pivotTable.PivotFields("Product");
productField.Orientation = Excel.XlPivotFieldOrientation.xlRowField;
productField.Position = 1;
Excel.PivotField regionField = (Excel.PivotField)pivotTable.PivotFields("Region");
regionField.Orientation = Excel.XlPivotFieldOrientation.xlColumnField;
regionField.Position = 1;
Excel.PivotField salesField = (Excel.PivotField)pivotTable.PivotFields("Sales");
pivotTable.AddDataField(salesField, "Sum of Sales", Excel.XlConsolidationFunction.xlSum);
// Save and cleanup
xlWorkbook.SaveAs(@"C:\Data\PivotReport.xlsx");
xlWorkbook.Close();
xlApp.Quit();
// Release COM objects to prevent memory leaks
Marshal.ReleaseComObject(pivotTable);
Marshal.ReleaseComObject(pivotCache);
Marshal.ReleaseComObject(xlPivotSheet);
Marshal.ReleaseComObject(xlSheet);
Marshal.ReleaseComObject(xlWorkbook);
Marshal.ReleaseComObject(xlApp);
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices
' Create Excel application instance
Dim xlApp As New Excel.Application()
Dim xlWorkbook As Excel.Workbook = xlApp.Workbooks.Open("C:\Data\SalesData.xlsx")
Dim xlSheet As Excel.Worksheet = CType(xlWorkbook.Sheets(1), Excel.Worksheet)
Dim xlPivotSheet As Excel.Worksheet = CType(xlWorkbook.Sheets.Add(), Excel.Worksheet)
' Define data range for pivot table
Dim dataRange As Excel.Range = xlSheet.UsedRange
' Create pivot cache and pivot table
Dim pivotCache As Excel.PivotCache = xlWorkbook.PivotCaches().Create(Excel.XlPivotTableSourceType.xlDatabase, dataRange, Type.Missing)
Dim pivotTable As Excel.PivotTable = pivotCache.CreatePivotTable(xlPivotSheet.Cells(3, 1), "SalesPivot", Type.Missing, Type.Missing)
' Configure pivot table fields
Dim productField As Excel.PivotField = CType(pivotTable.PivotFields("Product"), Excel.PivotField)
productField.Orientation = Excel.XlPivotFieldOrientation.xlRowField
productField.Position = 1
Dim regionField As Excel.PivotField = CType(pivotTable.PivotFields("Region"), Excel.PivotField)
regionField.Orientation = Excel.XlPivotFieldOrientation.xlColumnField
regionField.Position = 1
Dim salesField As Excel.PivotField = CType(pivotTable.PivotFields("Sales"), Excel.PivotField)
pivotTable.AddDataField(salesField, "Sum of Sales", Excel.XlConsolidationFunction.xlSum)
' Save and cleanup
xlWorkbook.SaveAs("C:\Data\PivotReport.xlsx")
xlWorkbook.Close()
xlApp.Quit()
' Release COM objects to prevent memory leaks
Marshal.ReleaseComObject(pivotTable)
Marshal.ReleaseComObject(pivotCache)
Marshal.ReleaseComObject(xlPivotSheet)
Marshal.ReleaseComObject(xlSheet)
Marshal.ReleaseComObject(xlWorkbook)
Marshal.ReleaseComObject(xlApp)
Bu Interop örneği, satırlarda Ürün, sütunlarda Bölge ve veri alanında toplam Satış ile yerel bir Excel pivot tablosu oluşturur. Bu yaklaşım işlevsel olmakla birlikte Microsoft Office kurulumu ve dikkatli bir şekilde COM nesne yönetimi gerektirir. Microsoft belgeleri, bu yaklaşımın neden modern olmadığını açıklar. DevOps perspektifinden bakıldığında, bu yaklaşım özellikle sorunludur çünkü etkili bir şekilde konteynerize edilemez - Microsoft Office'i bir Linux Docker konteynerine kuramaz veya sunucusuz ortamlara dağıtamazsınız.
C# Interop Ne Tür Sorunlar Yaratır?
Interop yaklaşımı, modern DevOps uygulamaları ve bulut yerel dağıtımları için uygun olmayan birçok önemli zorluk sunar.
Maalesef, Stack Overflow ve diğer programlama web siteleri hala onu önermeye devam ediyor çünkü 2000'lerin başlarından kalma başlıklarla zamanın içinde sıkışmış durumdalar.
Dağıtım Bağımlılıkları: Kaynak kodunun çalıştırıldığı her makinede, üretim sunucuları dahil, Microsoft Office kurulumu gerektirir. Bu, lisanslama maliyetlerini ve dağıtım karmaşıklığını artırır.
Hafıza Yönetimi: COM nesneleri, Marshal.ReleaseComObject() kullanılarak açıkça serbest bırakılmalıdır. Eksik olan tek bir nesne bile Excel işlemlerinin hafızada takılmasına neden olur, bu durum Stack Overflow'da kapsamlı bir şekilde belgelenmiştir. Pivot önbelleğini dikkate alın.
Platform Kısıtlamaları: Bu çözüm yalnızca Windows'ta ve Office yüklü bilgisayarlarda çalışır. Ciddi yavaşlamalara ve bellek sızıntılarına yol açabilir. Linux, macOS, Docker konteynerleri veya Azure Functions gibi bulut platformları için destek yoktur. Bu, dağıtım seçeneklerini ciddi şekilde sınırlar ve modern konteyner orkestrasyon platformlarının kullanımını engeller.
Performans Sorunları: Excel uygulama örneklerini başlatmak yavaş ve kaynak yoğun olup, özellikle sunucu taraflı işlemler için zorludur.
Sürüm Uyumluluğu: Farklı Office sürümleri, ortamlar arasında uyumluluk sorunlarına neden olabilen farklı COM arayüzlerine sahip olabilir.
IronXL, Interop Olmadan Programlı Olarak Bir Pivot Tabloyu Nasıl Oluşturur?
IronXL, pivot tablo oluşturmayı farklı bir şekilde ele alır, COM bağımlılıkları olmadan yönetilen kod kullanır. Yerel Excel pivot tabloları oluşturmuyor olsa da, konteynerize edilmiş dağıtımlar ve bulut tabanlı mimariler için mükemmel olan güçlü toplama yetenekleri sunar. Kutuphanenin performans iyileştirmeleri, 19,5 GB'den 1 GB'ın altına düşen bellek kullanımı ve 40 kat hız artışı ile kaynak kısıtlı konteyner ortamları için ideal hale getirir.
Bu Yaklaşımı XLSX veya XLS Dosyaları için Modern Yapan Nedir?
using IronXL;
using System.Linq;
using System.Data; // Keep this namespace
using static System.Data.DataTableExtensions; // Use 'using static' for DataTableExtensions
class Program
{
static void Main(string[] args)
{
// Load Excel file - no Office required
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet dataSheet = workbook.WorkSheets[0];
// Convert to DataTable for powerful manipulation
var dataTable = dataSheet.ToDataTable(true); // true = use first row as column headers
// Create pivot-style aggregation using LINQ
var pivotData = dataTable.AsEnumerable()
.GroupBy(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
}) //range
.Select(g => new {
Product = g.Key.Product,
Region = g.Key.Region,
TotalSales = g.Sum(row => Convert.ToDecimal(row["Sales"])),
AverageSale = g.Average(row => Convert.ToDecimal(row["Sales"])),
Count = g.Count()
});
// Create pivot report worksheet
WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport");
// Build cross-tabulation structure
var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p);
var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r);
// Create headers
pivotSheet["A1"].Value = "Product/Region";
int col = 2;
foreach (var region in regions)
{
pivotSheet[$"{(char)('A' + col - 1)}1"].Value = region; // string
col++;
}
// Populate pivot data
int row = 2;
foreach (var product in products)
{
pivotSheet[$"A{row}"].Value = product;
col = 2;
foreach (var region in regions)
{
var sales = pivotData
.Where(p => p.Product == product && p.Region == region)
.Select(p => p.TotalSales)
.FirstOrDefault();
pivotSheet[$"{(char)('A' + col - 1)}{row}"].Value = sales;
col++;
}
row++;
}
// Add totals using Excel formulas
pivotSheet[$"A{row}"].Value = "Total"; // grand totals
for (int c = 2; c <= regions.Count() + 1; c++)
{
pivotSheet[$"{(char)('A' + c - 1)}{row}"].Formula = $"=SUM({(char)('A' + c - 1)}2:{(char)('A' + c - 1)}{row - 1})";
}
// Proceeding to apply formatting
var dataRange = pivotSheet[$"B2:{(char)('A' + regions.Count())}{row}"];
dataRange.FormatString = "$#,##0.00";
workbook.SaveAs("PivotReport.xlsx");
}
}
using IronXL;
using System.Linq;
using System.Data; // Keep this namespace
using static System.Data.DataTableExtensions; // Use 'using static' for DataTableExtensions
class Program
{
static void Main(string[] args)
{
// Load Excel file - no Office required
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet dataSheet = workbook.WorkSheets[0];
// Convert to DataTable for powerful manipulation
var dataTable = dataSheet.ToDataTable(true); // true = use first row as column headers
// Create pivot-style aggregation using LINQ
var pivotData = dataTable.AsEnumerable()
.GroupBy(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
}) //range
.Select(g => new {
Product = g.Key.Product,
Region = g.Key.Region,
TotalSales = g.Sum(row => Convert.ToDecimal(row["Sales"])),
AverageSale = g.Average(row => Convert.ToDecimal(row["Sales"])),
Count = g.Count()
});
// Create pivot report worksheet
WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport");
// Build cross-tabulation structure
var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p);
var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r);
// Create headers
pivotSheet["A1"].Value = "Product/Region";
int col = 2;
foreach (var region in regions)
{
pivotSheet[$"{(char)('A' + col - 1)}1"].Value = region; // string
col++;
}
// Populate pivot data
int row = 2;
foreach (var product in products)
{
pivotSheet[$"A{row}"].Value = product;
col = 2;
foreach (var region in regions)
{
var sales = pivotData
.Where(p => p.Product == product && p.Region == region)
.Select(p => p.TotalSales)
.FirstOrDefault();
pivotSheet[$"{(char)('A' + col - 1)}{row}"].Value = sales;
col++;
}
row++;
}
// Add totals using Excel formulas
pivotSheet[$"A{row}"].Value = "Total"; // grand totals
for (int c = 2; c <= regions.Count() + 1; c++)
{
pivotSheet[$"{(char)('A' + c - 1)}{row}"].Formula = $"=SUM({(char)('A' + c - 1)}2:{(char)('A' + c - 1)}{row - 1})";
}
// Proceeding to apply formatting
var dataRange = pivotSheet[$"B2:{(char)('A' + regions.Count())}{row}"];
dataRange.FormatString = "$#,##0.00";
workbook.SaveAs("PivotReport.xlsx");
}
}
Imports IronXL
Imports System.Linq
Imports System.Data ' Keep this namespace
Imports static System.Data.DataTableExtensions ' Use 'using static' for DataTableExtensions
Module Program
Sub Main(args As String())
' Load Excel file - no Office required
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
Dim dataSheet As WorkSheet = workbook.WorkSheets(0)
' Convert to DataTable for powerful manipulation
Dim dataTable = dataSheet.ToDataTable(True) ' true = use first row as column headers
' Create pivot-style aggregation using LINQ
Dim pivotData = dataTable.AsEnumerable() _
.GroupBy(Function(row) New With {
Key .Product = row("Product").ToString(),
Key .Region = row("Region").ToString()
}) _
.Select(Function(g) New With {
Key .Product = g.Key.Product,
Key .Region = g.Key.Region,
Key .TotalSales = g.Sum(Function(row) Convert.ToDecimal(row("Sales"))),
Key .AverageSale = g.Average(Function(row) Convert.ToDecimal(row("Sales"))),
Key .Count = g.Count()
})
' Create pivot report worksheet
Dim pivotSheet As WorkSheet = workbook.CreateWorkSheet("PivotReport")
' Build cross-tabulation structure
Dim products = pivotData.Select(Function(p) p.Product).Distinct().OrderBy(Function(p) p)
Dim regions = pivotData.Select(Function(p) p.Region).Distinct().OrderBy(Function(r) r)
' Create headers
pivotSheet("A1").Value = "Product/Region"
Dim col As Integer = 2
For Each region In regions
pivotSheet($"{ChrW(AscW("A"c) + col - 1)}1").Value = region ' string
col += 1
Next
' Populate pivot data
Dim row As Integer = 2
For Each product In products
pivotSheet($"A{row}").Value = product
col = 2
For Each region In regions
Dim sales = pivotData _
.Where(Function(p) p.Product = product AndAlso p.Region = region) _
.Select(Function(p) p.TotalSales) _
.FirstOrDefault()
pivotSheet($"{ChrW(AscW("A"c) + col - 1)}{row}").Value = sales
col += 1
Next
row += 1
Next
' Add totals using Excel formulas
pivotSheet($"A{row}").Value = "Total" ' grand totals
For c As Integer = 2 To regions.Count() + 1
pivotSheet($"{ChrW(AscW("A"c) + c - 1)}{row}").Formula = $"=SUM({ChrW(AscW("A"c) + c - 1)}2:{ChrW(AscW("A"c) + c - 1)}{row - 1})"
Next
' Proceeding to apply formatting
Dim dataRange = pivotSheet($"B2:{ChrW(AscW("A"c) + regions.Count())}{row}")
dataRange.FormatString = "$#,##0.00"
workbook.SaveAs("PivotReport.xlsx")
End Sub
End Module
İşte pivot tabloları kapsayıcı dostu bir şekilde oluşturmanın yolu. Bu yaklaşım, Docker konteynerlerinde, Kubernetes podlarında ve sunucusuz fonksiyonlarda herhangi bir dış bağımlılık olmadan sorunsuz bir şekilde çalışır. Uygulamanın tamamı, .NET desteklenen her yerde çalışabilen hafif bir konteyner imajı olarak paketlenebilir.
Özet Tablosu Çıktısı Neye Benzer?

Çıktı, IronXL'nin ham satış verilerini yapılandırılmış bir pivot raporuna nasıl dönüştürdüğünü, Excel kurulumunu gerektirmediğini gösteriyor; bu da onu CI/CD (Sürekli Entegrasyon/Sürekli Teslim) süreçlerinde otomatik raporlama için mükemmel kılıyor.
IronXL Formülleri ile Dinamik Özetler Nasıl Oluşturulur?
Dinamik güncellemeler gerektiren ve pivot tablo yenileme işlevselliğine benzer senaryolar için, IronXL, Excel'in yerleşik formüllerini kullanabilir. Bu yaklaşım tercih edilir - verileriniz çok daha modern ve zarif bir şekilde işlenir. Kod, destek ekibiyle iletişime geçmeye veya kılavuzları okumaya gerek kalmadan kolaylıkla anlaşılabilir ve kurulabilir. Bu yaklaşım, formüle dayalı hesaplamaların otomatik olarak güncellendiği kapsüllenmiş ortamlarda özellikle değerlidir.
Formül Tabanlı Özetler Otomatik Olarak Nasıl Güncellenir?
// Load the workbook
WorkBook workbook = WorkBook.Load(inputPath);
// Rename the first worksheet so formulas reference correctly
WorkSheet dataSheet = workbook.WorkSheets[0];
dataSheet.Name = "DataSheet";
// Convert worksheet to DataTable
DataTable dataTable = dataSheet.ToDataTable(true);
// Create new summary worksheet
WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary");
// Get unique product-region combinations
var uniqueCombos = dataTable.AsEnumerable()
.Select(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
})
.Distinct()
.OrderBy(x => x.Product)
.ThenBy(x => x.Region);
// Add header row
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Region";
summarySheet["C1"].Value = "Total Sales";
summarySheet["D1"].Value = "Count";
// Populate rows with formulas
int rowIndex = 2;
foreach (var combo in uniqueCombos)
{
summarySheet[$"A{rowIndex}"].Value = combo.Product;
summarySheet[$"B{rowIndex}"].Value = combo.Region;
// Adjust column references if your Sales column is C (not D)
summarySheet[$"C{rowIndex}"].Formula =
$"=SUMIFS(DataSheet!C:C,DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")";
summarySheet[$"D{rowIndex}"].Formula =
$"=COUNTIFS(DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")";
rowIndex++;
}
// Optional: add total row
summarySheet[$"A{rowIndex}"].Value = "Total";
summarySheet[$"C{rowIndex}"].Formula = $"=SUM(C2:C{rowIndex - 1})";
summarySheet[$"D{rowIndex}"].Formula = $"=SUM(D2:D{rowIndex - 1})";
// Save output file
workbook.SaveAs(outputPath); //filename
// Load the workbook
WorkBook workbook = WorkBook.Load(inputPath);
// Rename the first worksheet so formulas reference correctly
WorkSheet dataSheet = workbook.WorkSheets[0];
dataSheet.Name = "DataSheet";
// Convert worksheet to DataTable
DataTable dataTable = dataSheet.ToDataTable(true);
// Create new summary worksheet
WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary");
// Get unique product-region combinations
var uniqueCombos = dataTable.AsEnumerable()
.Select(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
})
.Distinct()
.OrderBy(x => x.Product)
.ThenBy(x => x.Region);
// Add header row
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Region";
summarySheet["C1"].Value = "Total Sales";
summarySheet["D1"].Value = "Count";
// Populate rows with formulas
int rowIndex = 2;
foreach (var combo in uniqueCombos)
{
summarySheet[$"A{rowIndex}"].Value = combo.Product;
summarySheet[$"B{rowIndex}"].Value = combo.Region;
// Adjust column references if your Sales column is C (not D)
summarySheet[$"C{rowIndex}"].Formula =
$"=SUMIFS(DataSheet!C:C,DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")";
summarySheet[$"D{rowIndex}"].Formula =
$"=COUNTIFS(DataSheet!A:A,\"{combo.Product}\",DataSheet!B:B,\"{combo.Region}\")";
rowIndex++;
}
// Optional: add total row
summarySheet[$"A{rowIndex}"].Value = "Total";
summarySheet[$"C{rowIndex}"].Formula = $"=SUM(C2:C{rowIndex - 1})";
summarySheet[$"D{rowIndex}"].Formula = $"=SUM(D2:D{rowIndex - 1})";
// Save output file
workbook.SaveAs(outputPath); //filename
Imports System.Data
Imports System.Linq
' Load the workbook
Dim workbook As WorkBook = WorkBook.Load(inputPath)
' Rename the first worksheet so formulas reference correctly
Dim dataSheet As WorkSheet = workbook.WorkSheets(0)
dataSheet.Name = "DataSheet"
' Convert worksheet to DataTable
Dim dataTable As DataTable = dataSheet.ToDataTable(True)
' Create new summary worksheet
Dim summarySheet As WorkSheet = workbook.CreateWorkSheet("DynamicSummary")
' Get unique product-region combinations
Dim uniqueCombos = dataTable.AsEnumerable() _
.Select(Function(row) New With {
.Product = row("Product").ToString(),
.Region = row("Region").ToString()
}) _
.Distinct() _
.OrderBy(Function(x) x.Product) _
.ThenBy(Function(x) x.Region)
' Add header row
summarySheet("A1").Value = "Product"
summarySheet("B1").Value = "Region"
summarySheet("C1").Value = "Total Sales"
summarySheet("D1").Value = "Count"
' Populate rows with formulas
Dim rowIndex As Integer = 2
For Each combo In uniqueCombos
summarySheet($"A{rowIndex}").Value = combo.Product
summarySheet($"B{rowIndex}").Value = combo.Region
' Adjust column references if your Sales column is C (not D)
summarySheet($"C{rowIndex}").Formula = $"=SUMIFS(DataSheet!C:C,DataSheet!A:A,""{combo.Product}"",DataSheet!B:B,""{combo.Region}"")"
summarySheet($"D{rowIndex}").Formula = $"=COUNTIFS(DataSheet!A:A,""{combo.Product}"",DataSheet!B:B,""{combo.Region}"")"
rowIndex += 1
Next
' Optional: add total row
summarySheet($"A{rowIndex}").Value = "Total"
summarySheet($"C{rowIndex}").Formula = $"=SUM(C2:C{rowIndex - 1})"
summarySheet($"D{rowIndex}").Formula = $"=SUM(D2:D{rowIndex - 1})"
' Save output file
workbook.SaveAs(outputPath) ' filename
Bu formüller, kaynak verilerle canlı bağlantıları sürdürür ve veri sayfası değiştiğinde otomatik olarak güncellenir - pivot tablo yenileme davranışına benzer ancak Interop bağımlılıkları olmadan. Bu yaklaşım, dış bağımlılıklara ihtiyaç duymadan dinamik raporlar oluşturması gereken konteynerize mikro hizmetler için idealdir.
Dinamik Özetlerden Ne Tür Sonuçlar Bekleyebilirsiniz?
Önceki örnekteki Excel dosyasına bu kodu uygularsak, bu çıktıyı elde ederiz:

Dinamik özet yaklaşımı, kaynak verilerde değişiklik olduğunda otomatik olarak güncellenen gerçek zamanlı hesaplamalar sağlar, bu da onu konteynerlize edilmiş ortamlarda otomatik raporlama hatları için mükemmel kılar. Bu, planlanmış özet tablo yenilemelerine olan ihtiyaçı ortadan kaldırır ve .NET MAUI ve Blazor uygulamalarında sorunsuz bir şekilde çalışır.
C# Interop ve IronXL ile Pivot Tabloları Nasıl Karşılaştırmalısınız?
|
Aspekt |
C# Interop |
IronXL |
|---|---|---|
|
Ofis Gerekli |
Evet - Tam kurulum |
No - Bağımsız kütüphane |
|
Platform Desteği |
Sadece Windows |
Windows, Linux, macOS, Docker |
|
Bellek Yönetimi |
Manuel COM temizleme gerektirir |
Otomatik .NET çöp toplayıcı |
|
Dağıtım |
Karmaşık - Ofis lisanslama |
Basit - Tek DLL |
|
Performans |
Yavaş - Excel işlem başlangıcı |
Hızlı - Bellek içi hesaplamalar |
|
Bulut Uyumlu |
Hayır - Azure kısıtlamaları |
Evet - Azure Fonksiyonları desteği |
|
Yerel Pivot Tablolar |
Evet |
Hayır - Toplam alternatifleri |
|
Geliştirme Hızı |
Yavaş - COM karmaşıklığı |
Hızlı - Sezgisel API |
|
Kapsayıcı Desteği |
Hayır - Ofisi konteyner haline getiremez |
Evet - Docker uyumlu |
|
Sağlık Kontrolleri |
Zor - COM işlem izleme |
Kolay - Standart .NET izleme |
DevOps perspektifinden bakıldığında, IronXL'nin mimarisi, modern dağıtım senaryoları için önemli avantajlar sunar. Kütüphanenin, harici bağımlılıklar olmadan konteynerlerde çalışabilme yeteneği, hızlı dağıtılan ve verimli ölçeklenen hafif Docker görüntüleri oluşturmanıza olanak tanır. Sağlık kontrolleri standart .NET kalıpları kullanılarak uygulanabilir ve kütüphanenin güvenlik özellikleri, DigiCert sertifikasyonu ve herhangi bir COM arayüzü içermeyerek saldırı vektörlerini azaltır.
Hangi Yaklaşımı Seçmelisiniz?
Ne Zaman C# Interop Kullanmalısınız?
C# Interop seçin:
- Yerel Excel pivot tablo nesneleri kesinlikle gerekiyorsa
- Yalnızca Windows üzerinde, her yerde yüklü Office ile çalışıyorsanız
- Yönettiğiniz masaüstü sistemlere dağıtıyorsanız
- Mevcut eski kod, Interop'a bağlıysa
- Eski .NET Framework sürümlerini kullanıyorsanız
- Konteynerize etme veya buluta taşıma planlarınız yoksa.
Ne Zaman IronXL Daha İyi Sonuç Verir?
IronXL seçin:
- Sunuculara veya bulut ortamlarına (Azure, AWS) dağıtılıyorsa.
- Konteynerlerde çalışan platformlar arası uygulamalar inşa ediyorsanız
- Daha iyi performans gerektiriyorsa 40 kat hız artışları
- Office lisanslama maliyetlerini ve dağıtım karmaşıklığını önlemek istiyorsanız
- Otomatik lisans anahtarı yönetimi ile daha basit kod gerekiyorsa
- Mac, iOS, Android ve Linux sistemlerini destekliyorsa
- Modern .NET Core ve .NET 5-10 üzerinde çalışıyorsanız
- Pivot tablo alanlarını programlı olarak yapılandırıyorsanız
- Farklı formatlara ihracat yapan mik-roservices oluşturuyorsanız
- CI/CD boru hatlarında otomatik raporlama uyguluyorsanız
- Konteyner orkestrasyonu için sağlık kontrol noktaları oluşturuyorsanız
- Farklı hesap tablosu formatları arasında dönüşüm yapıyorsanız
C# ile Pivot Tablolar Oluşturma Hakkında Ne Öğrendik?
C# Excel Interop, yerel pivot tablolar oluşturabilse de, dağıtım kısıtlamaları ve karmaşıklığı, özellikle konteynerleştirilmiş ortamlarda modern uygulamalar için giderek daha pratik olmayan hale getirmektedir. IronXL, veri toplama ve formül tabanlı özetlemeler yoluyla güçlü alternatifler sunar, Office bağımlılıklarını ortadan kaldırırken analitik yetenekleri korur.
Interop olmadan pivot tablolar geliştirmek için alternatifler arayan geliştiriciler ve DevOps mühendisleri için IronXL, tüm platformlarda çalışan ve dağıtımı basitleştiren, COM karmaşıklıklarından kaçınan üstün bir yol sunar. Yerel pivot nesnelerin olmaması, daha büyük esneklik, daha iyi performans ve Office lisanslama gereksinimlerinin ortadan kaldırılması ile dengelenir. DevOps ekipleri için en önemlisi, IronXL, kapsüllü dağıtımlar, otomatik ölçeklendirme ve modern CI/CD boru hatlarına kesintisiz entegrasyon ile kod olarak gerçek altyapıyı etkinleştirir.
Kütüphanenin kapsamlı özellik seti, koşullu biçimlendirme, hücre biçimlendirme, formül desteği ve veri doğrulama gibi özellikleri içerir ve modern .NET uygulamalarında Excel otomasyonu için eksiksiz bir çözüm sunar. CSV dosyalarıyla çalışıyorsanız, çalışma sayfalarını yönetiyorsanız veya karmaşık veri dönüşümleri uyguluyorsanız, IronXL sürekli, dağıtıma uygun bir API sağlar.
Excel otomasyonunuzu modernize etmeye ve modern C#'ta pivot tablo kodu oluşturmak için hazır mısınız?
IronXL, NuGet Paket Yöneticisi aracılığıyla C# uygulamalarınıza saniyeler içinde entegre edilebilir. Üretim uygulamalarınızdaki Interop bağımlılıklarını ortadan kaldırmak ve konteyner dağıtımlarınızı basitleştirmek için ücretsiz denemeyi deneyin.
Sıkça Sorulan Sorular
Excel'de özet tablo nedir?
Excel'deki bir özet tablo, verileri özetlemek, analiz etmek, keşfetmek ve sunmak için kullanılan güçlü bir araçtır. Kullanıcıların sütunları satırlara ve tersi çevirmesine olanak tanıyarak dinamik veri analizi yapmayı sağlar.
Neden C#'ta Excel özet tabloları oluşturmak için IronXL kullanmalıyım?
IronXL, Ofis Interop'a bağlı kalmadan C#'ta Excel özet tabloları oluşturmayı sağlar, böylece Excel kurulumlarına ihtiyaç duymadan bağımlılıkları azaltır ve modern ve etkili bir seçim haline gelir.
IronXL, C# Interop ile karşılaştırıldığında Excel işlemleri için nasıldır?
IronXL, Office kurulumları gerektiren C# Interop'a kıyasla daha akıcı ve bağımsız bir yaklaşım sunar. IronXL, Interop'un karmaşıklıkları olmadan özet tablolar ve diğer Excel işlemlerini basitleştirir.
Excel yüklü olmadan özet tablolar oluşturabilir miyim?
Evet, IronXL kullanarak, Excel kurulu olmasa bile C# uygulamalarınızda özet tablolar oluşturabilirsiniz çünkü Microsoft Office'ten bağımsız çalışır.
IronXL büyük veri kümeleri için uygun mu?
IronXL, büyük veri setlerini verimli bir şekilde işlemek için tasarlanmıştır, bu da yorucu veri manipülasyonu ve özet tablo üretimi gerektiren uygulamalar için uygun hale getirir.
Geleneksel yöntemler yerine IronXL kullanmanın avantajları nelerdir?
IronXL, Excel kurulumları gerektirmeyen, C# Interop gibi geleneksel yöntemlere modern, bağımsız bir alternatif sunar. Kullanımı kolay, esnek ve karmaşık veri işlemleri için destektir.
IronXL ile özet tablolar için VBA öğrenmem gerekiyor mu?
Hayır, IronXL geliştiricilerin C# içinde doğrudan çalışarak özet tablolar oluşturup yönetmesine olanak tanır, VBA veya diğer Excel'e özgü programlama dillerini öğrenmeye gerek yoktur.




