
Wie man eine Excel Pivot-Tabelle in C# erstellt
Die Arbeit mit einer Excel-Pivottabelle programmatisch ist ein häufiges Erfordernis in Geschäftsanwendungen, die Quelldaten analysieren und berechnen müssen. Während Microsofts Excel Interop die traditionelle Methode war, eine Pivottabelle in einer Excel-Datei zu erstellen, bieten moderne Lösungen wie IronXL erhebliche Vorteile. Dieser Leitfaden beschreibt beide Methoden mit praktischen Beispielen, um Ihnen bei der Erstellung einer Pivot-Tabelle in Excel mit C# Interop zu helfen oder eine bessere Alternative zu wählen.
Verständnis der zwei Ansätze
Was ist Excel Interop?
Excel Interop verwendet COM (Component Object Model), um Microsoft Excel direkt über C# zu steuern. Es erfordert eine Office-Installation auf dem System und automatisiert Excel im Wesentlichen so, als ob ein Benutzer mit der Anwendung interagiert. Jedes Arbeitsblatt, jede Arbeitsmappe und jede Zelle wird damit zu einem Objekt, das Sie über Code manipulieren können.
Was ist IronXL?
IronXL ist eine eigenständige .NET-Bibliothek, die Excel-Dateien lesen, bearbeiten und erstellen kann, ohne Microsoft Office zu benötigen. Es funktioniert auf Windows, Linux, macOS und Docker-Containern, was es ideal für moderne Bereitstellungsszenarien macht. Sie können Daten öffnen, speichern und exportieren, ohne den Overhead von COM Interop.
Einrichten Ihrer Umgebung
Für Excel Interop
Für IronXL
Alternativ können Sie den NuGet-Paket-Manager-UI verwenden, indem Sie nach "IronXL.Excel" suchen und auf Installieren klicken. Sie können auch über die .NET CLI mit Befehlsargumenten installieren oder es direkt von GitHub referenzieren.
Beide Bibliotheken sind über NuGet verfügbar. Beachten Sie, dass Excel Interop eine vollständige Microsoft Office-Installation erfordert, während IronXL unabhängig arbeitet. Bevor Sie fortfahren, stellen Sie sicher, dass Ihr System die Anforderungen erfüllt.
Erstellung einer Excel-Pivot-Tabelle programmatisch mit C# Interop
Hier ist ein vollständiges Beispiel, das zeigt, wie man mit dem traditionellen Interop-Ansatz programmatisch eine Pivottabelle erstellt:
using Excel = Microsoft.Office.Interop.Excel;
class Program
{
static void Main(string[] args)
{
// Create Excel application instance
var excelApp = new Excel.Application();
var workbook = excelApp.Workbooks.Add();
var dataSheet = (Excel.Worksheet)workbook.Worksheets[1];
var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add();
// Add header row and sample data
dataSheet.Cells[1, 1] = "Product";
dataSheet.Cells[1, 2] = "Region";
dataSheet.Cells[1, 3] = "Sales";
// ... populate data rows with values
// Add sample data rows
dataSheet.Cells[2, 1] = "Laptop";
dataSheet.Cells[2, 2] = "North";
dataSheet.Cells[2, 3] = 1200;
dataSheet.Cells[3, 1] = "Laptop";
dataSheet.Cells[3, 2] = "South";
dataSheet.Cells[3, 3] = 1500;
dataSheet.Cells[4, 1] = "Phone";
dataSheet.Cells[4, 2] = "North";
dataSheet.Cells[4, 3] = 800;
dataSheet.Cells[5, 1] = "Phone";
dataSheet.Cells[5, 2] = "South";
dataSheet.Cells[5, 3] = 950;
dataSheet.Cells[6, 1] = "Tablet";
dataSheet.Cells[6, 2] = "East";
dataSheet.Cells[6, 3] = 600;
dataSheet.Cells[7, 1] = "Tablet";
dataSheet.Cells[7, 2] = "West";
dataSheet.Cells[7, 3] = 750;
dataSheet.Cells[8, 1] = "Monitor";
dataSheet.Cells[8, 2] = "North";
dataSheet.Cells[8, 3] = 400;
dataSheet.Cells[9, 1] = "Monitor";
dataSheet.Cells[9, 2] = "South";
dataSheet.Cells[9, 3] = 500;
dataSheet.Cells[10, 1] = "Keyboard";
dataSheet.Cells[10, 2] = "East";
dataSheet.Cells[10, 3] = 300;
// Create pivot cache from source data range
Excel.Range dataRange = dataSheet.Range["A1:C10"];
Excel.PivotCache pivotCache = workbook.PivotCaches().Create(
Excel.XlPivotTableSourceType.xlDatabase, dataRange);
// Create PivotTable at specific location
Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables();
Excel.PivotTable pivotTable = pivotTables.Add(
pivotCache, pivotSheet.Range["A3"], "SalesPivot");
// Configure pivot table fields - row and column headers
((Excel.PivotField)pivotTable.PivotFields("Product")).Orientation =
Excel.XlPivotFieldOrientation.xlRowField;
((Excel.PivotField)pivotTable.PivotFields("Region")).Orientation =
Excel.XlPivotFieldOrientation.xlColumnField;
((Excel.PivotField)pivotTable.PivotFields("Sales")).Orientation =
Excel.XlPivotFieldOrientation.xlDataField;
// Configure grand totals and formatting
pivotTable.RowGrand = true;
pivotTable.ColumnGrand = true;
// Save the Excel file
workbook.SaveAs("pivot_interop.xlsx");
workbook.Close();
excelApp.Quit();
// Critical: Release COM objects to avoid errors
#if WINDOWS
Marshal.ReleaseComObject(pivotTable);
Marshal.ReleaseComObject(pivotSheet);
Marshal.ReleaseComObject(dataSheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excelApp);
#endif
}
}Imports Excel = Microsoft.Office.Interop.Excel
Imports System.Runtime.InteropServices
Class Program
Shared Sub Main(ByVal args() As String)
' Create Excel application instance
Dim excelApp As New Excel.Application()
Dim workbook As Excel.Workbook = excelApp.Workbooks.Add()
Dim dataSheet As Excel.Worksheet = CType(workbook.Worksheets(1), Excel.Worksheet)
Dim pivotSheet As Excel.Worksheet = CType(workbook.Worksheets.Add(), Excel.Worksheet)
' Add header row and sample data
dataSheet.Cells(1, 1) = "Product"
dataSheet.Cells(1, 2) = "Region"
dataSheet.Cells(1, 3) = "Sales"
' ... populate data rows with values
' Add sample data rows
dataSheet.Cells(2, 1) = "Laptop"
dataSheet.Cells(2, 2) = "North"
dataSheet.Cells(2, 3) = 1200
dataSheet.Cells(3, 1) = "Laptop"
dataSheet.Cells(3, 2) = "South"
dataSheet.Cells(3, 3) = 1500
dataSheet.Cells(4, 1) = "Phone"
dataSheet.Cells(4, 2) = "North"
dataSheet.Cells(4, 3) = 800
dataSheet.Cells(5, 1) = "Phone"
dataSheet.Cells(5, 2) = "South"
dataSheet.Cells(5, 3) = 950
dataSheet.Cells(6, 1) = "Tablet"
dataSheet.Cells(6, 2) = "East"
dataSheet.Cells(6, 3) = 600
dataSheet.Cells(7, 1) = "Tablet"
dataSheet.Cells(7, 2) = "West"
dataSheet.Cells(7, 3) = 750
dataSheet.Cells(8, 1) = "Monitor"
dataSheet.Cells(8, 2) = "North"
dataSheet.Cells(8, 3) = 400
dataSheet.Cells(9, 1) = "Monitor"
dataSheet.Cells(9, 2) = "South"
dataSheet.Cells(9, 3) = 500
dataSheet.Cells(10, 1) = "Keyboard"
dataSheet.Cells(10, 2) = "East"
dataSheet.Cells(10, 3) = 300
' Create pivot cache from source data range
Dim dataRange As Excel.Range = dataSheet.Range("A1:C10")
Dim pivotCache As Excel.PivotCache = workbook.PivotCaches().Create(Excel.XlPivotTableSourceType.xlDatabase, dataRange)
' Create PivotTable at specific location
Dim pivotTables As Excel.PivotTables = CType(pivotSheet.PivotTables(), Excel.PivotTables)
Dim pivotTable As Excel.PivotTable = pivotTables.Add(pivotCache, pivotSheet.Range("A3"), "SalesPivot")
' Configure pivot table fields - row and column headers
CType(pivotTable.PivotFields("Product"), Excel.PivotField).Orientation = Excel.XlPivotFieldOrientation.xlRowField
CType(pivotTable.PivotFields("Region"), Excel.PivotField).Orientation = Excel.XlPivotFieldOrientation.xlColumnField
CType(pivotTable.PivotFields("Sales"), Excel.PivotField).Orientation = Excel.XlPivotFieldOrientation.xlDataField
' Configure grand totals and formatting
pivotTable.RowGrand = True
pivotTable.ColumnGrand = True
' Save the Excel file
workbook.SaveAs("pivot_interop.xlsx")
workbook.Close()
excelApp.Quit()
' Critical: Release COM objects to avoid errors
#If WINDOWS Then
Marshal.ReleaseComObject(pivotTable)
Marshal.ReleaseComObject(pivotSheet)
Marshal.ReleaseComObject(dataSheet)
Marshal.ReleaseComObject(workbook)
Marshal.ReleaseComObject(excelApp)
#End If
End Sub
End ClassDieser Code erstellt eine Excel-Anwendung, fügt ein Arbeitsblatt mit Quelldaten einschließlich einer Kopfzeile hinzu, erstellt einen Pivot-Cache, baut das PivotTable-Objekt und konfiguriert die Feldausrichtung. Der Bereinigungsteil ist entscheidend - das Versäumnis, COM-Objekte freizugeben, verursacht Speicherlecks. IronXL benötigt:
Der IronXL Alternative Ansatz
IronXL verfolgt einen anderen Ansatz, indem es direkt mit dem Excel-Dateiformat arbeitet. So erreichen Sie ähnliche Analysenergebnisse programmatisch:
using IronXL;
using System.Linq;
class Program
{
static void Main(string[] args)
{
// Create workbook and add worksheet with data
WorkBook workbook = WorkBook.Create();
WorkSheet sheet = workbook.CreateWorkSheet("Data");
// Add header row to define column structure
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Region";
sheet["C1"].Value = "Sales";
// Add sample data to cells
sheet["A2"].Value = "Widget";
sheet["B2"].Value = "North";
sheet["C2"].Value = 1500;
// ... continue to add more data rows
sheet["A3"].Value = "Laptop";
sheet["B3"].Value = "South";
sheet["C3"].Value = 1500;
sheet["A4"].Value = "Phone";
sheet["B4"].Value = "North";
sheet["C4"].Value = 800;
sheet["A5"].Value = "Phone";
sheet["B5"].Value = "South";
sheet["C5"].Value = 950;
sheet["A6"].Value = "Tablet";
sheet["B6"].Value = "East";
sheet["C6"].Value = 600;
sheet["A7"].Value = "Tablet";
sheet["B7"].Value = "West";
sheet["C7"].Value = 750;
sheet["A8"].Value = "Monitor";
sheet["B8"].Value = "North";
sheet["C8"].Value = 400;
sheet["A9"].Value = "Monitor";
sheet["B9"].Value = "South";
sheet["C9"].Value = 500;
sheet["A10"].Value = "Keyboard";
sheet["B10"].Value = "East";
sheet["C10"].Value = 300;
// Create summary analysis worksheet
var summarySheet = workbook.CreateWorkSheet("Summary");
// Group and calculate aggregated data
var data = sheet["A1:C10"].ToDataTable(true);
var productSummary = data.AsEnumerable()
.GroupBy(row => row.Field<string>("Product"))
.Select((group, index) => new {
Product = group.Key,
TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])),
Count = group.Count(),
RowIndex = index + 2
});
// Write column headers for summary
summarySheet["A1"].Value = "Product Summary";
summarySheet["A2"].Value = "Product";
summarySheet["B2"].Value = "Total Sales";
summarySheet["C2"].Value = "Count";
// Export results to cells
foreach (var item in productSummary)
{
summarySheet[$"A{item.RowIndex + 1}"].Value = item.Product;
summarySheet[$"B{item.RowIndex + 1}"].Value = item.TotalSales;
summarySheet[$"C{item.RowIndex + 1}"].Value = item.Count;
}
// Apply number formatting and style
summarySheet["B:B"].FormatString = "$#,##0.00";
// Save the xlsx file
workbook.SaveAs("analysis_ironxl.xlsx");
}
}Imports IronXL
Imports System.Linq
Class Program
Shared Sub Main(args As String())
' Create workbook and add worksheet with data
Dim workbook As WorkBook = WorkBook.Create()
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Data")
' Add header row to define column structure
sheet("A1").Value = "Product"
sheet("B1").Value = "Region"
sheet("C1").Value = "Sales"
' Add sample data to cells
sheet("A2").Value = "Widget"
sheet("B2").Value = "North"
sheet("C2").Value = 1500
' ... continue to add more data rows
sheet("A3").Value = "Laptop"
sheet("B3").Value = "South"
sheet("C3").Value = 1500
sheet("A4").Value = "Phone"
sheet("B4").Value = "North"
sheet("C4").Value = 800
sheet("A5").Value = "Phone"
sheet("B5").Value = "South"
sheet("C5").Value = 950
sheet("A6").Value = "Tablet"
sheet("B6").Value = "East"
sheet("C6").Value = 600
sheet("A7").Value = "Tablet"
sheet("B7").Value = "West"
sheet("C7").Value = 750
sheet("A8").Value = "Monitor"
sheet("B8").Value = "North"
sheet("C8").Value = 400
sheet("A9").Value = "Monitor"
sheet("B9").Value = "South"
sheet("C9").Value = 500
sheet("A10").Value = "Keyboard"
sheet("B10").Value = "East"
sheet("C10").Value = 300
' Create summary analysis worksheet
Dim summarySheet = workbook.CreateWorkSheet("Summary")
' Group and calculate aggregated data
Dim data = sheet("A1:C10").ToDataTable(True)
Dim productSummary = data.AsEnumerable() _
.GroupBy(Function(row) row.Field(Of String)("Product")) _
.Select(Function(group, index) New With {
.Product = group.Key,
.TotalSales = group.Sum(Function(r) Convert.ToDecimal(r("Sales"))),
.Count = group.Count(),
.RowIndex = index + 2
})
' Write column headers for summary
summarySheet("A1").Value = "Product Summary"
summarySheet("A2").Value = "Product"
summarySheet("B2").Value = "Total Sales"
summarySheet("C2").Value = "Count"
' Export results to cells
For Each item In productSummary
summarySheet($"A{item.RowIndex + 1}").Value = item.Product
summarySheet($"B{item.RowIndex + 1}").Value = item.TotalSales
summarySheet($"C{item.RowIndex + 1}").Value = item.Count
Next
' Apply number formatting and style
summarySheet("B:B").FormatString = "$#,##0.00"
' Save the xlsx file
workbook.SaveAs("analysis_ironxl.xlsx")
End Sub
End ClassDieses IronXL-Beispiel zeigt, wie man eine Arbeitsmappe erstellt, Arbeitsblätter hinzufügt, Zellen mit Daten füllt und Aggregationsanalysen durchführt. Der Code gruppiert Daten nach Produkt und berechnet Summen und Zählungen, indem er einen Zusammenfassungsbericht erstellt. Es müssen keine COM-Objekte verwaltet werden, und die Methoden sind einfache .NET-Sammlungen, die automatisch den Speicher verwalten.
Ausgabe


Wichtige Unterschiede und Überlegungen
Bereitstellungsanforderungen
Excel Interop erfordert:
-
Microsoft Excel-Installation mit einer gültigen Lizenz
-
Windows-Betriebssystem
-
Ordentliche COM-Berechtigungen und -Einstellungen
-
Serverkonfiguration für Office-Automatisierung IronXL erfordert:
-
Nur das IronXL-Bibliothekspaket
-
Funktioniert auf jeder Plattform, die .NET unterstützt
-
Keine Office-Installation oder Lizenz erforderlich
-
Vereinfachter Bereitstellungsprozess

Codequalität und Wartung
Interop umfasst das sorgfältige Verwalten von COM-Objekten, um Speicherlecks und Fehler zu vermeiden. Jedes erstellte Excel-Objekt muss explizit über die richtigen Methoden freigegeben werden. IronXL verwendet Standard-.NET-Objekte mit automatischer Garbage Collection, was das Risiko von Ressourcenproblemen reduziert.
Fehlerbehandlung
Mit Interop hängen Fehler oft mit der Verfügbarkeit von Excel, Versionsunterschieden oder COM-Ausfällen zusammen. IronXL-Fehler sind Standard-.NET-Ausnahmen, was das Debuggen erleichtert. Sie können sich auf vertraute Try-Catch-Muster verlassen, ohne sich um COM-spezifische Probleme kümmern zu müssen.
Beste Praktiken und Empfehlungen
Wählen Sie Excel Interop, wenn:
-
Sie genaue Excel-Pivottabellenfunktionen mit allen Formatierungsoptionen benötigen
-
Excel wird garantiert auf dem System verfügbar sein
-
Nur an Windows-Desktopanwendungen arbeiten
-
Legacy-Code-Anforderungen Wählen Sie IronXL, wenn:
-
Erstellung von Serveranwendungen oder Weblösungen
-
Erforderliche plattformübergreifende Kompatibilität
-
Zuverlässige Leistung ohne COM-Overhead erforderlich
-
Bereitstellung in Containern oder Cloud-Umgebungen
Besuchen Sie IronXL-Dokumentation, um mehr Details über die Implementierung zu erfahren. Für Fragen oder Unterstützung, kontaktieren Sie das Iron Software-Team.
Abschluss
Während C# Interop direkten Zugriff auf die Erstellung von Pivot-Tabellen in Excel bietet, bringt es Bereitstellungseinschränkungen und Komplexität mit sich. IronXL bietet eine moderne Alternative, die die Manipulation von Excel-Dateien vereinfacht und die Flexibilität bietet, überall zu laufen, wo .NET unterstützt wird.
Für Entwickler, die neue Anwendungen erstellen oder bestehende Lösungen modernisieren, eliminiert der Ansatz von IronXL den COM-Interop-Overhead, während leistungsstarke Datenmanipulationsfunktionen bereitgestellt werden. Ob Sie Daten in Excel lesen, bearbeiten oder exportieren müssen, IronXL liefert eine sauberere Lösung.
Starten Sie mit IronXLs kostenloser Testversion, um den Unterschied zu erleben oder erkunden Sie Tutorials, um weitere Beispiele zu sehen. Bereit zum Deployment? Sehen Sie sich die Lizenzierungsoptionen an, um das richtige Paket für Ihre Aufgabe zu wählen.

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.
Verwandte Artikel



