Créer un rapport trimestriel des ventes au format Excel (C#, XLSX) à l'aide de Xceed Workbooks pour .NET

La fusion de fichiers DOCX dans C# semble simple jusqu'à ce que des conflits de style, d'en-têtes et de numérotation viennent compliquer les choses. Ce tutoriel explique comment fusionner par programmation des documents Word à l'aide de Xceed Words pour .NET, en utilisant la méthode InsertDocument, les sauts de section et des pipelines basés sur des modèles.

Ce tutoriel vous explique comment créer un rapport de ventes trimestriel au format XLSX à l’aide de C# et de Xceed Workbooks pour .NET. Vous chargerez des données de transaction dans une feuille de calcul, appliquerez des formats numériques et des styles conditionnels, ajouterez des formules SOMME et MOYENNE, puis enregistrerez le fichier avec un en-tête figé. Ces mêmes principes s’appliquent aux dossiers financiers comportant plusieurs feuilles de calcul, aux synthèses de type tableau croisé dynamique et aux exportations planifiées depuis ASP.NET Core. Parmi les alternatives disponibles dans ce domaine, on peut citer EPPlus et ClosedXML ; la section consacrée aux compromis compare les situations dans lesquelles chacune d’entre elles est la plus adaptée. À la fin de ce tutoriel, vous disposerez d’un exemple fonctionnel et d’une liste de contrôle pour les rapports de production.

Les équipes financières demandent la même chose chaque trimestre : un fichier Excel propre avec les totaux, les ventilations régionales et une mise en forme qui résiste à un transfert au directeur financier. Lorsque vous devez générer des fichiers Excel avec .NET qui sont envoyés à de vrais utilisateurs, OpenXML brut donne l'impression d'écrire en assembleur. L'Open XML SDK de Microsoft fonctionne, mais il vous oblige à modéliser manuellement les parties, les relations et les chaînes partagées.

Xceed Workbooks pour .NET gère cette partie technique et expose une API de cellules et de styles que vous pouvez lire d'un coup d'œil. Ce didacticiel crée un rapport de ventes fonctionnel à partir d'une liste de transactions, applique la mise en forme des nombres et une mise en évidence conditionnelle en gras, écrit des cellules de formule et enregistre le résultat. Le même code s'exécute sur .NET Framework 4.6.1+, .NET 6, .NET 8 et .NET 9.

Avant d'écrire du code, installez le package de Xceed.Workbooks.NET sur NuGet. L'essai de 45 jours fonctionne sans clé de licence, vous pouvez donc exécuter l'exemple complet ci-dessous dès que le package est restauré.

Pourquoi Xceed Workbooks pour .NET pour les rapports de vente

Les rapports de vente comportent trois propriétés qui pénalisent les bibliothèques légères : des comptages de lignes variables, des types de données mixtes par colonne et des parties prenantes qui reformattent le fichier après sa livraison. Par conséquent, la bibliothèque que vous choisissez doit écrire de véritables objets Excel, pas du CSV avec une extension .xlsx.

Xceed Workbooks pour .NET écrit le format OOXML SpreadsheetML défini dans ECMA-376, ce qui signifie qu'Excel, LibreOffice, Google Sheets et Power BI ouvrent tous le fichier sans avertissement. Les cellules conservent leurs types natifs, les formules se recalculent à l'ouverture et les styles sont correctement conservés. Les alternatives dans ce domaine incluent EPPlus et ClosedXML ; les deux sont d'excellents choix, et la section vers la fin de cet article décrit quand chacun convient.

Ce que le rapport final contient

Le _sample_ produit une seule feuille de calcul nommée Ventes T4. Il contient une ligne d'en-tête figée, six colonnes de données (Date, Région, Commercial, Produit, Unités, Chiffre d'affaires), une ligne de totaux avec des formules SOMME, une cellule indiquant le chiffre d'affaires moyen, ainsi qu'un surlignage en gras sur les lignes où le chiffre d'affaires dépasse un seuil donné. Cela couvre environ 80% des demandes des utilisateurs professionnels avant qu'ils ne sollicitent des graphiques.

Configuration du projet et modèle de données

Créez un projet de console ciblant .NET 8 et ajoutez la référence du package. Les commandes CLI sont simples :

Commandes de terminal

dotnet new console -n SalesReport
cd RapportDesVentes
dotnet add package Xceed.Workbooks.NET

Ensuite, définissez l'enregistrement de transaction. Les enregistrements sont concis et immuables, ce qui correspond à la manière dont les pipelines de reporting traitent généralement les données :

Transaction de vente

en utilisant System;
en utilisant System.Collections.Generic;
en utilisant Xceed.Workbooks.NET;

enregistrement public SalesTransaction(
  Date,
  chaîne Région,
  variable Vendeur,
  chaîne Produit,
  int Unités,
  chiffre d'affaires décimal);

Pour la démonstration, générez des transactions en mémoire. En production, cette liste provient d'EF Core, Dapper, ou d'un appel de service ; le code du rapport ci-dessous ne se soucie pas de l'origine des lignes.

XLSX C# : écriture de l'en-tête et des données

L'API Workbooks reflète la manière dont une personne décrit une feuille de calcul : ouvrir un classeur, récupérer une feuille de calcul, définir des valeurs de cellules par référence A1. Voici la première moitié du générateur de rapports, qui écrit le titre, les en-têtes de colonnes et les lignes de données :

BuildReport: titre, en-têtes, lignes

public static void BuildReport(List data, string path)
{
  en utilisant (var classeur = Classeur.Créer(chemin))
  {
    var sheet = workbook.Worksheets[0];

    // Ligne de titre
    sheet.Cells["A1"].Value = "Rapport des ventes T4";
    sheet.Cells["A1"].Style.Font.Bold = true;
    sheet.Cells["A1"].Style.Font.Size = 16;

    // Ligne d'en-tête à la ligne 3
    string[] headers = { "Date", "Région", "Représentant commercial", "Produit", "Unités", "Revenu" };
    for (int c = 0; c < headers.Length; c++)
    {
      var cell = sheet.Cells[2, c];
      cell.Value = headers[c];
      cell.Style.Font.Gras = true;
    }

    // Lignes de données à partir de la ligne 4 (index 3)
    for (int r = 0; r < data.Count; r++)
    {
      var tx = data[r];
      int ligne = 3 + r;
      sheet.Cells[row, 0].Value = tx.Date;
      sheet.Cells[row, 1].Value = tx.Region;
      sheet.Cells[row, 2].Value = tx.Commercial;
      sheet.Cells[row, 3].Value = tx.Produit;
      feuille.Cells[ligne, 4].Value = tx.Unités;
      feuille.Cells[ligne, 5].Value = tx.Revenu;
    }

    workbook.Sauvegarder();
  }
}

Pourquoi les types natifs sont importants

Les valeurs DateTime et décimales passent directement. Excel les voit comme des types de date et de nombre natifs car la bibliothèque écrit le bon jeton de type de cellule, et non une représentation textuelle. Par conséquent, le tri et le filtrage dans Excel fonctionnent comme prévu.

Mise en forme, totaux et sortie stylisée

Les chiffres bruts sans mise en forme échouent au test du DAF. Le bloc suivant ajoute une ligne de totaux, une mise en forme monétaire sur la colonne des revenus, un format de date sur la colonne A et une mise en évidence en gras sur les lignes à revenus élevés. Ajoutez cette section avant l'appel workbook.Save() :

Formats + gras conditionnel + totaux + moyenne

// Appliquer le format de date à la colonne A et la devise à la colonne F
int premièreLigneDonnees = 3;
int dernièreLigneDonnées = 2 + données.Count;

for (int row = firstDataRow; row <= lastDataRow; row++)
{
  sheet.Cells[row, 0].Style.CustomFormat = "yyyy-mm-dd";
  sheet.Cells[row, 5].Style.CustomFormat = "$#,##0.00";

  // Mettre en surbrillance les lignes où le chiffre d'affaires > 5000
  si (data[row - firstDataRow].Revenu > 5000m)
  {
    sheet.Cells[row, 5].Style.Font.Gras = true;
  }
}

// Ligne des totaux
int totalsRow = lastDataRow + 2;
sheet.Cells[totalsRow, 3].Value = "Totaux";
feuille.Cellules[ligneTotaux, 3].Style.Police.Gras = vrai;
sheet.Cells[totalsRow, 4].Formula = $"=SUM(E{firstDataRow + 1}:E{lastDataRow + 1})";
sheet.Cells[totalsRow, 5].Formula = $"=SUM(F{firstDataRow + 1}:F{lastDataRow + 1})";
sheet.Cells[totalsRow, 5].Style.CustomFormat = "$#,##0.00";

// Cellule de revenu moyen ci-dessous des totaux
sheet.Cells[totalsRow + 1, 3].Value = "Revenu moyen";
sheet.Cells[totalsRow + 1, 5].Formula = $"=MOYENNE(F{firstDataRow + 1}:F{lastDataRow + 1})";
sheet.Cells[totalsRow + 1, 5].Style.CustomFormat = "$#,##0.00";

Les formules restent correctes après les modifications

La propriété Formula écrit une vraie formule Excel. Lorsque l'utilisateur ouvre le fichier, Excel calcule les totaux. Par conséquent, le fichier reste correct même si un réviseur modifie manuellement une cellule de revenus—la SOMME se met à jour en temps réel.

Exécution de l'échantillon

Câblez un petit Main qui construit des données de démonstration et appelle la fonction. Exécutez avec dotnet run et ouvrez SalesReport.xlsx :

Programme.Principal

public static void Main()
{
  var data = new List<SalesTransaction>
  {
    nouveau(nouveau DateTime(2024, 10, 3), "Est", "Alice", "Pro Plan", 12, 7200m),
    new(new DateTime(2024, 10, 5), "West", "Ben", "Starter", 5, 1250m),
    nouveau(nouvelle DateTime(2024, 11, 12), "Est", "Alice", "Enterprise", 3, 9450m)
  };

  BuildReport(data, "SalesReport.xlsx");
  Console.WriteLine("Rapport écrit.");
}

Utiliser Xceed Workbooks pour .NET dans ASP.NET Core

La plupart des équipes souhaitent que ce rapport soit servi à partir d'un point de terminaison HTTP plutôt que d'une application console. Le schéma est identique, mais au lieu d'un chemin de fichier, écrivez le classeur dans un MemoryStream et retournez-le en tant que résultat de fichier. Reportez-vous à la documentation de gestion des fichiers ASP.NET Core pour obtenir des instructions sur le streaming de réponses.

Point de terminaison du contrôleur : retourner sales-q4.xlsx

[HttpGet("rapports/ventes")]
public IActionResult GetSalesReport()
{
  var data = _service.GetQuarterlyTransactions();
  var stream = new MemoryStream();

  en utilisant (var classeur = Classeur.Créer(flux))
  {
    // (même logique de bâtiment que BuildReport)
    workbook.Sauvegarder();
  }

  stream.Position = 0;
  retourner Fichier(flux,
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
    "ventes-t4.xlsx");
}

Note de compatibilité

Parce que Xceed Workbooks cible .NET Standard 2.0 in addition to modern .NET, the same controller pattern works in legacy .NET Framework Web API projects as well as .NET 8 minimal APIs.

When to choose which library

Choosing a spreadsheet library is a fit problem, not a ranking problem. Here is a neutral summary of the most common options:

  • Xceed Workbooks for .NET: commercial, supported, predictable cell/style API, paid license for production with a 45-day trial. Good when you need vendor support and a stable API surface.
  • EPPlus: dual-licensed (commercial for business use since v5), mature feature set, large community.
  • ClosedXML: MIT-licensed wrapper over the Open XML SDK, free, active community on GitHub.
  • Other commercial libraries: several options exist, each with strengths in conversion fidelity, charting, and integrations.

Pick the library that matches your licensing model, your support expectations, and the breadth of Excel features you need. For Xceed customers already shipping DataGrid for WPF or Words for .NET, sharing a single vendor and license model often outweighs marginal feature differences.

Practical tips and pitfalls

A few habits keep production reports stable:

Production checklist

  • Wrap workbook creation in a using block. The library buffers data until Save(); disposing flushes everything and releases the underlying stream.
  • Set styles after writing values when looping. Style assignment is per-cell; setting it once per cell avoids repeated allocations.
  • Prefer formulas over precomputed values for totals. Users edit reports; live formulas keep totals correct.
  • Stream to MemoryStream for HTTP responses. Writing to disk and re-reading wastes IO and complicates cleanup.
  • Guard against empty datasets. If the input list is empty, write a single “No data” row instead of producing a zero-row sheet that confuses Excel filters.

Ship the sales report this sprint

Download Xceed Workbooks for .NET and run the sample above with a 45-day trial—no license key required.

Questions fréquemment posées

How do I .NET create Excel file output without installing Office?

Xceed Workbooks for .NET writes the OOXML XLSX format directly, so the host machine does not need Microsoft Office, Excel Interop, or any COM components. The library works in Windows containers, Linux containers, and Azure App Service.

Does Xceed Workbooks for .NET support formulas?

Yes. Set the Formula property on a cell to any valid Excel formula string (for example, =SUM(F4:F23)). Excel evaluates the formula when the user opens the file, and standard functions like SUM, AVERAGE, IF, and VLOOKUP all work as written.

What .NET versions are supported?

The Xceed.Workbooks.NET package targets .NET Standard 2.0, which means it runs on .NET Framework 4.6.1 and later, .NET Core 2.0+, and all modern .NET versions including .NET 6, .NET 8, and .NET 9.

Can I create multiple worksheets in one XLSX C# file?

Yes. Call workbook.Worksheets.Add("SheetName") to add additional sheets. Each worksheet exposes the same Cells indexer, so the building code from this article applies unchanged to multi-sheet financial packs.

How does the trial license work?

The 45-day trial runs without any license key code. After purchase, set the license key once at application startup. The library otherwise behaves identically during and after the trial period.

How do I read an existing XLSX file?

Use Workbook.Load(path) instead of Workbook.Create. Then access workbook.Worksheets[0].Cells["A1"].Value to read values. The same API supports modify-and-save round trips on existing files.

Découvrez la bibliothèque de mots et PDF de Xceed paquet