将内存流和通用处理程序中的二进制excel文件数据发送到客户端并提示保存

时间:2018-02-02 16:33:42

标签: c# jquery excel epplus

目前我正在使用JQuery AJAX并将其连接到Generic Handler(.ashx),在Generic Handler中,我正在为将要保存计算机的Excel文件做模板(提示保存)。我可以在使用.aspx.cs时实现这一点,我之所以使用Generic Handler(.ashx),是因为我不知道在我们保存到的对话框后隐藏加载覆盖的方法电脑出现了。 (意味着加载覆盖层只是粘在那里)。 <{1}}或$(element).show()用于显示或隐藏加载叠加层。

我正在使用 EPPlus库生成Excel文件的模板,但我不知道如何将对象传递到客户端然后提示保存,它一直给我一个错误。

使用Generic Handler时遇到的问题总是给我一个parsererror消息。

以下是我正在使用的代码:

JQuery AJAX:

$(element).hide()

Generic Handler(.ashx):

var loading = $("#loading");

$("#template").click(function () {
            loading.show();

            $.ajax({
                type: "POST",
                url: "TemplateService.ashx?Month=" + $("#Month").val() + "&Year=" + $("#Year").val(),
                data: {},
                contentType: "application/json",
                dataType: "json",
                success: function (data) {
                    loading.hide();

                    console.log(data);

                    alert("Success");
                },
                error: function (xhr, text) {
                    loading.hide();

                    console.log(JSON.stringify(xhr.responseText));
                    console.log(JSON.stringify(text));

                    alert("There is a problem while processing your request");
                }
            });
        });

导出功能:

public class TemplateService : IHttpHandler, IRequiresSessionState
{
    private int Month = 0;
    private int Year = 0;

    public void ProcessRequest(HttpContext context)
    {
        Month = Convert.ToInt32(context.Request.Params["Month"]);
        Year = Convert.ToInt32(context.Request.Params["Year"]);

        try
        {
            string MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(Month);

            string fileName = string.Format("{0} - {1} {2}.xlsx", "Excel Template", MonthName, Year);

            using (var package = new ExcelPackage())
            {
                package.Export();

                using (var stream = new MemoryStream())
                {
                    context.Response.Clear();
                    context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileName));

                    package.SaveAs(stream);

                    stream.WriteTo(context.Response.OutputStream);

                    context.Response.Write(stream);
                }
            }
        }

        catch (Exception)
        {
            ProcessResponse(context, Response());
        }
    }

    private string Response(bool isSuccess = false)
    {
        string status = (isSuccess) ? Constant.SUCCESS : Constant.FAILED;

        return JsonConvert.SerializeObject(new
        {
            Status = status
        });
    }

    private void ProcessResponse(HttpContext context, string response)
    {
        context.Response.Clear();
        context.Response.ContentType = "application/json";
        context.Response.Write(response);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

HTML:

public void Export(this ExcelPackage package)
        {
            try
            {
                package.Workbook.Worksheets.Add("Excel Template");

                var workSheet = package.Workbook.Worksheets["Excel Template"];

                var columnNames = new string[]
                {
                    "First Column",
                    "Second Column",
                    "Third Column"
                };

                var headerRow = new List<string[]>()
                {
                    columnNames
                };

                var cells = workSheet.Cells[1, 1, 1, 3];

                cells.LoadFromArrays(headerRow);
                cells.AutoFilter = true;
                cells.AutoFitColumns();
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

你的回答非常感谢。

谢谢。

0 个答案:

没有答案