IronXL Kullanarak C# ile Excel'de Pivot Tablo Nasıl Oluşturulur
Excel'de döner tabloları programatik olarak oluşturmak, ya Office bağımlılıkları ile C# Interop kullanmayı ya da IronXL gibi modern bir kütüphaneyi kullanmayı gerektirir -- bu eğitim her iki yaklaşımı da gösterir ve neden modern yolun daha iyi bir seçim olduğunu tam olarak açıklar.
Sunucu tarafı veya çapraz platform .NET kodunda döner tablo tarzındaki raporlar inşa etmek tarihsel olarak zordu. Geleneksel COM Interop yolu, sizi Windows makinesi ve tam bir Office yüklemesi ile bağlar, bir tek COM temizleme çağrısını kaçırırsanız bellek sızıntıları oluşturur ve Linux veya Docker konteynerine dağıtmayı denediğiniz anda dağılır. Modern alternatif -- IronXL ve LINQ ile toplama mantığı yazmak -- .NET'in çalıştığı her yerde çalışır, Office lisansı gerektirmez ve sizlere temiz, okunabilir kod sunar.
Bu kılavuz her iki tekniği de detaylandırarak ele alır. Ham Interop yöntemini göreceksiniz, onun neden kırılgan olduğunu anlayacaksınız ve ardından C#'ta IronXL kullanarak aynı döner tablo tarzı özet sayfasını oluşturacaksınız. Ayrıca, gerçek bir döner tablonun yenilenmesi gibi davranan canlı, otomatik olarak güncellenen özetler için Excel formüllerini nasıl kullanacağınızı da göreceksiniz.
Excel Pivot Tablosu Nedir?
Döner tablo, hesap tablosu yazılımının en güçlü analitik araçlarından biridir. Büyük veri kümelerini satırları gruplandırarak, değerleri toplayarak ve sonuçları çapraz tablolama düzenine yansıtılarak özetler. Bir tek formül bile manuel olarak yazmanızı gerektirmez. Microsoft'un resmi döner tablo dokümantasyonu, bu özelliğin Excel içinde ne yaptığını kapsamlı bir şekilde gözden geçirir.
Döner tablolar Microsoft Excel, Google Sheets, Apple Numbers ve çoğu diğer hesap tablosu araçlarında görünür. Ana konsept her zaman aynıdır: Satır alanlarını, sütun alanlarını ve değer alanlarını tanımlarsınız ve araç size bir özet matrisi inşa eder. Temel veriler değiştiğinde döner tabloyu yenilersiniz ve özet otomatik olarak güncellenir.
C# sunucu tarafı kodunda, iki geniş seçeneğiniz var:
- C# Interop -- XLSX dosyası içinde gerçek bir yerel pivot tablo nesnesi oluşturmak için bir Excel işlemine COM üzerinden otomasyon sağlar
- IronXL ile LINQ toplama -- Çalışma kitabını belleğe okur, aynı özeti yönetilen .NET kodunda hesaplar ve sonucu yeni bir çalışma sayfasına yazar
Her iki seçenek de faydalı bir çıktı üretir. Ancak sadece bir tanesi modern dağıtım ortamlarında güvenilir çalışır.
C# Interop Kullanarak Döner Tabloları Nasıl Oluşturursunuz?
C# Excel Interop, COM otomasyonu aracılığıyla Excel'in yerel döner tablo işlevselliğine doğrudan erişim sağlar. Bir Excel.Application nesnesi oluşturup, bir çalışma kitabı açarak, bir veri aralığını işaret eden bir pivot önbelleği tanımlar ve ardından satır, sütun ve veri alanlarını yapılandırırsınız.
Interop Pivot Tablo Kodunu Nasıl Ayarlarsınız?
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;
// 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);
// 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;
// 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);
// 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. XLSX dosyası içinde gerçek bir döner tablo nesnesi üretse de, bunun için Microsoft Office'in kurulu olması gerekir ve dikkatli COM nesne yönetimi gerektirir. Tek bir Marshal.ReleaseComObject çağrısını kaçırın ve Görev Yöneticisi'nde eski Excel süreçlerinin biriktiğini göreceksiniz.
Herhangi Bir Kod Yazmadan Önce IronXL Nasıl Kurulur
IronXL yöntemine geçmeden önce, NuGet Paket Yöneticisi aracılığıyla kütüphaneyi yükleyin:
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Sunucu, konteyner veya geliştirme makinesinde Office kurulumu gerekmez. IronXL, XLSX, XLS ve CSV dosyalarını tamamen yönetilen .NET belleğinde okur ve yazar.
C# Interop Ne Tür Sorunlar Yaratır?
Interop yöntemi, gerçek dünya dağıtımında hızla bileşikleşen birkaç önemli zorluk sunar. Stack Overflow ve diğer programlama kaynakları bunu tavsiye etmeye devam ediyor çünkü birçok konu 2000'lerin başında yazıldı ve o zamandan beri kilitli kaldı -- dolayısıyla tavsiyeler zaman içinde donup kaldı.
Dağıtım bağımlılıkları -- kodunuzu çalıştıran her makinede, üretim sunucuları ve CI/CD derleme ajanları dahil olmak üzere lisanslı bir Microsoft Office kopyasının kurulu olması gerekir. Bu, hem lisanslama maliyeti hem de dağıtım karmaşıklığı ekler ve modern alternatifler ile tamamen kaçınılabilirdir.
Hafıza yönetim yükü -- COM nesneleri, Marshal.ReleaseComObject() kullanılarak açıkça serbest bırakılmalıdır. Bir nesne bile kaçırılırsa, Excel süreçleri bellek içinde süresiz olarak askıda kalır, Stack Overflow üzerinde ayrıntılı belgelenmiştir. Uzun süre çalışan bir hizmet veya bir ASP.NET web uygulaması içinde, bu kritik bir kaynak sızıntısı haline gelir.
Platform kısıtlamaları -- Interop yalnızca Office kurulu Windows üzerinde çalışır. Bunu Linux, macOS, Docker konteynerlerinde veya Azure Functions veya AWS Lambda gibi sunucusuz platformlarda çalıştıramazsınız. Bu, sizi tamamen modern bulut tabanlı mimarilerden engeller.
Performans dar boğazları -- bir Excel uygulaması örneğinin başlatılması yavaş ve kaynak açısından yoğun bir işlemdir. Sunucu tarafı toplu işlemde, düzinelerce veya yüzlerce rapor üretmeniz gerektiğinde, bu başlatma süresi ciddi bir veri işleme kısıtlaması haline gelir.
Sürüm uyumluluğu kırılganlığı -- farklı Office sürümleri biraz farklı COM arayüzlerini açığa çıkarır. Office 2019'da çalışan bir kod, Office 2016 veya Microsoft 365'te farklı davranabilir ve bir dağıtımda sürümü sabitlemenin bir yolu yoktur. Microsoft'un Office Interop derlemeleri üzerine belgeleri bu sürüm kısıtlamalarını bilinen bir sınırlama olarak belirtir.
CI/CD uyumsuzluğu -- çoğu sürekli entegrasyon ortamında Office kurulu değildir. Döner tablo oluşturma kodunuzu test etmek, ya tüm COM katmanını taklit etmeyi ya da lisanslı bir Office kurulumu olan özel bir Windows ajanı korumayı gerektirir.
Herhangi bir yeni .NET uygulaması için .NET 6 veya daha üzerini hedefleyen -- .NET 10 dahil -- bu kısıtlamalar Interop'u pratik olmayan bir seçenek haline getirir.
IronXL, Interop Kullanılmadan Döner Tabloları Nasıl Yaratır?
IronXL döner tablo oluşturma işlemini farklı bir şekilde ele alır. COM aracılığıyla bir dış Excel sürecini kontrol etmek yerine, IronXL çalışma kitabınızı yönetilen .NET belleğine okur, sizlere hücre değerlerine, formüllere ve çalışma sayfası yapısına doğrudan erişim sağlar. Daha sonra standart LINQ sorgularını kullanarak döner tablo tarzı topluluk inşa edersiniz ve sonuçları yeni bir çalışma sayfasına geri yazarsınız.
IronXL ve LINQ ile Çapraz Tablo Özeti Nasıl Oluşturulur
Aşağıdaki örnek bir satış verisi çalışma kitabını yükler, ürün-bölge adlı çapraz tablolu bir özet hesaplar ve özeti yeni bir çalışma sayfasına yazar -- hiçbir Office bağımlılığı olmadan:
using IronXL;
using System.Linq;
using System.Data;
// Load Excel file -- no Office installation required
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet dataSheet = workbook.WorkSheets[0];
// Convert to DataTable for flexible LINQ manipulation
var dataTable = dataSheet.ToDataTable(true); // true = first row as column headers
// Build pivot-style aggregation using LINQ grouping
var pivotData = dataTable.AsEnumerable()
.GroupBy(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
})
.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 the pivot report worksheet
WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport");
// Get distinct row and column values
var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p).ToList();
var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r).ToList();
// Write column headers
pivotSheet["A1"].Value = "Product / Region";
for (int c = 0; c < regions.Count; c++)
{
pivotSheet[$"{(char)('B' + c)}1"].Value = regions[c];
}
// Populate data rows
for (int r = 0; r < products.Count; r++)
{
pivotSheet[$"A{r + 2}"].Value = products[r];
for (int c = 0; c < regions.Count; c++)
{
var sales = pivotData
.Where(p => p.Product == products[r] && p.Region == regions[c])
.Select(p => p.TotalSales)
.FirstOrDefault();
pivotSheet[$"{(char)('B' + c)}{r + 2}"].Value = sales;
}
}
// Add a totals row using Excel SUM formulas
int totalRow = products.Count + 2;
pivotSheet[$"A{totalRow}"].Value = "Total";
for (int c = 0; c < regions.Count; c++)
{
char col = (char)('B' + c);
pivotSheet[$"{col}{totalRow}"].Formula = $"=SUM({col}2:{col}{totalRow - 1})";
}
// Apply currency formatting to the data range
var dataRange = pivotSheet[$"B2:{(char)('B' + regions.Count - 1)}{totalRow}"];
dataRange.FormatString = "$#,##0.00";
workbook.SaveAs("PivotReport.xlsx");
using IronXL;
using System.Linq;
using System.Data;
// Load Excel file -- no Office installation required
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet dataSheet = workbook.WorkSheets[0];
// Convert to DataTable for flexible LINQ manipulation
var dataTable = dataSheet.ToDataTable(true); // true = first row as column headers
// Build pivot-style aggregation using LINQ grouping
var pivotData = dataTable.AsEnumerable()
.GroupBy(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
})
.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 the pivot report worksheet
WorkSheet pivotSheet = workbook.CreateWorkSheet("PivotReport");
// Get distinct row and column values
var products = pivotData.Select(p => p.Product).Distinct().OrderBy(p => p).ToList();
var regions = pivotData.Select(p => p.Region).Distinct().OrderBy(r => r).ToList();
// Write column headers
pivotSheet["A1"].Value = "Product / Region";
for (int c = 0; c < regions.Count; c++)
{
pivotSheet[$"{(char)('B' + c)}1"].Value = regions[c];
}
// Populate data rows
for (int r = 0; r < products.Count; r++)
{
pivotSheet[$"A{r + 2}"].Value = products[r];
for (int c = 0; c < regions.Count; c++)
{
var sales = pivotData
.Where(p => p.Product == products[r] && p.Region == regions[c])
.Select(p => p.TotalSales)
.FirstOrDefault();
pivotSheet[$"{(char)('B' + c)}{r + 2}"].Value = sales;
}
}
// Add a totals row using Excel SUM formulas
int totalRow = products.Count + 2;
pivotSheet[$"A{totalRow}"].Value = "Total";
for (int c = 0; c < regions.Count; c++)
{
char col = (char)('B' + c);
pivotSheet[$"{col}{totalRow}"].Formula = $"=SUM({col}2:{col}{totalRow - 1})";
}
// Apply currency formatting to the data range
var dataRange = pivotSheet[$"B2:{(char)('B' + regions.Count - 1)}{totalRow}"];
dataRange.FormatString = "$#,##0.00";
workbook.SaveAs("PivotReport.xlsx");
Imports IronXL
Imports System.Linq
Imports System.Data
' Load Excel file -- no Office installation required
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
Dim dataSheet As WorkSheet = workbook.WorkSheets(0)
' Convert to DataTable for flexible LINQ manipulation
Dim dataTable As DataTable = dataSheet.ToDataTable(True) ' True = first row as column headers
' Build pivot-style aggregation using LINQ grouping
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 the pivot report worksheet
Dim pivotSheet As WorkSheet = workbook.CreateWorkSheet("PivotReport")
' Get distinct row and column values
Dim products = pivotData.Select(Function(p) p.Product).Distinct().OrderBy(Function(p) p).ToList()
Dim regions = pivotData.Select(Function(p) p.Region).Distinct().OrderBy(Function(r) r).ToList()
' Write column headers
pivotSheet("A1").Value = "Product / Region"
For c As Integer = 0 To regions.Count - 1
pivotSheet($"{ChrW(AscW("B"c) + c)}1").Value = regions(c)
Next
' Populate data rows
For r As Integer = 0 To products.Count - 1
pivotSheet($"A{r + 2}").Value = products(r)
For c As Integer = 0 To regions.Count - 1
Dim sales = pivotData _
.Where(Function(p) p.Product = products(r) AndAlso p.Region = regions(c)) _
.Select(Function(p) p.TotalSales) _
.FirstOrDefault()
pivotSheet($"{ChrW(AscW("B"c) + c)}{r + 2}").Value = sales
Next
Next
' Add a totals row using Excel SUM formulas
Dim totalRow As Integer = products.Count + 2
pivotSheet($"A{totalRow}").Value = "Total"
For c As Integer = 0 To regions.Count - 1
Dim col As Char = ChrW(AscW("B"c) + c)
pivotSheet($"{col}{totalRow}").Formula = $"=SUM({col}2:{col}{totalRow - 1})"
Next
' Apply currency formatting to the data range
Dim dataRange = pivotSheet($"B2:{ChrW(AscW("B"c) + regions.Count - 1)}{totalRow}")
dataRange.FormatString = "$#,##0.00"
workbook.SaveAs("PivotReport.xlsx")
Bu, yerel Excel döner tablosundan elde edeceğiniz aynı çapraz tablo özetini üretir. Her hücre, formül ve format dizisi üzerinde tam programatik kontrole sahipsiniz -- ve temizlemeniz gereken COM nesneleri yok.

Excel Formüllerini Kullanarak Dinamik Özetleri Nasıl Yaratırsınız?
Özet sayfanın canlı kalmasını istediğiniz senaryolar için -- temel veriler değiştiğinde otomatik olarak yeniden hesaplama -- IronXL, Excel formül dizelerini doğrudan hücrelere yazmanızı sağlar. Bu, bir pivot tablonun otomatik yenilenmesine benzer davranış sağlar, herhangi bir Interop bağımlılığı olmadan.
Anahtar fonksiyonlar burada SUMIFS ve COUNTIFS 'dır. SUMIFS, bir dizi çoklu kriter sütun koşuluna göre toplar; COUNTIFS eşleşen satırları sayar. Her ikisi de adlandırılmış çalışma sayfalarına referanslar alır, böylece özet sayfanızı doğrudan kaynak veri sayfası adıyla işaret edebilirsiniz.
IronXL ile Formül Tabanlı Toplamalar Nasıl Yazılır
using IronXL;
using System.Data;
string inputPath = "SalesData.xlsx";
string outputPath = "DynamicSummary.xlsx";
WorkBook workbook = WorkBook.Load(inputPath);
WorkSheet dataSheet = workbook.WorkSheets[0];
// Name the data sheet so formula references are stable
dataSheet.Name = "DataSheet";
// Convert to DataTable to enumerate unique product/region combinations
DataTable dataTable = dataSheet.ToDataTable(true);
WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary");
// Get unique product-region pairs
var uniqueCombos = dataTable.AsEnumerable()
.Select(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
})
.Distinct()
.OrderBy(x => x.Product)
.ThenBy(x => x.Region)
.ToList();
// Header row
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Region";
summarySheet["C1"].Value = "Total Sales";
summarySheet["D1"].Value = "Count";
// Populate rows with live SUMIFS / COUNTIFS formulas
for (int i = 0; i < uniqueCombos.Count; i++)
{
int rowIndex = i + 2;
var combo = uniqueCombos[i];
summarySheet[$"A{rowIndex}"].Value = combo.Product;
summarySheet[$"B{rowIndex}"].Value = combo.Region;
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}\")";
}
// Grand total row
int totalRow = uniqueCombos.Count + 2;
summarySheet[$"A{totalRow}"].Value = "Total";
summarySheet[$"C{totalRow}"].Formula = $"=SUM(C2:C{totalRow - 1})";
summarySheet[$"D{totalRow}"].Formula = $"=SUM(D2:D{totalRow - 1})";
workbook.SaveAs(outputPath);
using IronXL;
using System.Data;
string inputPath = "SalesData.xlsx";
string outputPath = "DynamicSummary.xlsx";
WorkBook workbook = WorkBook.Load(inputPath);
WorkSheet dataSheet = workbook.WorkSheets[0];
// Name the data sheet so formula references are stable
dataSheet.Name = "DataSheet";
// Convert to DataTable to enumerate unique product/region combinations
DataTable dataTable = dataSheet.ToDataTable(true);
WorkSheet summarySheet = workbook.CreateWorkSheet("DynamicSummary");
// Get unique product-region pairs
var uniqueCombos = dataTable.AsEnumerable()
.Select(row => new {
Product = row["Product"].ToString(),
Region = row["Region"].ToString()
})
.Distinct()
.OrderBy(x => x.Product)
.ThenBy(x => x.Region)
.ToList();
// Header row
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Region";
summarySheet["C1"].Value = "Total Sales";
summarySheet["D1"].Value = "Count";
// Populate rows with live SUMIFS / COUNTIFS formulas
for (int i = 0; i < uniqueCombos.Count; i++)
{
int rowIndex = i + 2;
var combo = uniqueCombos[i];
summarySheet[$"A{rowIndex}"].Value = combo.Product;
summarySheet[$"B{rowIndex}"].Value = combo.Region;
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}\")";
}
// Grand total row
int totalRow = uniqueCombos.Count + 2;
summarySheet[$"A{totalRow}"].Value = "Total";
summarySheet[$"C{totalRow}"].Formula = $"=SUM(C2:C{totalRow - 1})";
summarySheet[$"D{totalRow}"].Formula = $"=SUM(D2:D{totalRow - 1})";
workbook.SaveAs(outputPath);
Imports IronXL
Imports System.Data
Imports System.Linq
Dim inputPath As String = "SalesData.xlsx"
Dim outputPath As String = "DynamicSummary.xlsx"
Dim workbook As WorkBook = WorkBook.Load(inputPath)
Dim dataSheet As WorkSheet = workbook.WorkSheets(0)
' Name the data sheet so formula references are stable
dataSheet.Name = "DataSheet"
' Convert to DataTable to enumerate unique product/region combinations
Dim dataTable As DataTable = dataSheet.ToDataTable(True)
Dim summarySheet As WorkSheet = workbook.CreateWorkSheet("DynamicSummary")
' Get unique product-region pairs
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) _
.ToList()
' Header row
summarySheet("A1").Value = "Product"
summarySheet("B1").Value = "Region"
summarySheet("C1").Value = "Total Sales"
summarySheet("D1").Value = "Count"
' Populate rows with live SUMIFS / COUNTIFS formulas
For i As Integer = 0 To uniqueCombos.Count - 1
Dim rowIndex As Integer = i + 2
Dim combo = uniqueCombos(i)
summarySheet($"A{rowIndex}").Value = combo.Product
summarySheet($"B{rowIndex}").Value = combo.Region
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}"")"
Next
' Grand total row
Dim totalRow As Integer = uniqueCombos.Count + 2
summarySheet($"A{totalRow}").Value = "Total"
summarySheet($"C{totalRow}").Formula = $"=SUM(C2:C{totalRow - 1})"
summarySheet($"D{totalRow}").Formula = $"=SUM(D2:D{totalRow - 1})"
workbook.SaveAs(outputPath)
Bu formüller kaynak verilerle canlı bağlantılar korur. Birisi DataSheet içindeki bir değeri güncellediğinde, Excel doğal pivot tablonun yenileme döngüsüyle aynı davranışı size sunarak sonraki açılışta veya yenilemede özeti otomatik olarak yeniden hesaplar -- COM otomasyonunu gerektirmeden.
Önceki örnekte kullanılan aynı satış verisi kitapçığına bunu uyguladığınızda, çıktı şöyle görünür:

Bu formül tabanlı yaklaşım aynı zamanda özet hücrelerine koşullu biçimlendirme, veri çubukları veya ikon setleri ekleme yeteneği de verir, IronXL'ın hücre biçimlendirme API'sini kullanarak, herhangi bir manuel çalışma gerektirmeden raporlarınızı görsel olarak net hale getirir.
İki Yaklaşım Nasıl Karşılaştırılır?
Bir yaklaşım seçmeden önce, yan yana avantaj ve dezavantajları görmek faydalıdır. Aşağıdaki tablo üretim .NET geliştirme için en önemli boyutları kapsar:
| Aspekt | C# Interop | IronXL |
|---|---|---|
| Ofis gerekti | Evet -- her makineye tam kurulum | Hayır -- bağımsız NuGet paketi |
| 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şıklığı | Yüksek -- Ofis lisanslama + kurulum | Düşük -- Tek DLL referansı |
| Performans | Yavaş -- Excel süreç başlatma yükü | Hızlı -- Bellek içi hesaplamalar |
| Bulut uyumlu | Hayır -- Azure Functions, AWS Lambda'da engellenmiş | Evet -- her bulut platformunda çalışır |
| Yerel döner tablo nesnesi | Evet -- tam Excel döner tablosu | Hayır -- toplama tabanlı eşdeğer |
| Geliştirme hızı | Yavaş -- COM karmaşıklığı | Hızlı -- akıcı yönetilen API |
| .NET 10 desteği | Sınırlı -- COM bağlama sorunları | Tam -- modern .NET'i hedefler |
Interop'un açık bir avantaja sahip olduğu tek senaryo, yerel Excel döner tablo nesnesinin XLSX dosyasında gömülü olması gerektiği zamandır -- örneğin, kullanıcıların Excel'in yerleşik döner tablo arayüzünü kullanarak (derinlemesine inceleme, filtreleme, etkileşimli olarak toplama fonksiyonlarını değiştirme) onunla etkileşime girmeleri gerekiyorsa. Diğer tüm senaryolarda, IronXL'in yaklaşımı yazmak daha hızlı, dağıtmak daha kolay ve çok daha taşınabilir.
Hangi Yaklaşımı Seçmelisiniz?
Doğru seçim dağıtım ortamınıza ve kullanıcı ihtiyaçlarınıza bağlıdır.
C# Interop seçeneğini yalnızca şu durumlarda tercih edin:
- Kullanıcılarınızın, Excel'in kullanıcı arayüzü içinde etkileşimli olarak düzenleyebilecekleri yerel Excel döner tablo nesnelerine ihtiyaçı olduğunda
- Her makineye Office kurulumunun garanti edildiği kapalı bir Windows masaüstü ortamını hedefliyorsunuz
- Halihazırda Interop'a bağımlı olan eski .NET Framework kodunu sürdürüyor ve yeniden yazma şu anda haklı gösterilemez
IronXL seçin:
- Bir sunucuya, konteyner'a veya herhangi bir bulut ortamına (Azure, AWS, GCP) dağıtım yapıyorsunuz
- Linux, macOS veya Docker tabanlı yapılar için çok platformlu destek gerekiyor
- COM yaşam döngüsü yönetimi olmadan temiz, sürdürülebilir kod istiyorsunuz
- .NET 5, 6, 7, 8, 9 veya 10'u hedefliyorsunuz
- Sunucu altyapısında Microsoft Office lisans ücretlerinden kaçınmak istiyorsunuz
- Her dosyada ayrı bir Excel işlem başlatmadan birçok çalışma kitabının hızlı toplu iş işlemine ihtiyaçınız var
Günümüz modern .NET uygulamalarının büyük çoğunluğu için IronXL pratik bir seçimdir. Çıktıya dayalı birleşim, tüm gerçek raporlama gereksinimlerini karşılar ve tam taşınabilirlik sağlar.
Özel yetenekler - hücre biçimlendirme, formül değerlendirme, veri doğrulama ve grafik oluşturma dahil - için daha fazlasını IronXL dokümantasyonunda ve IronXL örnek kütüphanesinde keşfedebilirsiniz.
Bugün IronXL ile Başlangıç Nasıl Yapılır?
IronXL kütüphanesi NuGet üzerinde mevcuttur ve herhangi bir .NET projesine eklemek bir dakikadan az zaman alır:
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Install-Package IronXl.Excel
dotnet add package IronXl.Excel
Kurulumdan sonra, mevcut bir çalışma kitabını yükleyebilir veya yenisini oluşturabilir, hücre değerlerini okuyup yazabilir, formüller uygulayabilir, format dizeleri ayarlayabilir ve XLSX olarak kaydedebilirsiniz - hepsi temiz, iyi belgelenmiş bir API ile. Herhangi bir COM, Office bağımlılığı yoktur ve özel sunucu yapılandırması gerektirmez.
Tam API belgeleri için, IronXL başlangıç kılavuzunu, C# Excel Interop geçiş kılavuzunu ve IronXL kod örneklerini inceleyebilirsiniz. IronXL karşılaştırma makalelerinde IronXL'yi diğer Excel kütüphaneleriyle de karşılaştırabilirsiniz.
Bir ücretsiz deneme lisansı, taahhütte bulunmadan önce kendi projenizde tam fonksiyonelliği test etmenize olanak tanır. Üretime dağıtıma hazır olduğunuzda, bir ticari IronXL lisansı deneme filigranını kaldırır ve öncelikli destek içerir. Ücretsiz deneme ile başlamayı ve çapraz platform Excel otomasyonunun ne kadar daha basit olabileceğini görün.
Sıkça Sorulan Sorular
Interop kullanmadan C# ile Excel'de özet tabloları nasıl oluşturabilirim?
IronXL, güçlü veri manipülasyon yetenekleri sunarak Office bağımlılıklarından bağımsız olarak Excel'de özet tablolar oluşturmanızı sağlar.
Özet tablolar üretmek için IronXL kullanmanın avantajları nelerdir?
IronXL, Office kurulumlarına ihtiyaç duyulmaksızın karmaşıklığı azaltarak kurulum karmaşıklığını azalttığınız için Excel Interop'a güvenmeden özet tablolar oluşturmanıza izin verir.
IronXL, .NET uygulamaları ile uyumlu mu?
Evet, IronXL tamamen .NET uygulamaları ile uyumludur ve özet tablolar oluşturma dahil olmak üzere Excel işlemleri için kolay kullanımlı bir API sağlar.
IronXL sunucuda Excel kurulumunu gerektirir mi?
Hayır, IronXL sunucuda Excel kurulumu gerektirmez. Sunucu tarafı uygulamalarınıza sorunsuz entegrasyon sağlayarak bağımsız olarak çalışır.
IronXL kullanarak Excel'deki verileri yönetebilir miyim?
Evet, IronXL, özet tablo oluşturma dahil olmak üzere, Excel verilerini oluşturma, değiştirme ve analiz etme imkanları sunar.
Geliştiriciler neden geleneksel Interop yöntemlerine ek olarak IronXL kullanmayı tercih edebilir?
Geliştiriciler, Office bağımlılıklarının yokluğu, basit kurulum süreçleri ve Excel işlemleri için kapsamlı işlevsellikleri nedeniyle IronXL'yi geleneksel Interop yöntemlerine tercih edebilirler.
IronXL, Excel veri işleme esnasında hangi özellikleri sağlar?
IronXL, Excel dosyalarını okuma ve yazma, hesap tabloları oluşturma ve düzenleme ile özet tablolar üretme gibi birçok özellik sunar ve Excel Interop'a gerek yoktur.




