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.
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 :
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 :
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