Passer au contenu du pied de page
UTILISATION D'IRONXL

Comment créer un tableau croisé dynamique Excel en C#

Travailler avec un tableau croisé dynamique Excel de manière programmatique est une exigence courante dans les applications commerciales qui doivent analyser et calculer des données sources. Bien que l'Interop d'Excel de Microsoft ait été la méthode traditionnelle pour créer un tableau croisé dynamique dans un fichier Excel, des solutions modernes comme IronXL offrent des avantages significatifs. Ce guide détaille les deux méthodes avec des exemples pratiques pour vous aider à créer un tableau croisé dynamique dans Excel en utilisant l'Interop C# ou choisir une meilleure alternative.

Comprendre les deux approches

Qu'est-ce que l'Interop Excel ?

Excel Interop utilise COM (Component Object Model) pour contrôler Microsoft Excel directement via C#. Il nécessite qu'Office soit installé sur le système et automatise essentiellement Excel comme si un utilisateur interagissait avec l'application. Chaque feuille de calcul, classeur et cellule devient un objet que vous pouvez manipuler via du code.

Qu'est-ce qu'IronXL ?

IronXL est une bibliothèque autonome .NET qui peut lire, éditer et créer des fichiers Excel sans nécessiter Microsoft Office. Il fonctionne sur Windows, Linux, macOS et les conteneurs Docker, ce qui le rend idéal pour les scénarios de déploiement modernes. Vous pouvez ouvrir, enregistrer et exporter des données sans le surcoût de l'interop COM.

Configuration de votre environnement

Pour Excel Interop

Install-Package Microsoft.Office.Interop.Excel

Pour IronXL

Install-Package IronXL.Excel

Alternativement, utilisez l'UI du gestionnaire de paquets NuGet en recherchant "IronXL.Excel" et en cliquant sur installer. Vous pouvez également installer via le CLI .NET avec les arguments de commande ou le référencer directement depuis GitHub.

Les deux bibliothèques sont disponibles via NuGet. Notez qu'Interop Excel nécessite une installation complète de Microsoft Office, tandis qu'IronXL fonctionne de manière indépendante. Avant de procéder, assurez-vous que votre système répond aux exigences.

Créer un tableau croisé dynamique Excel de manière programmatique avec C# Interop

Voici un exemple complet montrant comment créer un tableau croisé dynamique de manière programmatique en utilisant la méthode traditionnelle Interop :

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
    }
}
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
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Ce code crée une application Excel, ajoute une feuille de calcul avec des données sources incluant une ligne d'en-tête, établit un cache des données de tableau croisé, construit l'objet PivotTable et configure l'orientation du champ. La section de nettoyage est cruciale - ne pas libérer les objets COM provoque des fuites de mémoire. Chaque cellule, plage et feuille de calcul doit être correctement éliminée pour éviter les erreurs d'exécution.

L'approche alternative IronXL

IronXL adopte une approche différente en travaillant directement avec le format de fichier Excel. Voici comment obtenir des résultats d'analyse similaires de manière programmatique :

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");
    }
}
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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Cet exemple IronXL montre comment créer un classeur, ajouter des feuilles de calcul, remplir les cellules avec des données et effectuer une analyse d'agrégation. Le code regroupe les données par produit et calcule les totaux et les comptes, créant un rapport sommaire. Aucun objet COM n'a besoin d'être géré, et les méthodes sont des collections .NET simples qui gèrent automatiquement la mémoire.

Sortie

Comment créer un tableau croisé dynamique Excel en C# : Figure 6 - Sortie IronXL

Comment créer un tableau croisé dynamique Excel en C# : Figure 7 - Sortie sommaire

Principales différences et considérations

Exigences de déploiement

Excel Interop nécessite :

  • Une installation de Microsoft Excel avec une licence valide
  • Système d'exploitation Windows
  • Permissions et paramètres COM appropriés
  • Configuration du serveur pour l'automatisation Office IronXL nécessite :

  • Uniquement le paquet de bibliothèque IronXL
  • Fonctionne sur toute plateforme supportant .NET
  • Aucune installation ou licence Office nécessaire
  • Processus de déploiement simplifié

Comment créer un tableau croisé dynamique Excel en C# : Figure 8 - Fonctionnalités

Qualité du code et maintenance

Interop implique de gérer les objets COM avec soin pour éviter les fuites de mémoire et les erreurs. Chaque objet Excel créé doit être explicitement libéré en utilisant les bonnes méthodes. IronXL utilise des objets standard .NET avec une collecte automatique des déchets, réduisant le risque de problèmes de ressources.

Gestion des erreurs

Avec Interop, les erreurs se rapportent souvent à la disponibilité d'Excel, aux différences de versions ou aux échecs COM. Les erreurs IronXL sont des exceptions .NET standard, ce qui rend le débogage plus simple. Vous pouvez compter sur des modèles try-catch familiers sans vous soucier des problèmes spécifiques à COM.

Meilleures pratiques et recommandations

Choisissez Excel Interop lorsque :

  • Vous avez besoin des fonctionnalités exactes de tableau croisé dynamique Excel avec toutes les options de formatage
  • Excel est garanti d'être disponible sur le système
  • Travailler uniquement sur des applications de bureau Windows
  • Exigences de code hérité Choisissez IronXL lorsque :

  • Construire des applications serveur ou des solutions web
  • Besoin de compatibilité multiplateforme
  • Besoin de performances fiables sans surcharge COM
  • Déployer dans des conteneurs ou des environnements cloud

Visitez la documentation IronXL pour en savoir plus sur l'implémentation. Pour toute question ou support, contactez l'équipe d'Iron Software.

Conclusion

Bien que l'Interop C# fournisse un accès direct pour créer des fonctionnalités de tableau croisé dynamique dans Excel, il est accompagné de limitations de déploiement et de complexité. IronXL offre une alternative moderne qui simplifie la manipulation de fichiers Excel tout en offrant la flexibilité de fonctionner partout où .NET est pris en charge.

Pour les développeurs créant de nouvelles applications ou modernisant des solutions existantes, l'approche d'IronXL élimine la surcharge de l'interop COM tout en offrant de puissantes capacités de manipulation de données. Que vous ayez besoin de lire, éditer ou exporter des données Excel, IronXL offre une solution plus propre.

Commencez avec l'essai gratuit d'IronXL pour découvrir la différence, ou explorez les tutoriels pour voir plus d'exemples. Prêt à déployer ? Consultez les options de licence pour choisir le bon package pour votre tâche.

Comment créer un tableau croisé dynamique Excel en C# : Figure 9 - Licences

Questions Fréquemment Posées

Quel est l'avantage d'utiliser IronXL plutôt qu'Excel Interop pour créer des tableaux croisés dynamiques ?

IronXL offre des avantages significatifs par rapport à Excel Interop, notamment une facilité d'utilisation, de meilleures performances et la capacité de créer des tableaux croisés dynamiques sans nécessiter l'installation d'Excel sur le serveur.

Puis-je créer un tableau croisé dynamique Excel en C# sans utiliser Excel Interop ?

Oui, vous pouvez créer un tableau croisé dynamique Excel en C# en utilisant IronXL, qui fournit une alternative moderne et efficace à Excel Interop.

Est-il nécessaire d'avoir Microsoft Excel installé pour utiliser IronXL ?

Non, IronXL n'exige pas que Microsoft Excel soit installé sur votre système, en faisant une solution flexible pour créer et gérer des fichiers Excel.

Quelles sont les étapes pour créer un tableau croisé dynamique dans Excel en utilisant IronXL ?

Pour créer un tableau croisé dynamique en utilisant IronXL, chargez d'abord votre fichier Excel, spécifiez la plage de données, définissez vos champs de tableau croisé dynamique, puis générez le tableau croisé dynamique. L'API complète de IronXL rend ce processus simple.

IronXL prend-il en charge d'autres fonctionnalités Excel en dehors des tableaux croisés dynamiques ?

Oui, IronXL prend en charge une large gamme de fonctionnalités Excel, y compris la lecture et l'écriture de fichiers Excel, le formatage des cellules et la réalisation de calculs, entre autres.

Comment IronXL gère-t-il les grands ensembles de données lors de la création de tableaux croisés dynamiques ?

IronXL est conçu pour gérer efficacement de grands ensembles de données, garantissant une création rapide et fiable de tableaux croisés dynamiques même avec des quantités de données considérables.

IronXL peut-il être utilisé dans des applications basées sur le cloud ?

Oui, IronXL peut être intégré dans des applications basées sur le cloud, offrant une solution transparente pour gérer les fichiers Excel dans le cloud.

Quelles langages de programmation sont pris en charge par IronXL pour créer des tableaux croisés dynamiques ?

IronXL prend principalement en charge C#, ce qui facilite la création de tableaux croisés dynamiques et l'exécution d'autres opérations Excel au sein des applications .NET.

Existe-t-il des tutoriels disponibles pour apprendre à utiliser IronXL ?

Oui, Iron Software fournit une documentation complète et des tutoriels sur leur site web pour aider les utilisateurs à apprendre à utiliser efficacement IronXL.

Quelles sont les options de licence disponibles pour IronXL ?

IronXL propose diverses options de licence, y compris des niveaux gratuits et payants, pour répondre aux différents besoins et échelles de projets.

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