我的asp.net页面上有一个按钮,用于回发,创建Excel文件,清除响应流并写入文件。然后,用户可以在浏览器的标准对话框中打开或保存文件用户。
这很好用,我的代码基于此:
http://www.adventuresindevelopment.com/2009/05/27/how-to-export-data-to-excel-in-aspnet/
由于要创建的文件需要很长时间,我创建了一个加载面板,只是一个隐藏的DIV,并在单击该按钮时将其设置为可见。
但我的问题是如何在导出完成后隐藏此DIV?我找不到这样做的方法。我需要像文件完全转移到浏览器时触发的事件。
这可能吗?任何最感谢的帮助。
谢谢,
AJ
答案 0 :(得分:1)
我做什么,长话短说:
当用户点击“下载”按钮时,使用AJAX来呼叫 异步处理页面。此页面将生成您的Excel 记录并将其存储在临时位置
完成AJAX请求后,隐藏“正在加载”面板,然后 将用户重定向到下载页面。理想情况下,您应该重定向 到打开文件的通用(.ashx)处理程序,设置一些标题, 将临时文件传输给用户,并删除该文件 之后。
现在更多细节:
对于第一步,您应该有一些临时文件夹,您可以在其中拥有读写权限。使用系统临时文件夹很好,因此您可以使用Path.GetTempFileName
。以下是您可以在ashx处理程序中编写的示例:
public class Handler1 : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
string fName = Path.GetTempFileName();
context.Response.ContentType = "text/plain";
try
{
// Generate the Excel document
GenerateExcelInFile(fName);
// Store the file name in session for later use
context.Session["ExcelGeneratorFileName"] = fName;
// Send confirmation to the client
context.Response.Write("ok");
}
catch (Exception e)
{
context.Response.Write("error");
// TODO : Do some logging
}
}
// SNIP : IsReusable
}
之后,使用您最喜欢的JS框架来请求该处理程序,并测试返回的字符串。如果它是“ok”,则调用第二部分处理程序:
public class Handler2 : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/excel";
// Make sure the browser will show a "save as" dialog to the user
context.Response.AddHeader("content-disposition", "attachment; filename=Export.pdf");
string fName = context.Session["ExcelGeneratorFileName"] as String;
if (fName != null && File.Exists(fName))
{
// Stream the excel file to the response
context.Response.WriteFile(fName);
// Remove the file
File.Delete(fName);
}
}
// SNIP : IsReusable
}
您只需使用window.location = url
即可在javascript中调用此页面。内容处置标题将告诉浏览器不应显示此URL,仅下载该URL,因此您的用户应保留在下载页面上。