在ASP.net中生成excel时等待页面

时间:2009-02-04 16:30:29

标签: asp.net

我有一个要求,其中我需要在执行excel报告时显示等待消息,并且当执行完成时,将excel写入响应以供用户保存。保存完成后,我需要隐藏等待消息。

我能够显示等待消息但是在执行完成时我无法隐藏相同的消息。我用过Ifames来实现同样的目标。 我在iframe中执行excel所需的所有处理,并在同一个iframe中写入响应。我试图使用Javascript隐藏等待消息,但是在iframe的onload,onunload,onbeforeunload等中编写的任何JavaScript函数都没有被执行。

有什么方法可以调用JavaScript函数,或者是否有其他方法来解决问题。

2 个答案:

答案 0 :(得分:4)

以下是我如何做到这一点:

  • 创建一个HttpHandler,用于生成文档,保存文档(在缓存/磁盘/数据库中,您的调用)并返回生成文档的标识符
  • 使用AJAX调用调用HttpHandler(使用jQuery使这非常简单)
  • 使用javascript / jQuery显示等待消息/图形/动画/无论
  • 在AJAX请求回调中,重定向到获取生成的标识符的页面,并使用Content-Disposition标题将相应的文档作为附件发送。

作为旁注,这在ASP.NET MVC中会更直接一些

GenerateDocument HttpHandler存根:

public class GenerateMyDocumentHandler : IHttpHandler
{
    #region [ IHttpHandler Members ]

    public Boolean IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        var docIdentifier = this.GenerateDocument();

        context.Response.ContentType = "text/plain";
        context.Response.Write(docIdentifier.ToString("N"));
    }

    #endregion

    private Guid GenerateDocument()
    {
        var identifier = Guid.NewGuid();

        // Logic that generates your document and saves it using the identifier

        return identifier;
    }
}

客户端脚本存根:

function generateDocument() {
    var result = $.get('/GenerateDocument.ashx', { any: 'parameters', you: 'need', go: 'here' }, generateDocumentCallback, 'text');
    // display your waiting graphic here
}

function generateDocumentCallback(result) {
    window.location.href = '/RetrieveDocument.ashx/' + result;
}

RetrieveDocument HttpHandler存根:

public class RetrieveDocument : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var identifier = new Guid(context.Request.Url.Segments[1]);
        var fileContent = this.GetFileAsBytes(identifier);

        context.Response.ContentType = "application/vnd.ms-excel";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=yourfilename.xls");
        context.Response.OutputStream.Write(fileContent, 0, fileContent.Length);
    }

    private Byte[] GetFileAsBytes(Guid identifier)
    {
        Byte[] fileBytes;
        // retrieve the specified file from disk/memory/database/etc

        return fileBytes;
    }

    public Boolean IsReusable
    {
        get
        {
            return true;
        }
    }
}

答案 1 :(得分:2)

几年前我做过类似的事情。我打开了一个新线程来进行后台处理,然后重定向到“等待”页面。等待页面检查任务的状态,如果完成,则重定向回来。这是一个非常简单的解决方案。查看here