Passer au contenu du pied de page
UTILISATION D'IRONXL

Comment créer un tableau croisé dynamique dans Excel à l'aide de C# Interop vs IronXL

La génération programmatique de tableaux croisés dynamiques dans Excel nécessite soit une interopération C# avec ses dépendances Office, soit des bibliothèques modernes comme IronXL qui fonctionnent de manière indépendante. Ce tutoriel démontre les deux approches, soulignant pourquoi les développeurs choisissent de plus en plus IronXL par rapport aux méthodes traditionnelles Interop.

Dans cet article, nous allons apprendre à éditer, créer, concevoir et calculer des tableaux croisés dynamiques et des groupes, avec une analyse automatique et une gestion des erreurs.

Qu'est-ce qu'un tableau croisé dynamique Excel ? Un tableau croisé dynamique est l'un des outils les plus puissants que vous puissiez ajouter dans Excel. C'est un moyen facile et simple de résumer de grands ensembles de données. Par conséquent, les tableaux croisés dynamiques vous permettent d'afficher, de comprendre et d'analyser facilement des données numériques. Les tableaux croisés dynamiques sont disponibles non seulement dans Excel, mais aussi dans d'autres programmes tels que Google Sheets, Apple Numbers et les exportations CSV. Il fournit une solution pour voir les données dans leur ensemble - agissant comme une console de données pour permettre aux gens de voir leurs informations d'une manière significative - en faisant le lien avec la réalité. Réalisons un tableau croisé dynamique de la mauvaise façon, puis apprenons à le faire de la bonne façon en C# : ## Comment créer un tableau croisé dynamique dans les tableaux Excel à l'aide de l'interopérabilité C#? C# Excel Interop fournit un accès direct à la fonctionnalité de tableau croisé dynamique d'Excel par le biais de l'automatisation COM. Voici l'approche traditionnelle que de nombreux développeurs trouvent lorsqu'ils recherchent un outil pour générer un tableau croisé dynamique en C# : (Déprécié) ### Comment créer des tableaux croisés dynamiques à l'ancienne en .NET ```cs 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); ``` Cet exemple Interop crée un tableau croisé dynamique Excel natif avec le produit comme lignes, la région comme colonnes et les ventes additionnées dans la zone de données. Bien que fonctionnelle, cette approche nécessite l'installation de Microsoft Office et une gestion attentive des objets COM. Reportez-vous à la documentation de Microsoft pour savoir pourquoi ne pas utiliser cette approche dans le cadre d'un développement moderne.

Quels sont les problèmes posés par l'interopérabilité du C# ? L'approche Interop présente plusieurs défis importants : Malheureusement, Stack Overflow et d'autres sites de programmation continuent de la recommander parce qu'ils sont enfermés dans le temps avec des fils de discussion bloqués sur des idées datant du début des années 2000. **Dépendances de déploiement** : Nécessite l'installation de Microsoft Office sur chaque machine exécutant le code source, y compris les serveurs de production. Cela ajoute des coûts de licence et une complexité de déploiement. **Gestion de la mémoire** : Les objets COM doivent être explicitement libérés à l'aide de `Marshal.ReleaseComObject()`. Oublier ne serait-ce qu'un seul objet provoque le blocage des processus Excel en mémoire, comme [documenté de manière approfondie sur Stack Overflow](https://stackoverflow.com/questions/158706/how-do-i-properly-clean-up-excel-interop-objects). **Détails sur les limites de la plate-forme** : Cette solution démodée ne fonctionne que sur Windows avec Office installé et peut être incroyablement lente, déroutante pour l'utilisateur et entraîner des fuites de mémoire. Aucun support pour Linux, macOS, les conteneurs Docker, ou des plateformes cloud comme Azure Functions. **Problèmes de performance** : le démarrage des instances d'application Excel est lent et gourmand en ressources, surtout pour le traitement côté serveur. **Compatibilité des versions** : les différentes versions d'Office peuvent avoir des interfaces COM variables, causant des problèmes de compatibilité entre les environnements. ## Comment IronXL crée-t-il un tableau croisé dynamique de manière programmatique sans interopérabilité ? [IronXL](/docs/) aborde la création de tableaux croisés dynamiques différemment, en utilisant du code géré sans dépendances COM. Bien qu'il ne crée pas de tableaux croisés dynamiques natifs pour Excel, il offre de puissantes capacités d'agrégation. ### Comment créer un tableau croisé dynamique XLSX ou XLS par programmation de manière moderne ```cs 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"); } } ``` Ainsi, en 2025, c'est ainsi que vous créez des tableaux croisés dynamiques. ### Sortie [Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 1 - Le fichier Excel original vs. le tableau croisé dynamique que nous avons créé montrant les cellules.](/static-assets/excel/blog/create-pivot-excel-blog/create-pivot-excel-blog-1.webp) ## Comment créer des résumés dynamiques avec les formules IronXL ? Pour les scénarios nécessitant des mises à jour dynamiques similaires à la création d'un tableau croisé dynamique, calculez la fonctionnalité de rafraîchissement des tableaux croisés dynamiques, IronXL.Excel peut exploiter les formules intégrées d'Excel pour obtenir vos réponses. En général, cette réponse est préférable à la précédente - votre dossier est traité de manière beaucoup plus moderne et élégante, avec un code qu'une personne peut comprendre facilement. Facile à installer, sans avoir à contacter l'assistance ou à lire un manuel. ```cs // 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 ``` Ces formules maintiennent des connexions actives aux données source, se mettant à jour automatiquement lorsque la feuille de données change - similaire au comportement de rafraîchissement des tableaux croisés mais sans les dépendances Interop. Si nous appliquons ce code à l'exemple de fichier Excel (XLS / XLSX) de l'exemple précédent, nous obtiendrons cette sortie de champs sur la page : ![Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 2 - Note : C# Dynamic summaries output seen in location context.](/static-assets/excel/blog/create-pivot-excel-blog/create-pivot-excel-blog-2.webp) ## Comparaison entre C# Interop et IronXL pour les tableaux croisés dynamiques | Aspect| C# Interop| IronXL| |--------------------------|--------------------------------------|--------------------------------------| | Bureau requis| Oui - Installation complète| Non - Bibliothèque autonome| | Prise en charge de la plate-forme| Windows uniquement| Windows, Linux, macOS, Docker| | Gestion de la mémoire| Nettoyage manuel de COM requis| Collecte automatique des déchets .NET| | Déploiement| Complexe - Licences Office| Simple - DLL unique| | Performance| Lent - Démarrage du processus Excel| Rapide - Calculs en mémoire| | Compatible avec le cloud| Non - Limites d'Azure| Oui - Prise en charge d'Azure Functions| | Tableaux croisés dynamiques natifs| Oui| Non - Alternatives à l'agrégation| | Vitesse de développement| Lent - complexité de COM| API rapide et intuitive| ## Quelle approche devriez-vous choisir ? Choisissez C# Interop quand : - Les objets de tableau croisé dynamique natifs d'Excel sont absolument nécessaires - Travailler exclusivement sur Windows avec Office installé sur chaque machine cible - Déploiement uniquement sur les systèmes de bureau que vous administrez - Le code existant dépend d'Interop - Utilisation d'une ancienne version de .NET Framework Choisissez IronXL lorsque : - Déploiement sur des serveurs ou des environnements et services en nuage (Azure, AWS ...) - Création d'applications multiplateformes - Exiger de meilleures performances et une plus grande fiabilité - Éviter les coûts de licence d'Office - Besoin d'un code plus simple et plus facile à maintenir - Prise en charge des systèmes Mac, iOS, Android et/ou Linux - Travailler dans les versions modernes de .NET Framework Core et .NET 5,6,7,8,9,10 - Vous souhaitez disposer d'un accès complet à votre console de développement / IDE pour configurer les paramètres de chaque champ du tableau croisé dynamique de manière programmatique à partir de vos plages de données. ## Conclusion Bien que C# Excel Interop puisse développer des tableaux croisés dynamiques natifs, ses restrictions de déploiement et sa complexité le rendent de plus en plus impraticable pour les applications modernes. [IronXL](/get-started/c-sharp-excel-interop/) fournit des alternatives puissantes grâce à l'agrégation de données et à des résumés basés sur des formules, éliminant les dépendances d'Office tout en conservant les capacités analytiques. Veuillez voter, commenter ou vous abonner si cela vous a été utile. Pour les développeurs à la recherche d'une option alternative pour développer des tableaux croisés dynamiques sans Interop, IronXL offre une voie supérieure qui évite les complications COM, fonctionne sur toutes les plateformes et simplifie le déploiement. Le compromis de ne pas avoir d'objets de tableau croisé natifs est compensé par une plus grande flexibilité, de meilleures performances, et l'élimination des exigences de licence Office.
Commencez avec IronXL maintenant.
green arrow pointer
Prêt à moderniser votre automatisation Excel et créer votre propre code de tableau croisé dynamique en C# moderne ? IronXL peut être mis en œuvre dans vos applications C# en quelques secondes grâce au gestionnaire de paquets NuGet. [Essayez l'essai gratuit](trial-license) ou [Achetez une licence IronXL](/licensing/) pour éliminer les dépendances Interop dans vos applications de production.

Jordi Bardia
Ingénieur logiciel
Jordi est le plus compétent en Python, C# et C++, et lorsqu'il ne met pas à profit ses compétences chez Iron Software, il programme des jeux. Partageant les responsabilités des tests de produit, du développement de produit et de la recherche, Jordi apporte une immense valeur à l'amé...
Lire la suite