У меня есть несколько страниц, которые должны поддерживать экспорт данных в электронную таблицу Excel.Я могу сгенерировать файлы Excel просто отлично, но я пытаюсь понять, как абстрагировать это поведение, чтобы его можно было легко использовать на всех страницах, где оно мне нужно.Моя текущая идея состоит в том, чтобы использовать метод статической утилиты, как показано ниже:
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);
}
}
Обработчик кликов, по которому я звоню SendExcelFile
, выглядит следующим образом:
protected void lnkExport_Click(object sender, EventArgs e)
{
List<List<string>> dataList = GatherDataForSpreadsheet();
Utility.SendExcelFile(this, "fileNameForDownload.xlsx", dataList, "MyReports");
}
Этот код работаетпросто отлично, как метод экземпляра вызывающей страницы.Как статический метод, он вообще не работает.Когда я нажимаю кнопку, которая вызывает это, браузер показывает анимацию загрузки бесконечно, но никогда не запрашивает загрузку файла.
Я очень плохо знаком с ASP.NET (и веб-программированием в целом), поэтому яЯ уверен, что я что-то здесь упускаю.Может ли кто-нибудь объяснить поведение, которое я наблюдаю, и предложить разумную альтернативу этому подходу?
РЕДАКТИРОВАТЬ: Если в конце я удалю вызов File.Delete (), метод работает, как ожидалось.Response.TransmitFile () выполняет передачу асинхронно?
РЕДАКТИРОВАТЬ 2: мне просто нужно было вызвать Response.Flush (), прежде чем я удалил файл.Смотрите мой ответ ниже.Спасибо!