IRONSOFTWAREHOME
UTILISATION D'IRONXL

Comment créer des tableaux croisés dynamiques dans Excel avec C# sans interopérabilité

Curtis Chau
Curtis Chau
Updated: 28 juin 2026

Créer un tableau croisé dynamique dans Excel avec C# est simple si vous choisissez la bonne bibliothèque : Interop Excel nécessite Office sur chaque machine, tandis IronXL fonctionne partout où .NET est exécuté. Ce guide présente les deux approches avec des exemples de code complets, couvrant la configuration, l'agrégation des données, la configuration des champs et les considérations de déploiement, afin de vous aider à choisir la solution la plus adaptée à votre projet.

Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 1 - IronXL

Quelle est la différence entre Interop Excel et IronXL?

Avant d'écrire une seule ligne de code, il est utile de comprendre le fonctionnement interne de chaque approche. Interop Excel utilise COM (Component Object Model) pour piloter Microsoft Excel directement depuis C#. Le processus .NET communique avec une instance Excel en cours d'exécution, ce qui implique qu'Excel doit être installé sur la machine. Chaque objet manipulé (classeurs, feuilles de calcul, plages, caches de tableaux croisés dynamiques) est un wrapper COM et doit être libéré explicitement pour éviter les fuites de mémoire.

IronXL emprunte une voie fondamentalement différente. Il lit et écrit directement le format de fichier Open XML , sans même avoir à lancer Excel. Le résultat est une bibliothèque .NET standard avec des modèles d'objets familiers, une mémoire gérée par le ramasse-miettes et aucune dépendance à l'installation ou à la licence d'Office. Cette architecture rend IronXL adapté aux charges de travail côté serveur , aux conteneurs Docker, aux hôtes Linux et à tout environnement .NET 6, .NET 8 ou .NET 10.

Interop Excel vs IronXL : un aperçu
CritèresInterop ExcelIronXL
Bureau requisOuiNon
Windows uniquementOuiNonn -- multiplateforme
Gestion de la mémoireLibération manuelle COMAutomatique (GC .NET )
Déploiement du serveurDifficileDirect
Tableau pivot natifAPI complète des tableaux croisés dynamiques ExcelAgrégation de données via LINQ
Licence requiseLicence de bureauLicence IronXL uniquement

Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 2 - Plateforme Croisée

Comment installer chaque bibliothèque ?

Configuration de l'interopérabilité Excel

Interop Excel est distribué sous forme de package NuGet . Exécutez l'une des commandes suivantes dans votre projet :

Install-Package Microsoft.Office.Interop.Excel
dotnet add package Microsoft.Office.Interop.Excel
SHELL

Nontez que le package seul ne suffit pas : la machine cible doit disposer d'une version compatible de Microsoft Excel installée et correctement licenciée. Cette dépendance exclut la plupart des scénarios de serveur, de conteneur et de cloud.

Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 3 - Installation Interop Excel

Configuration IronXL

Installez IronXL via NuGet sans configuration système supplémentaire :

PM > Install-Package IronXL.Excel

Après l'installation, vous pouvez commencer immédiatement à lire et à écrire des fichiers Excel sur n'importe quelle plateforme prenant en charge .NET. Aucune licence Office, aucun enregistrement COM, aucune configuration serveur. Consultez le guide d'installation d'IronXL pour découvrir d'autres options, notamment l'installation hors ligne et la configuration de la référence de projet.

Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 4 - Installation

Première étape :
arrow pointer

Comment créez-vous un tableau croisé dynamique Excel avec C# Interop ?

Le flux de travail du tableau croisé dynamique Interop suit une séquence stricte : créer un cache de tableau croisé à partir d'une plage source, puis construire un objet PivotTable sur une feuille de calcul distincte, puis configurer les orientations des champs. L'exemple ci-dessous utilise des instructions C# de haut niveau compatibles avec .NET 10 :

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

// Launch Excel and set up workbooks
var excelApp = new Excel.Application();
excelApp.Visible = false;
var workbook = excelApp.Workbooks.Add();
var dataSheet = (Excel.Worksheet)workbook.Worksheets[1];
dataSheet.Name = "SalesData";
var pivotSheet = (Excel.Worksheet)workbook.Worksheets.Add();
pivotSheet.Name = "Pivot";

// Populate header row
dataSheet.Cells[1, 1] = "Product";
dataSheet.Cells[1, 2] = "Region";
dataSheet.Cells[1, 3] = "Sales";

// Add sample data rows
object[,] rows = {
    { "Laptop",   "Nonrth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "Nonrth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "Nonrth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet.Cells[i + 2, 1] = rows[i, 0];
    dataSheet.Cells[i + 2, 2] = rows[i, 1];
    dataSheet.Cells[i + 2, 3] = rows[i, 2];
}

// Build pivot cache from source range
Excel.Range dataRange = dataSheet.Range["A1:C10"];
Excel.PivotCache pivotCache = workbook.PivotCaches().Create(
    Excel.XlPivotTableSourceType.xlDatabase, dataRange);

// Create the PivotTable on the pivot sheet
Excel.PivotTables pivotTables = (Excel.PivotTables)pivotSheet.PivotTables();
Excel.PivotTable pivotTable = pivotTables.Add(
    pivotCache, pivotSheet.Range["A3"], "SalesPivot");

// Assign field orientations
((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;

// Enable grand totals
pivotTable.RowGrand = true;
pivotTable.ColumnGrand = true;

// Save and close
workbook.SaveAs(@"C:\output\pivot_interop.xlsx");
workbook.Close(false);
excelApp.Quit();

// Release every COM object -- skipping any of these causes Excel to stay in memory
Marshal.ReleaseComObject(pivotTable);
Marshal.ReleaseComObject(pivotTables);
Marshal.ReleaseComObject(pivotCache);
Marshal.ReleaseComObject(dataRange);
Marshal.ReleaseComObject(pivotSheet);
Marshal.ReleaseComObject(dataSheet);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(excelApp);

Chaque wrapper COM nécessite un appel Marshal.ReleaseComObject correspondant. L'absence d'une seule référence entraîne la persistance du processus Excel en arrière-plan, consommant de la mémoire et des descripteurs de fichiers jusqu'à la fin du processus hôte. Cette charge de travail liée au nettoyage est proportionnelle à la complexité des opérations effectuées sur votre feuille de calcul.

Comment obtenir le même résultat avec IronXL?

IronXL n'expose pas d'API de tableau croisé dynamique native de la même manière qu'Interop ; le format de tableau croisé dynamique Open XML comporte des centaines d'attributs XML, et la plupart des exigences métier sont satisfaites de manière plus fiable avec une agrégation LINQ explicite écrite en C# pur. Le résultat est une feuille de synthèse propre qui se recalcule correctement à l'ouverture du fichier, sans dépendre d'Excel pour actualiser un cache de tableau croisé dynamique.

using IronXL;
using System.Data;

// Create workbook and populate source data
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet dataSheet = workbook.CreateWorkSheet("SalesData");

dataSheet["A1"].Value = "Product";
dataSheet["B1"].Value = "Region";
dataSheet["C1"].Value = "Sales";

object[,] rows = {
    { "Laptop",   "Nonrth", 1200 },
    { "Laptop",   "South", 1500 },
    { "Phone",    "Nonrth",  800 },
    { "Phone",    "South",  950 },
    { "Tablet",   "East",   600 },
    { "Tablet",   "West",   750 },
    { "Monitor",  "Nonrth",  400 },
    { "Monitor",  "South",  500 },
    { "Keyboard", "East",   300 },
};
for (int i = 0; i < rows.GetLength(0); i++)
{
    dataSheet[$"A{i + 2}"].Value = rows[i, 0];
    dataSheet[$"B{i + 2}"].Value = rows[i, 1];
    dataSheet[$"C{i + 2}"].Value = rows[i, 2];
}

// Aggregate data with LINQ -- equivalent to a pivot table row/column/value layout
DataTable table = dataSheet["A1:C10"].ToDataTable(true);
var summary = table.AsEnumerable()
    .GroupBy(row => row.Field<string>("Product"))
    .Select((group, idx) => new
    {
        Product    = group.Key,
        TotalSales = group.Sum(r => Convert.ToDecimal(r["Sales"])),
        RegionCount = group.Select(r => r.Field<string>("Region")).Distinct().Count(),
        RowIndex   = idx + 2
    })
    .OrderByDescending(x => x.TotalSales);

// Write the summary sheet
WorkSheet summarySheet = workbook.CreateWorkSheet("Summary");
summarySheet["A1"].Value = "Product";
summarySheet["B1"].Value = "Total Sales";
summarySheet["C1"].Value = "Regions";

foreach (var item in summary)
{
    summarySheet[$"A{item.RowIndex}"].Value = item.Product;
    summarySheet[$"B{item.RowIndex}"].Value = (double)item.TotalSales;
    summarySheet[$"C{item.RowIndex}"].Value = item.RegionCount;
}

// Apply currency format to the sales column
summarySheet["B:B"].FormatString = "$#,##0.00";

// Bold the header row
summarySheet["A1:C1"].Style.Font.Bold = true;

// Save -- no COM cleanup needed
workbook.SaveAs(@"C:\output\analysis_ironxl.xlsx");

Il n'y a aucun objet COM à libérer, aucun processus Excel à terminer et aucune licence Office à gérer. Le même code se compile et s'exécute sous Linux, macOS et Windows sans modification. Pour plus de détails sur l'API d'agrégation, consultez la documentation IronXL WorkSheet .

Sortie

Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 6 - Résultat IronXL

Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 7 - Résumé du Résultat

Quelles sont les principales différences en matière de déploiement et de maintenance ?

Exigences de déploiement

Le déploiement d'une application basée sur l'interopérabilité implique de vérifier que l'environnement cible exécute Windows, dispose de la version correcte d'Office installée et que les autorisations d'automatisation COM sont configurées sur le serveur. Les environnements hébergés dans le cloud et les charges de travail conteneurisées ne peuvent généralement pas répondre à ces exigences sans l'ajout d'une infrastructure de bureau Windows virtualisée, ce qui augmente considérablement les coûts et la complexité opérationnelle.

IronXL ne présente pas de telles contraintes. Ajoutez le package NuGet , définissez votre framework cible sur .NET 6 ou version ultérieure, et l'application se déploie sur n'importe quel hôte, y compris les conteneurs Linux, Azure App Service sur Linux, AWS Lambda et les serveurs Windows locaux. La page des configurations système requises d'IronXL répertorie la matrice de compatibilité complète.

Gestion et Débogage des Erreurs

Les échecs Interop se manifestent sous forme d'exceptions COM (COMException) qui sont difficiles à traduire en messages visibles par l'utilisateur. Les incompatibilités de versions entre la version d'Office installée et l'assembly Interop constituent un autre mode de défaillance. Le débogage de ces problèmes nécessite généralement de reproduire la version exacte d'Office sur une machine de développement.

IronXL génère des sous-classes System.Exception standard avec des messages descriptifs. Vous pouvez encapsuler les opérations sur les fichiers dans un bloc try-catch et fournir un retour d'information pertinent sans avoir à comprendre les codes d'erreur COM. Le guide de dépannage IronXL couvre les exceptions courantes et leurs solutions.

Mémoire et performances

Les objets COM contiennent de la mémoire non gérée. Si votre code traite de nombreuses feuilles de calcul ou s'exécute en boucle, le fait de ne pas libérer correctement chaque référence entraîne une augmentation de la mémoire au fil du temps – un problème difficile à détecter jusqu'à ce qu'il provoque un incident de production. Interop est également intrinsèquement monothread car il gère une seule fenêtre Excel.

IronXL utilise des objets gérés, pris en charge par le ramasse-miettes .NET . La mémoire est automatiquement libérée lorsque les objets sortent de leur portée. Le traitement parallèle de plusieurs classeurs est simple car il n'y a pas d'état COM partagé à protéger par des verrous.

Comment choisir entre les deux approches ?

L'outil approprié dépend de deux contraintes : l'emplacement d'exécution du code et la nécessité d'un fichier XML natif pour les tableaux croisés dynamiques.

Choisissez Interop Excel lorsque :

La charge de travail s'exécute uniquement sur les ordinateurs de bureau Windows sur lesquels Office est déjà installé.

  • Le formatage exact du tableau croisé dynamique natif (segments, champs de dates groupés, éléments calculés) est requis dans le fichier de sortie.
  • Vous gérez une base de code d'interopérabilité existante et une réécriture complète n'est pas justifiée.

Choisissez IronXL lorsque :

L'application s'exécute sur un serveur, un conteneur ou une fonction cloud.

  • Un déploiement multiplateforme ou Linux est requis Vous souhaitez une logique d'agrégation de données testable par des tests unitaires, indépendante d'un processus Excel.
  • Vous devez traiter des fichiers Excel à grande échelle ou en parallèle

Pour la plupart des nouveaux projets .NET 10, IronXL est le choix par défaut. La bibliothèque IronXL couvre également la lecture de fichiers Excel en C#, la création de graphiques, l'application de styles de cellule, le travail avec des formules et l'exportation de données Excel vers DataTable -- réduisant le besoin de plusieurs bibliothèques dans votre pile.

Comment créer un tableau croisé dynamique dans Excel en utilisant C# Interop vs IronXL : Image 8 - Fonctionnalités

Quelles sont les fonctionnalités supplémentaires IronXL qui prennent en charge l'analyse des données ?

Au-delà de l'agrégation de base, IronXL offre plusieurs fonctionnalités qui prennent en charge des flux de travail d'analyse de données plus riches :

Tri et filtrage des données

Vous pouvez trier une plage de valeurs par ordre croissant ou décroissant avant de rédiger un tableau récapitulatif. Cela garantit que les données de sortie sont toujours présentées dans un ordre cohérent, ce qui rend le traitement en aval plus prévisible. Consultez la documentation IronXL sur le tri pour les options de tri au niveau de la plage.

Application de la mise en forme conditionnelle

Soulignez les valeurs aberrantes ou seuils en appliquant des règles de formatage conditionnel par programmation. Par exemple, vous pouvez colorer en rouge les cellules du tableau récapitulatif lorsque les ventes sont inférieures à un objectif, ce qui permet d'obtenir une vue d'ensemble sans que les utilisateurs finaux aient à configurer les règles manuellement.

Lecture de fichiers Excel existants

Si les données sources proviennent d'une feuille de calcul existante plutôt que d'une base de données, vous pouvez les charger directement avec WorkBook.Load :

using IronXL;

WorkBook existing = WorkBook.Load(@"C:\data\sales_report.xlsx");
WorkSheet sheet = existing.WorkSheets[0];

// Read column C starting at row 2
var salesValues = sheet["C2:C100"]
    .Where(cell => cell.Value != null && cell.Value.ToString() != string.Empty)
    .Select(cell => cell.DecimalValue)
    .ToList();

decimal total = salesValues.Sum();
Console.WriteLine($"Total sales from file: {total:C}");

Ce modèle fonctionne pour .xlsx, .xls, .csv, et d'autres formats pris en charge par IronXL. Les détails sur les formats pris en charge figurent dans la documentation sur les formats de fichiers IronXL.

Exporter au format CSV

Après avoir généré une feuille de calcul récapitulative, vous pouvez l'exporter au format CSV pour les systèmes en aval qui n'acceptent pas Excel :

workbook.SaveAsCsv(@"C:\output\summary.csv");

Ceci est particulièrement utile dans les pipelines ETL où le consommateur final est un outil d'importation de base de données ou un chargeur d'entrepôt de données.

Comment démarrer avec IronXL gratuitement ?

IronXL est disponible sous une licence d'essai gratuite qui vous permet d'évaluer l'ensemble des fonctionnalités sans vous engager sur un abonnement. La version d'essai appose un filigrane sur les fichiers de sortie, que vous supprimez lorsque vous appliquez une clé de licence de production.

Pour activer une clé de licence par code, définissez-la avant toute opération IronXL :

IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

Vous pouvez également définir la clé via une variable d'environnement (IRONXL_LICENSEKEY) ou par appsettings.json dans les projets ASP.NET Core. La page de licences IronXL décrit tous les niveaux disponibles, y compris les options pour les équipes et les organisations.

Pour les déploiements en production, consultez la documentation de déploiement IronXL et la bibliothèque de tutoriels IronXL pour des modèles couvrant ASP.NET Core, Azure Functions, et Docker.

Comment franchir la prochaine étape ?

Les tableaux croisés dynamiques Excel en C# ne nécessitent pas forcément une dépendance à Office ni une complexité liée à COM. Avec IronXL, vous écrivez du code .NET simple qui s'exécute sur n'importe quelle plateforme, gère automatiquement la mémoire et s'intègre naturellement aux frameworks de tests unitaires et aux pipelines CI/CD.

Téléchargez la version d'essai gratuite IronXL et exécutez les exemples de ce guide avec vos propres données. Si vous avez des questions, le forum de la communauté IronXL et le portail d'assistance sont disponibles pour les utilisateurs en version d'essai et les utilisateurs disposant d'une licence. Une fois que vous êtes prêt à déployer votre solution, consultez les options de licence pour trouver le plan qui correspond à la taille de votre équipe et à votre volume d'utilisation.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise