将Excel文件发送到客户端

时间:2012-11-07 19:36:57

标签: asp.net vb.net excel .net-3.5 asp.net-2.0

我正在尝试将Excel文件发送到ASP.Net网页的客户端,但它不起作用。

当用户点击按钮时,我们服务器端数据库中的某些数据被格式化,放入Excel文件并发送给用户(直接下载)。

一切运作良好,除了发送部分和任何帮助将不胜感激。

这是我现在正在使用的代码(客户端):

var dataAjax = {};
$.ajax({
    async: false,
    type: "POST",
    url: "Default.aspx/BuildExcelFile",
    contentType: "application/json",
    data: JSON.stringify(dataAjax),
    dataType: "text",
    success: function(html) {
        //alert(html);
    },
    error: function(request, status, error) {
        alert("An error occurred : [" + error + "]");
    }

});

服务器端代码:

<WebMethod()> _
Public Shared Function BuildExcelFile() As String
    Dim localExcelPath = "C:\temp1111.xlsx"

    'Build the excel file here...
    '...

    'Delete the old version of the Excel file
    System.IO.File.Delete(localExcelPath)
    'Save the Excel File locally
    xWorkSheet.SaveAs(localExcelPath)
    xWorkBook.Close()
    exc.Quit()

    'The generated excel is valid, can be opened on the server just fine

    'Send the excel file to the client
    'This part is not working! :(
    System.Web.HttpContext.Current.Response.Clear()
    System.Web.HttpContext.Current.Response.ContentType = "MS-Excel/xls"
    System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" & System.IO.Path.GetFileName(localExcelPath))
    System.Web.HttpContext.Current.Response.TransmitFile(localExcelPath)
    System.Web.HttpContext.Current.Response.End()

    Return "Success"

End Function

我在尝试验证Current.Response

的值时收到此错误
Response: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.

此外,如果我删除Response.End()调用,则会在ajax中的success函数的html变量中接收数据。但是,我希望下载文件,而不是以文本形式收到...

如果我保留Response.End(),我会得到Internal Server Error

因为我的Webmethod是共享的,它不起作用吗? 有什么想法在这里发生了什么?我该怎么做才能解决这个问题?

修改

我正在使用.Net 3.5,如果重要的话

我没有使用MVC

3 个答案:

答案 0 :(得分:1)

我也有同样的问题从客户端发送数据到服务器。您可以通过动态加载iFrame来解决下载问题 - iFrame基本上只是填充了一个空白的aspx页面,该页面在Page_Load开始下载。您还可以将文件保存到服务器,并提供一个链接以在客户端中下载它。这些是我发现有效的解决方法。

我不知道你是否可以按照自己的方式去做。我检查了各地的例子,但从未奏效。如果你无法弄明白,这些方法对我有用。

答案 1 :(得分:1)

Public Shared Function BuildExcelFile() As String
    Dim localExcelPath = "C:\temp1111.xlsx"

    'Build the excel file here...
    '...
    xWorkSheet.SaveAs(localExcelPath)
    xWorkBook.Close()
    exc.Quit()

    'The generated excel is valid, can be opened on the server just fine

    'Send the excel file to the client
    'This part is not working! :(
    System.Web.HttpContext.Current.Response.Clear()
    System.Web.HttpContext.Current.Response.ContentType = "MS-Excel/xls"
    System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" & System.IO.Path.GetFileName(localExcelPath))
    System.Web.HttpContext.Current.Response.TransmitFile(localExcelPath)
    System.IO.File.Delete(localExcelPath)

    System.Web.HttpContext.Current.Response.End()

    Return "Success"
End Function
  1. 如果您使用的是Ajax
  2. ,请在按钮上单击使用postbacktrigger

答案 2 :(得分:0)

这对我有用:

{{1}}

我正在使用名为'EPPlus.dll'的dll作为我的Excel库。不需要Ajax调用,因为您可以从Asp.net按钮实例化下载,或者只是在您想要开始下载时从服务器端代码调用方法。