我有许多页面需要支持将数据导出到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(以及Web编程),所以我确定我在这里缺少了一些东西。 有人能解释一下我看到的行为,并提出一个合理的替代方案吗?
编辑:如果我删除末尾的File.Delete()调用,则该方法按预期工作。 Response.TransmitFile()是否异步传输?
编辑2:我只需要在删除文件之前调用Response.Flush()。请参见我的答案。谢谢!