J'ai un certain nombre de pages qui doivent prendre en charge l'exportation de données vers une feuille de calcul Excel. Je peux très bien générer les fichiers Excel, mais j'essaie de trouver un moyen d'abstraire ce comportement pour qu'il soit facilement réutilisable à partir de toutes les pages où j'en ai besoin. Mon idée actuelle est d'utiliser une méthode utilitaire statique, comme suit:Appel de Response.TransmitFile() à partir de la méthode statique
public static void SendExcelFile(System.Web.UI.Page callingPage, string downloadFileName, List<List<string>> data, string worksheetTitle)
{
string tempFileName = Path.GetTempFileName();
try
{
// Generate file using ExcelPackage
GenerateExcelDoc(tempFileName, data, worksheetTitle);
callingPage.Response.AddHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
callingPage.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
callingPage.Response.AddHeader("Content-Length", new FileInfo(tempFileName).Length.ToString());
callingPage.Response.TransmitFile(tempFileName);
}
finally
{
//When this is removed, the method works as expected.
if (File.Exists(tempFileName))
File.Delete(tempFileName);
}
}
Le gestionnaire de clic où je vous appelle SendExcelFile
ressemble à ceci:
protected void lnkExport_Click(object sender, EventArgs e)
{
List<List<string>> dataList = GatherDataForSpreadsheet();
Utility.SendExcelFile(this, "fileNameForDownload.xlsx", dataList, "MyReports");
}
Ce code fonctionne très bien comme une méthode d'instance de la page d'appel. En tant que méthode statique, cependant, cela ne fonctionne pas du tout. Lorsque je clique sur le bouton qui l'invoque, le navigateur affiche indéfiniment les animations de chargement, mais ne demande jamais le téléchargement d'un fichier.
Je suis très nouveau sur ASP.NET (et la programmation web en général), donc je suis sûr qu'il me manque quelque chose ici. Quelqu'un pourrait-il expliquer le comportement que je vois et proposer une alternative raisonnable à cette approche?
EDIT: Si je supprime l'appel à File.Delete() à la fin, la méthode fonctionne comme prévu. Est-ce que Response.TransmitFile() effectue le transfert de manière asynchrone?
EDIT 2: J'ai juste besoin d'appeler Response.Flush() avant de supprimer le fichier. Voir ma réponse ci-dessous. Merci!
Avez-vous parcouru le code en mode de débogage? Si oui, pouvez-vous dire à quel moment il arrive à expiration (ou s'il est même entré dans cette méthode)? Est-ce que votre méthode 'SendExcelFile' lève une exception? Si c'est le cas, veuillez ajouter la trace de pile de l'exception, ce qui pourrait nous aider à aller au fond des choses. Oh, et un exemple d'appel à cette méthode serait utile aussi (peut-être votre gestionnaire de clic). –
J'ai débogué à travers elle. La méthode SendExcelFile semble s'exécuter normalement puis se ferme, mais le navigateur ne demande jamais le téléchargement du fichier. L'onglet dans IE ou Firefox montre l'animation de chargement, et il y a une barre de progression de chargement de la page au bas du navigateur. La page elle-même reste réactive. – Odrade
Je pourrais poster le gestionnaire de clic si vous voulez, mais je doute que ce serait utile. En bref, c'est juste: var data = GenerateData(); Utility.SendExcelFile (données); – Odrade