18/01/2008

Exporter une liste génerique vers Excel depuis une page ASP.NET

Dans nos applications nous manipulons classiquement des ‘entités’ métiers dont on utilises les champs par des accessors (ou propriétés). Il est fréquent de devoir manipuler ces entités comme une collection d’entités, par exemple une liste de clients, ou une liste de communes.

L’exemple suivant illustre comment on peut utiliser la programmation par réflexion supporté par Dotnet pour écrire du code très générique.
Dans cet exemple j’ai une liste générique de ‘Commune’ que je souhaite exporter en ASCII dans un fichier Excel depuis une application ASP.NET.

La méthode ExportToASCII() met en place la logique nécessaire pour produire le fichier Excel à travers le pipe de réponse HTTP.

private void ExportToASCII()
{
List lst = GetAll();

Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=FileName.xls");
Response.ContentType = "application/ms-excel";
StringWriter stringWrite = Export(lst);
Response.Write(stringWrite.ToString());
Response.End();
}

La méthode Export() contient le cœur du problème à savoir introspecter la collection passée en paramètre pour produire le flux de données.

private StringWriter Export(Object objListGeneric)
{
StringWriter stringWrite = new StringWriter();
if (objListGeneric == null) return stringWrite;

Type typeListGeneric = objListGeneric.GetType();
if (typeListGeneric.IsGenericType == false) return stringWrite;

// recupere le type de l'objet generic (le parametre de la classe generic)
Type[] typeGen = typeListGeneric.GetGenericArguments();
Type theTypeGen = typeGen[0];

// ecriture header (le nom des properties de l'objet)
foreach (PropertyInfo pi in theTypeGen.GetProperties())
{
stringWrite.Write(pi.Name.ToString());
stringWrite.Write('\t');
}
stringWrite.Write('\n');

// ecriture des lignes de données
foreach (object item in (IEnumerable)obj)
{
foreach (PropertyInfo pi in theTypeGen.GetProperties())
{
object objValue = pi.GetValue(item, null);
stringWrite.Write(objValue.ToString());
stringWrite.Write('\t');
}
stringWrite.Write('\n');
}

return stringWrite;
}

Aucun commentaire: