Exporter une liste de données comme une liste de clients vers Excel est un besoin assez courant en entreprise. Le framework .NET ne fournissant rien à ce niveau, j’ai décidé de créer une bibliothèque pour répondre à ce besoin : ExportTable.

ExporTable

Pour générer un fichier XLSX (Excel 2007+) il est recommandé d’utiliser l’Open XML SDK. Je ne vais pas vous apprendre à utiliser ce SDK, Microsoft a déjà fait tout le travail avec son outil “Open XML SDK Productivity Tool” (inclus dans le SDK). Il suffit d’ouvrir un fichier au format Open XML pour obtenir le code permettant de le générer :

Open XML

A la place, je vais vous montrer les différentes possibilités offertes par la bibliothèque. Prenons la classe suivante :

public class Customer     
{     
   [Display(Name = "Identifier")]     
   public int Id { get; set; }     
   public string FirstName { get; set; }     
   public string LastName { get; set; }     
   public DateTime DateOfBirth { get; set; }     
   [DisplayFormat(ConvertEmptyStringToNull = true, NullDisplayText = "<Not provided>")]     
   public string Email { get; set; }     
   public bool EmailConfirmed { get; set; }     
}

Pour générer un fichier Excel ces quelques lignes de code suffisent :

IEnumerable<Customer> customers = ...;     
customers.ToTable(showHeader: true)     
   .AddColumn(customer => customer.Id)     
   .AddColumn(customer => customer.FirstName)     
   .AddColumn(customer => customer.LastName)     
   .AddColumn(customer => customer.Email)     
   .AddColumn(customer => customer.EmailConfirmed)     
   .AddColumn(customer => customer.DateOfBirth, format: "mm/yyyy")     
   .GenerateSpreadsheet("customers.xlsx");

Et voilà le fichier Excel en sortie :

Sortie Fichier Excel

Le nom des colonnes est déduit automatiquement à partir du nom de la propriété (décamelizé) ou de certains attributs tels que DisplayAttribute, DisplayFormatAttribute, etc. Bien évidemment tout est personnalisable :

customers.ToTable()     
   .AddColumn(     
   expression: customer => customer.FirstName,     
   select: customer => customer.FirstName.ToUpper(), // Valeur à exporter pour la colonne     
   title: "FirstName", // Titre de la colonne     
   dataType: typeof(string), // Type des valeurs de la colonne     
   format: "{0}", // Format d’affichage     
   nullDisplayText: "<not provided>", // Texte à afficher si la valeur est null     
   convertEmptyStringToNull: true, // Convertit string.Empty en null (utile si nullDisplayText est utilisé)     
   culture: CultureInfo.CurrentCulture // Culture à utiliser pour les conversions de type     
   )

A noter que tous les paramètres sont optionnels y compris l’expression. On peut ainsi créer une colonne “FullName” combinant les propriétés “FirstName” et le “LastName” :

.AddColumn(title: "Full Name", select: customer => customer.FirstName + " " + customer.LastName)

Par ailleurs, sachez qu’il est facile de valider un document avec le SDK OpenXML.

Bonus

ExportTable permet aussi d’exporter au format HTML (table) et CSV (les séparateurs et les quotes sont configurables) :

customers.ToTable(showHeader: true)     
   .AddColumn(...)     
   .GenerateCsv("customers.csv") // Generate file     
   .GenerateCsv()                // return string     
   .GenerateCsv(textWriter)      // write to stream     
   .GenerateHtmlTable("customers.csv") // Generate file     
   .GenerateHtmlTable()                // return string     
   .GenerateHtmlTable(textWriter)      // write to stream

Le code et des exemples sont disponibles sur GitHub : https://github.com/meziantou/ExportTable

Ne ratez plus aucune actualité avec la newsletter mensuelle de SoftFluent

Newsletter SoftFluent