Altbilgi içeriğine atla
IRONXL KULLANARAK

C#'da Excel Pivot Tablosu Nasıl Oluşturulur?

C# ile Excel pivot tabloları oluşturmak, Microsoft Office kurulumu gerektiren Office Interop veya bağımsız çalışan modern kütüphanelerle mümkündür. IronXL, üstün dağıtım esnekliği ve çapraz platform desteği sunarak DevOps ortamlarında çalışmalar sağlar.

Pivot tabloları programatik olarak oluşturmak, ya Office bağımlılıkları ile C# Interop gerektirir ya da bağımsız çalışan IronXL gibi modern kütüphaneler gerektirir. Bu eğitim, geliştiricilerin özellikle Docker konteynerlerine veya Azure ve AWS gibi bulut ortamlarına dağıtım yaparken giderek daha fazla IronXL'i neden geleneksel Interop yöntemlerine tercih ettiklerini vurgulayarak her iki yaklaşımı da gösterir.

Bu makalede, pivot tabloları ve grupları otomatik analiz ve hata yönetimi ile nasıl düzenleyeceğimizi, oluşturacağımızı, tasarlayacağımızı ve hesaplayacağımızı öğreneceğiz - tüm bunlar, dağıtım basitliğini sağlayarak DevOps mühendislerinin ihtiyaç duyduğu şekilde gerçekleşir.

Excel Pivot Tablosu Nedir?

Pivot tablosu, Excel'in en güçlü araçlarından biridir. .NET uygulamalarında veri analizi için vazgeçilmez kılan geniş veri setlerini özetlemenin kolay bir yoludur. Pivot tablolar, sayısal verileri kolayca görüntülemenizi, anlamanızı ve analiz etmenizi sağlar. Bunlar yalnızca Excel'de değil, aynı zamanda Google Sheets, Apple Numbers ve CSV Dışa Aktarımlarında da mevcuttur. Verileri genel olarak görme çözümü sunarlar - kişilerin bilgilerini anlamlı bir şekilde görmelerine izin veren bir veri konsolu gibi hareket ederler.

Konteynırlı uygulamalar için, pivot tabloları programatik olarak oluşturmak, Docker imajlarınıza Excel kurulumlarını ekleme ihtiyacını 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 konteynır dağıtım stratejileri ile mükemmel bir uyum sağlar.

Gelin, bir pivot tablo yapmanın yanlış yolunu inceleyelim, ardından C# ile doğru yolu öğrenelim:

C# Interop Kullanarak Excel Tablosunda Pivot Tablosu Nasıl Oluşturulur?

C# Excel Interop, Excel'in pivot tablo işlevselliğine COM otomasyonu ile doğrudan erişim sağlar. İşte C#'de pivot tablolar oluşturmak için araç arayan birçok geliştiricinin karşılaştığı geleneksel yaklaşım:

Bu Yaklaşım .NET'te Neden Demode Olarak 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, 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. İşlevsel olsa da, bu yaklaşım Microsoft Office kurulumu ve dikkatli 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ın önemli sorunları bulunmaktadır çünkü etkili bir şekilde konteynerleştirilemez - Microsoft Office'i bir Linux Docker konteynerine kuramazsınız veya sunucusuz ortamlarına dağıtamazsınız.

C# Interop Hangi Problemleri Oluşturur?

Interop yaklaşımı, modern DevOps uygulamaları ve bulut yerel dağıtımları için uygun olmayan çeşitli önemli zorluklar sunar.

Maalesef Stack Overflow ve diğer programlama siteleri, 2000'lerin başlarındaki konularla zaman içinde kilitlendikleri için bunu önermeye devam ediyor.

Dağıtım Bağımlılıkları: Kaynak kodu çalıştıran her makineye, üretim sunucuları dahil olmak üzere, Microsoft Office kurulumunu gerektirir. Bu, lisanslama maliyetlerini ve dağıtım karmaşıklığını artırır.

Bellek Yönetimi: COM nesneleri, Marshal.ReleaseComObject() kullanılarak açıkça serbest bırakılmalıdır. Bir nesneyi bile kaçırmak, Excel süreçlerinin bellekte takılmasına neden olur, Stack Overflow'da genişçe belgelenmiştir. Pivot önbelleği düşünün.

Platform Sınırlamaları: Bu çözüm yalnızca Windows üzerinde Office yüklü iken çalışır. Son derece yavaş olabilir ve bellek sızıntılarına neden olabilir. Linux, macOS, Docker konteynerleri veya Azure Functions gibi bulut platformları için destek yok. Bu durum, dağıtım seçeneklerini ciddi şekilde kısıtlar ve modern konteyner orkestrasyon platformlarının kullanılmasına engel olur.

Performans Sorunları: Excel uygulama örneklerini başlatmak yavaş ve kaynak yoğundur, özellikle sunucu tarafı işleme için.

Sürüm Uyumluluğu: Farklı Office sürümleri, ortamlar arasında uyumsuzluk sorunlarına neden olan farklı COM arayüzlerine sahip olabilir.

IronXL, Interop Olmadan Pivot Tabloyu Programlamayla Nasıl Oluşturur?

IronXL, pivot tablo oluşturmayı, yönetilen kod kullanarak, COM bağımlılıklarını ortadan kaldırarak farklı bir şekilde ele alır. Yerel Excel pivot tabloları oluşturmamakla birlikte, kapsayıcı tabanlı dağıtımlar ve bulut-yerli mimariler için mükemmel olan güçlü toplama yetenekleri sağlar. Kütüphanenin performans iyileştirmeleri, 40 kat hız artışı ve 19,5 GB'den 1 GB'ın altına düşen bellek kullanımı içerir, bu da onu kaynak sınırlı konteyner ortamları için ideal hale getirir.

Bu Yaklaşımı XLSX veya XLS Dosyaları İç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

Kapsayıcı dostu bir şekilde pivot tabloları böyle oluşturuyorsunuz. Bu yaklaşım, Docker konteynerlerinde, Kubernetes podlarında ve dış bağımlılıklar gerektirmeyen sunucusuz işlevlerde sorunsuz çalışır. Tüm uygulama, .NET'in desteklediği her yerde çalışabilecek hafif bir kapsayıcı görüntüsüne paketlenebilir.

Pivot Tablo Çıktısı Nasıl Görünür?

 Ürün satışlarının bölgelere göre toplandığını gösteren ve toplamları içeren orijinal Excel satış verileri ile oluşturulan pivot tablonun karşılaştırılması

Çıktı, IronXL'nin ham satış verilerini Excel kurulumu gerektirmeden yapılandırılmış bir pivot raporuna nasıl dönüştürdüğünü gösterir, bu da onu CI/CD hatlarında otomatik raporlama için mükemmel yapar.

IronXL Formülleri ile Dinamik Özetler Nasıl Oluşturulur?

Pivot tablo yenileme işlevine benzer dinamik güncellemeler gerektiren senaryolar için IronXL, Excel'in yerleşik formüllerinden yararlanabilir. Bu yaklaşım tercih edilebilir - veriniz çok daha modern ve şık bir şekilde ele alınır. Kod, destekle iletişime geçmeye veya kullanım kılavuzlarını okumaya ihtiyaç duymadan kolayca anlaşılır ve kurulabilir. Bu yaklaşım, otomatik olarak güncellenen formül tabanlı hesaplamalar'a ihtiyaç duyduğunuz kapsayıcı ortamlarında özellikle değerlidir.

Formül Tabanlı Özetler Nasıl Otomatik 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, pivot tablo yenileme davranışına benzer şekilde ancak Interop bağımlılıkları olmadan canlı veri bağlantılarını korur ve veri sayfası değiştiğinde otomatik olarak güncellenir. Bu yaklaşım, harici bağımlılıklara ihtiyaç duymadan dinamik raporlar oluşturması gereken kapsayıcı mikro hizmetler için idealdir.

Dinamik Özetlerden Ne Sonuçlar Bekleyebilirsiniz?

Bu kodu, önceki örnekten Excel dosyasına uygularsak, bu çıktıyı elde ederiz:

 Bölgelere yayılmış ve hesaplanmış toplamları ve sayıları gösteren dinamik özet formülleriyle ürün satış verilerini gösteren Excel elektronik tablosu

Dinamik özet yaklaşımı, kaynak veriler değiştiğinde otomatik olarak güncellenen gerçek zamanlı hesaplamalar sağlar, bu da otomatik raporlama hatları için uygundur. Bu, zamanlanmış pivot tablo yenileme ihtiyacını ortadan kaldırır ve .NET MAUI ve Blazor uygulamalarında sorunsuz çalışır.

C# Interop ve Pivot Tablolar için IronXL Nasıl Karşılaştırılır?

Boyut

C# Interop

IronXL

Ofis Gerekli

Evet - Tam kurulum

Hayır - Bağımsız kütüphane

Platform Desteği

Sadece Windows

Windows, Linux, macOS, Docker

Hafıza Yönetimi

Manuel COM temizliği gerekli

Otomatik .NET çöp koleksiyonu

Dağıtım

Karmaşık - Ofis lisanslama

Basit - Tek DLL

Performans

Yavaş - Excel işlem başlatma

Hızlı - Bellek içi hesaplamalar

Bulut Uyumlu

Hayır - Azure sınırlamaları

Evet - Azure Functions desteği

Yerel Pivot Tablolar

Evet

Hayır - Toplama alternatifleri

Geliştirme Hızı

Yavaş - COM karmaşıklığı

Hızlı - Sezgisel API

Konteyner Desteği

Hayır - Ofis kapsayıcı haline getirilemez

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 sağlar. Kütüphanenin, harici bağımlılıkları olmadan konteynerlerde çalışabilmesi, hızlı dağılan ve verimli şekilde ölçeklendirilebilen hafif Docker görüntüleri oluşturmanızı sağlar. Sağlık kontrolleri standart .NET kalıpları kullanılarak uygulanabilir ve kütüphanenin güvenlik özellikleri DigiCert sertifikasyonu ve COM arayüzlerinin olmamasıyla saldırı vektörlerini azaltır.

Hangi Yaklaşımı Seçmelisiniz?

C# Interop Ne Zaman Kullanılmalıdır?

C# Interop seçin şu durumlarda:

  • Yerel Excel pivot tablo nesneleri kesinlikle gerekliyse
  • Yalnızca Windows üzerinde Ofis her yerde yüklüyken çalışıyorsanız
  • Yalnızca yönettiğiniz masaüstü sistemlerine dağılım yapıyorsanız
  • Mevcut eski kod Interop'a bağımlıysa
  • Eski .NET Framework sürümlerini kullanıyorsanız
  • Kapsayıcıya taşınma veya buluta geçiş planınız yoksa

Ne Zaman IronXL Daha İyi Sonuçlar Sağlar?

IronXL seçin şu durumlarda:

  • Sunuculara veya bulut ortamlarına (Azure, AWS) dağılım yapıyorsanız
  • Kapsayıcılarda çalışan çapraz platform uygulamalar oluşturuyorsanız
  • Daha iyi performans için 40 kat hız artışı gerektiriyorsa
  • Ofis lisanslama maliyetlerinden ve dağıtım karmaşıklığından kaçınıyorsanız
  • Basit kod ile lisans anahtarı yönetimi gerekiyorsa
  • Mac, iOS, Android ve Linux sistemlerini destekliyorsanız
  • Modern .NET Core ve .NET 5-10'da çalışıyorsanız
  • Programatik olarak pivot tablo alanlarını yapılandırıyorsanız
  • Çeşitli formatlara aktaran mikro hizmetler oluşturuyorsanız
  • CI/CD hatlarında otomatik raporlama uyguluyorsanız
  • Konteyner orkestrasyon için sağlık kontrol uç noktaları oluşturuyorsanız
  • Farklı elektronik tablo formatları arasında dönüştürme yapıyorsanız

C#'ta Pivot Tablolar Oluşturma Hakkında Neler Öğrendik?

C# Excel Interop yerel pivot tablolar oluşturabilirken, dağıtım sınırlamaları ve karmaşıklığı, özellikle kapsayıcı ortamlarında modern uygulamalar için giderek daha pratik olmayan hale getiriyor. IronXL, analytik yetenekleri koruyarak Office bağımlılıklarını ortadan kaldıran, veri toplama ve formül tabanlı özetler aracılığıyla güçlü alternatifler sunar.

Interop kullanmadan pivot tabloları geliştirmek için alternatif arayan geliştiriciler ve DevOps mühendisleri için, IronXL, tüm platformlarda çalışan, COM sorunlarını önleyen ve dağıtımı basitleştiren üstün bir yol sunar. Yerel pivot nesnelerinin olmamasının karşılığı, daha fazla esneklik, daha iyi performans ve Ofis lisanslama gerekliliklerinin ortadan kaldırılması ile dengelenir. DevOps ekipleri için en önemlisi, IronXL, containerize dağıtımlar, otomatik ölçekleme ve modern CI/CD hatlarına sorunsuz entegrasyon ile gerçek bir kod olarak altyapı sağlar.

Kütüphanenin kapsamlı özellik seti, koşullu biçimlendirme, hücre stili, formül desteği ve veri doğrulama içerir ve modern .NET uygulamalarında Excel otomasyonu için tam bir çözüm sunar. CSV dosyalarıyla çalışıyor, çalışma sayfalarını yönetiyor veya karmaşık veri dönüşümleri uyguluyor olun, IronXL, dağıtım dostu bir API sunar.

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

Excel otomasyonunuzu modernize etmeye ve modern C# ile pivot tablo kodu oluşturmaya hazır mısınız?

IronXL, NuGet Paket Yöneticisi aracılığıyla C# uygulamalarınıza saniyeler içinde uygulanabilir. Ücretsiz deneme sürümünü deneyin ve üretim uygulamalarınızdaki Interop bağımlılıklarını ortadan kaldırarak kapsayıcı dağıtımlarınızı basitleştirin.

Sıkça Sorulan Sorular

Excel'de pivot tablo nedir?

Excel'de bir pivot 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 tam tersine dönüştürmesine olanak tanır, böylece dinamik veri analizi sağlar.

C#'da Excel pivot tabloları oluşturmak için neden IronXL kullanmalıyım?

IronXL, Office Interop'a bağlı kalmadan C#'da Excel pivot tabloları oluşturmanıza olanak tanır ve böylece Excel kurulumlarına gerek kalmaz, bağımlılıkları azaltır ve modern, verimli bir tercih haline gelir.

IronXL, C# Interop ile Excel operasyonları için nasıl kıyaslanır?

IronXL, Office kurulumlarını gerektiren C# Interop'a göre daha akıcı ve bağımsız bir yaklaşım sunar. IronXL, pivot tabloları ve diğer Excel işlemlerini Interop karmaşıklığı olmadan basitleştirir.

Excel kurulu olmadan pivot tablolar oluşturabilir miyim?

Evet, IronXL kullanarak, Microsoft Office'ten bağımsız olarak çalıştığı için Excel kurulu olmadan C# uygulamalarınızda pivot tablolar oluşturabilirsiniz.

IronXL, büyük veri kümeleri için uygun mu?

IronXL, büyük veri kümelerini verimli bir şekilde yönetmek için tasarlanmıştır ve sağlam veri işleme ve pivot tablo oluşturma gerektiren uygulamalar için uygundur.

Geleneksel yöntemlere göre IronXL kullanmanın avantajları nelerdir?

IronXL, Excel kurulumlarına ihtiyaç duymaksızın, kullanım kolaylığı, esneklik ve karmaşık veri işlemleri için destek sunarak geleneksel yöntemlere kıyasla modern, bağımsız bir alternatif sunar.

Pivot tablolar için IronXL kullanmak için VBA öğrenmem gerek mi?

Hayır, IronXL, pivot tabloları oluşturmak ve yönetmek için doğrudan C# içinde çalışmanıza olanak tanır, VBA veya diğer Excel'e özel programlama dillerini öğrenme gereğini ortadan kaldırır.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

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