У меня есть несколько страниц, которые должны поддерживать экспорт данных в электронную таблицу Excel. Я могу генерировать файлы Excel просто отлично, но я пытаюсь понять, как абстрагироваться от этого поведения, поэтому его легко использовать повторно со всех страниц, где он мне нужен. Моя текущая идея заключается в том, чтобы использовать статический метод полезности следующим образом:Вызов Response.TransmitFile() из статического метода
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 (и в основном в веб-программировании), поэтому я уверен, что здесь что-то не хватает. Может ли кто-нибудь объяснить объяснение поведения, которое я вижу, и предложить разумную альтернативу этому подходу?
EDIT: Если я удалю вызов в File.Delete() в конце, метод работает так, как ожидалось. Выполняет ли Response.TransmitFile() асинхронную передачу?
EDIT 2: Мне просто нужно было вызвать Response.Flush(), прежде чем я удалю файл. См. Мой ответ ниже. Спасибо!
Прошли ли вы через код в режиме отладки? Если да, можете ли вы сказать, где это время (или если он даже вводит этот метод)? Исправлен ли ваш метод SendExcelFile? Если да, добавьте трассировку стека исключений, которая может помочь нам разобраться в этом. О, и примерный вызов этого метода также будет полезен (возможно, ваш обработчик кликов). –
Я отлаживал это. Метод SendExcelFile, похоже, выполняется нормально, а затем выходит, но браузер никогда не запрашивает загрузку файла. На вкладке в IE или Firefox показана анимация загрузки, и в нижней части браузера есть индикатор выполнения загрузки страницы. Сама страница остается отзывчивой. – Odrade
Я мог бы отправить обработчик кликов, если вы хотите, но я сомневаюсь, что это было бы полезно. Короче говоря, это просто: var data = GenerateData(); Utility.SendExcelFile (данные); – Odrade