Altbilgi içeriğine atla
IRONXL KULLANARAK

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

İş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?

Orijinal Excel satış verilerinin ve ürün satışlarını bölgelere göre toplayan toplamlarla gösteren oluşturulmuş pivot tablonun karşılaştırılması

Çı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
$vbLabelText   $csharpLabel

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:

Dinamiki özet formüllerle ürün satış verilerini (Laptop, Telefon, Tablet) bölgeler arasında toplamlarla ve sayılarla gösteren Excel elektronik tablosu

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.

Şimdi IronXL ile başlayın.
green arrow pointer

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.

Jordi Bardia
Yazılım Mühendisi
Jordi Python, C# ve C++ konularında en yetkin, Iron Software'deki yeteneklerini kullanmadığı zamanlarda; oyun programlıyor. Ürün testi, ürün geliştirme ve araştırma sorumluluklarını paylaşan Jordi, sürekli ürün gelişimine büyük değer katıyor. Çeşitli deneyimleri onu ...
Daha Fazlasını Oku

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara