IronXL Kullanarak C# ile Excel'de Pivot Tablo Nasıl Oluşturulur
Excel'de veri tablolarını programatik olarak oluşturmak, ya C# Interop ile Office bağımlılıklarıyla ya da bağımsız çalışan modern bir kütüphane olan IronXL ile mümkündür - bu kılavuz her iki yaklaşımı da gösterir ve modern yolun neden daha iyi bir seçim olduğunu açıkça gösterir.
Sunucu tarafı veya çapraz platform .NET kodunda pivot tarzı raporlar oluşturmak tarihsel olarak zahmetli olmuştur. Geleneksel COM Interop rotası, sizi tam bir Office yüklemesiyle bir Windows makinesine bağlar, tek bir COM temizleme çağrısını kaçırırsanız bellek sızıntıları üretir ve Linux veya bir Docker konteynerine dağıtmaya çalıştığınız anda çöker. Modern alternatif - IronXL ve LINQ ile toplama mantığı yazmak - .NET'in çalıştığı her yerde çalışır, ofis lisansı gerektirmez ve size temiz, okunabilir bir kod sunar.
Bu kılavuz her iki tekniği de ayrıntılı bir şekilde ele alır. Hammallığın Interop yaklaşımını görecek, onun ne kadar kırılgan olduğunu anlayacak ve ardından IronXL ile aynı pivot tarzı özet sayfasını C# içinde oluşturacaksınız. Ayrıca gerçek zamanlı, otomatik güncellemeli özetler oluşturmak için Excel formüllerini nasıl kullanacağınızı da göreceksiniz.
Excel Pivot Tablosu Nedir?
Bir pivot tablo, elektronik tablo yazılımının en güçlü analitik araçlarından biridir. Satırları gruplandırarak, değerleri toplayarak ve sonuçları çapraz tablolar halinde düzenleyerek büyük veri setlerini özetler – tüm bunları, tek bir formül bile manuel olarak yazmanızı gerektirmeden yapar. Microsoft'un resmi pivot tablo belgeleri, Excel içinde özelliğin ne yaptığını kapsamlı bir şekilde anlatmaktadır.
Pivot tablolar Microsoft Excel, Google Sheets, Apple Numbers ve çoğu diğer tablo araçlarında görülü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ç sizin için bir özet matrisi oluşturur. Temel veriler değiştiğinde, pivot tabloyu yenilersiniz ve özet otomatik olarak güncellenir.
C# sunucu tarafı kodunda, iki geniş seçenek vardır:
- C# Interop -- bir XLSX dosyasının içinde özgün bir yerel pivot tablo nesnesi oluşturmak için COM aracılığıyla çalışan bir Excel sürecini otomatikleştirir
- 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 kullanışlı bir çıktı üretir. Ama sadece biri modern dağıtım ortamlarında güvenilir bir şekilde çalışır.
C# Interop Kullanarak Pivot Tablosu Nasıl Oluşturulur?
C# Excel Interop, size COM otomasyonu aracılığıyla Excel'in yerel pivot tablo işlevselliğine doğrudan erişim sağlar. Bir Excel.Application nesnesi oluşturur, bir çalışma kitabını açar, bir veri aralığına işaret eden bir pivot önbellek tanımlar ve ardından satır alanlarını, sütun alanlarını ve veri alanlarını yapılandırırsınız.
Interop Pivot Tablo Kodunu Nasıl Kuracaksı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, sıralar olarak Ürün, sütunlar olarak Bölge ve veri alanında Toplam Satış ile özgün bir Excel pivot tablosu oluşturur. XLSX dosyasının içinde gerçek bir pivot tablo nesnesi üretse de, Microsoft Office'in yüklü olmasını gerektirir ve dikkatli COM nesne yönetimi talep eder. Tek bir Marshal.ReleaseComObject çağrısını kaçırırsanız, Görev Yöneticisi'nde biriken bayat Excel süreçlerini bulursunuz.
Kod Yazmaya Başlamadan Önce IronXL Nasıl Kurulur
IronXL yaklaşımına geçmeden önce, kütüphaneyi NuGet Paket Yöneticisi aracılığıyla kurun:
Install-Package IronXL.Excel
Sunucuda, konteynerda veya geliştirme makinesinde Office kurulu olmasına gerek yoktur. IronXL, XLSX, XLS ve CSV dosyalarını tamamen yönetilen .NET belleğinde okur ve yazar.
C# Interop Hangi Problemleri Oluşturur?
Interop yaklaşımı, gerçek dünyada hızla bileşikleşen birkaç önemli zorluğu ortaya koyar. Stack Overflow ve diğer programlama kaynakları, birçok konu başlığının 2000'li yılların başında yazıldığından ve o zamandan beri kilitli olduğundan dolayı hala bunu önerir - bu nedenle tavsiyeler zaman içinde donmuş kalır.
Dağıtım bağımlılıkları -- kodunuzu çalıştıran her makineye lisanslı bir Microsoft Office kopyası kurulu olmalıdır; üretim sunucuları ve CI/CD yapım ajanları dahil. Bu hem lisanslama maliyeti hem de modern alternatiflerle tamamen kaçınılabilecek dağıtım karmaşıklığını ekler.
Bellek yönetimi yükü -- COM nesneleri Marshal.ReleaseComObject() kullanılarak açıkça serbest bırakılmalıdır. Tek bir nesnenin kaçırılması, Excel süreçlerinin bellek içerisinde süresiz bir şekilde takılı kalmasına neden olur, Stack Overflow'da geniş ölçüde 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 Windows üzerinde, Office yüklüyken çalışır. Linux, macOS, Docker konteynerları veya Azure Functions ya da AWS Lambda gibi sunucusuz platformlarda çalıştıramazsınız. Bu, sizi tamamen modern bulut yerel mimarilerden engeller.
Performans darboğazları -- Bir Excel uygulaması örneği başlatmak yavaş ve kaynak yoğun bir işlemdir. Sunucu tarafı toplu işlemede, birden fazla rapor oluşturmanız gerektiğinde bu başlangıç yükü ciddi bir verimlilik kısıtına dönüşür.
Sürüm uyumluluğu kırılganlığı -- Farklı Office sürümleri hafifçe farklı COM arayüzleri sunar. Office 2019'a karşı çalışan bir kod, Office 2016 veya Microsoft 365'e karşı farklı davranabilir ve bir dağıtımda sürümü sabitlemenin bir yolu yoktur. Microsoft'un Office Interop montajları hakkındaki belgeleri bu sürümlendirme kısıtlamalarını bilinen bir sınırlama olarak not eder.
CI/CD uyumsuzluğu -- çoğu sürekli tümleşik ortamda Office yüklü değildir. Pivot 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ını sürdürmeyi gerektirir.
Hedef .NET 6 veya daha sonraki sürümler olan, .NET 10 dahil, yeni herhangi bir .NET uygulaması için bu kısıtlamalar Interop'u pratik bir seçim haline getirmez.
IronXL Interop Olmadan Nasıl Pivot Tablolar Oluşturur?
IronXL pivot tablo oluşturmayı farklı bir şekilde ele alır. COM aracılığıyla harici bir Excel sürecini kontrol etmek yerine, IronXL çalışma kitabınızı yönetilen .NET belleğine okur, size 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 pivot tarzı toplamalar oluşturur ve sonuçları yeni bir çalışma sayfasına yazar.
IronXL ve LINQ ile Çapraz Tablo Özetini Nasıl Oluşturulur
Aşağıdaki örnek bir satış verisi çalışma kitabını yükler, ürün bazında bir bölge çapraz dökümü hesaplar ve özeti yeni bir çalışma sayfasına yazar - ofis 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 bir Excel pivot tablosundan elde edeceğiniz aynı çapraz döküm özetini üretir. Her hücre, formül ve format dizgisi üzerinde tam programatik kontrolünüz vardır ve temizlenmesi gereken COM nesneleri yoktur.

Dinamik Özetler Excel Formülleri Kullanarak Nasıl Oluşturulur?
Özet sayfanın canlı kalmasını istediğiniz senaryolar için - temel veriler değiştiğinde otomatik olarak yeniden hesaplama - IronXL hücrelere doğrudan Excel formülü dizileri yazmanıza olanak tanır. Bu size, Interop bağımlılığı olmadan, pivot tablonun otomatik yenileme davranışına benzer bir davranış kazandırır.
Buradaki temel fonksiyonlar SUMIFS ve COUNTIFS. SUMIFS, birden fazla kriter sütunu koşuluna dayalı bir aralığı toplar; COUNTIFS eşleşen satırları sayar. Her iki fonksiyon da adlandırılmış çalışma sayfalarına referanslar kabul ettiğinden, özet sayfanızı doğrudan kaynak veriler sayfasını belirterek hedefleyebilirsiniz.
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 bir sonraki açılışta veya yenilemede özeti otomatik olarak yeniden hesaplar -- size COM otomasyonu gerektirmeden, yerel bir pivot tablonun yenileme döngüsüyle aynı davranışı sağlar.
Önceki örnekte kullanıldığı aynı satış verileri çalışma kitabına bunu uyguladığınızda, çıktı şu şekilde görünür:

Bu formül tabanlı yaklaşım aynı zamanda IronXL'ın hücre biçimlendirme API'si kullanarak özet hücrelerine koşullu biçimlendirme, veri çubukları veya simge kümeleri eklemenize olanak tanır; raporlarınızı görsel olarak net hale getirir, Excel kullanıcı arayüzünde manuel bir çalışma olmaksızın.
Bu İki Yaklaşım Nasıl Karşılaştırılır?
Bir yaklaşım seçmeden önce, ticari .NET geliştirme için en önemli boyutları yan yana görmek yardımcı olabilir. Aşağıdaki tablo üretim .NET geliştirme için en önemli boyutları kapsar:
| Boyut | C# Interop | IronXL |
|---|---|---|
| Office gerekli | Evet -- her makinede tam kurulum | Hayır -- bağımsız NuGet paketi |
| Platform desteği | Sadece Windows | Windows, Linux, macOS, Docker |
| Bellek yönetimi | Manuel COM temizliği gerekli | Otomatik .NET çöp koleksiyonu |
| Dağıtım karmaşıklığı | Yüksek -- Office lisanslaması + yükleme | Düşük -- tek DLL referansı |
| Performans | Yavaş -- Excel süreci başlangıç yükü | Hızlı -- bellek içi hesaplamalar |
| Bulut uyumlu | Hayır -- Azure Functions, AWS Lambda'da engellendi | Evet -- herhangi bir bulut platformunda çalışır |
| Yerel pivot tablo nesnesi | Evet -- tam Excel pivot 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ğlanma sorunları | Tam -- modern .NET'i hedefler |
Interop'un açık bir avantajının bulunduğu tek senaryo, XLSX dosyasında gömülü yerel Excel pivot tablo nesnesine özel olarak ihtiyacınız olduğunda -- örneğin, alt kullanıcıların Excel'in yerleşik pivot tablo kullanıcı arayüzünü kullanarak (detaylandırma, filtreleme, toplama işlevlerini etkileşimli olarak değiştirme) etkileşime girmeleri gerekiyorsa. Diğer tüm senaryolarda, IronXL'ın yöntemi yazılması daha hızlı, dağıtılması 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ılarınızın ihtiyaçlarına bağlıdır.
C# Interop'u yalnızca şu durumlarda seçin:
- Kullanıcılarınız yerel Excel pivot tablo nesnelerine ihtiyaç duyuyor ve Excel kullanıcı arayüzü içinde bunları etkileşimli olarak manipüle edebilecekler
- Her makinede Office'in yüklü olduğundan emin olunan kapalı bir Windows masaüstü ortamını hedefliyorsunuz
- Interop'a zaten bağımlı olan miras .NET Framework kodunu sürdürüyor ve bir yeniden yazma şu anda gerekçelendirilmiyor
IronXL seçin şu durumlarda:
- Bir sunucuya, konteynere veya herhangi bir bulut ortamına (Azure, AWS, GCP) dağıtım yapıyorsunuz
- Linux, macOS veya Docker tabanlı derlemeler için çapraz platform desteğine ihtiyacınız var
- COM yaşam döngüsü yönetimi olmadan temiz, sürdürülebilir kod istiyorsunuz
- .NET 5, 6, 7, 8, 9 veya 10 hedefliyorsunuz
- Sunucu altyapısında Microsoft Office lisans ücretlerinden kaçınmak istiyorsunuz
- Excel süreç başlangıcı başına hızlı toplu işleme ihtiyacınız var
Çoğu modern .NET uygulaması için, IronXL pratik bir seçimdir. Toplama tabanlı çıktı, tüm gerçek raporlama gereksinimlerini karşılar ve bunun karşılığında tam taşınabilirlik kazanırsınız.
IronXL belgelerinde ve IronXL örnekler kütüphanesinde hücre biçimlendirme, formül değerlendirme, veri doğrulama ve grafik oluşturma gibi daha fazla yeteneği keşfedebilirsiniz.
IronXL ile Bugün Nasıl Başlanır?
IronXL kütüphanesi NuGet üzerinde mevcuttur ve her türlü .NET projesine eklemek bir dakikadan az sürer:
Install-Package IronXL.Excel
Kurulduktan sonra, mevcut bir çalışma kitabını yükleyebilir veya yeni bir tane oluşturabilir, hücre değerlerini okuyup yazabilir, formüller uygulayabilir, biçim dizgileri ayarlayabilir ve XLSX'e kaydedebilirsiniz - hepsi temiz, iyi belgelenmiş bir API ile. Hiçbir COM yok, Office bağımlılığı yok ve özel sunucu yapılandırması gerekli değil.
Tam API belgeleri için IronXL başlangıç rehberine, C# Excel Interop geçiş rehberine ve IronXL kod örneklerine bakınız. Ayrıca IronXL'yi diğer Excel kütüphaneleriyle, IronXL karşılaştırma makalelerinde karşılaştırabilirsiniz.
Bir ücretsiz deneme lisansı, tam işlevselliği kendi projenizde taahhütte bulunmadan önce test etmenizi sağlar. Ü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şlayın ve çapraz platform Excel otomasyonunun ne kadar basit hale geldiğini görün.
Sıkça Sorulan Sorular
IronXL kullanarak Interop olmadan Excel'de pivot tablolar oluşturmak için nasıl?
IronXL, güçlü veri manipülasyonu yetenekleri sunarak Excel'de pivot tablolar oluşturmayı Office bağımlılıkları olmadan sağlar.
Pivot tablolar oluşturmak için IronXL kullanmanın avantajları nelerdir?
IronXL, Excel Interop'a güvenmeden pivot tablolar oluşturmanıza olanak tanır, Office kurulumlarına ihtiyaç duymayarak karmaşıklığı azaltır.
IronXL, .NET uygulamalarıyla uyumlu mu?
Evet, IronXL, .NET uygulamalarıyla tamamen uyumludur ve pivot tabloları oluşturmayı da içeren Excel işlemleri için kullanımı kolay bir API sağlar.
IronXL, sunucu üzerinde Excel kurulmasını gerektirir mi?
Hayır, IronXL, sunucu üzerinde Excel kurulmasını gerektirmez. Sunucu tarafı uygulamalarıyla sorunsuz entegrasyon sağlar.
IronXL kullanarak Excel'de verileri manipüle edebilir miyim?
Evet, IronXL geniş veri manipülasyon özellikleri sunarak Excel verilerini oluşturmanıza, değiştirmenize ve analiz etmenize olanak tanır, pivot tablolar oluşturma dahil.
Geliştiriciler neden IronXL'ı geleneksel Interop yöntemlerine tercih eder?
Geliştiriciler, Office bağımlılıkları olmaması, daha basit kurulum ve Excel işlemleri için kapsamlı işlevsellik sunması nedeniyle IronXL'ı geleneksel Interop yöntemlerine tercih edebilir.
IronXL, Excel veri manipülasyonu için hangi özellikleri sunar?
IronXL, Excel dosyalarını okuma ve yazma, elektronik tablolar oluşturma ve düzenleme, pivot tablolar oluşturma gibi özellikler sunar ve bunların hiçbiri Excel Interop gerektirmez.




