2

我正在尝试将 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.

此外,如果我删除调用,数据将在 ajaxResponse.End()中函数的 html 变量中接收。success但是,我希望下载文件,而不是作为文本接收...

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

是否因为我的 Webmethod 是共享的而无法正常工作?任何线索这里发生了什么?我能做些什么来解决这个问题?

编辑:

我正在使用 .Net 3.5,如果这很重要

我没有使用 MVC

4

3 回答 3

2

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

我不知道您是否可以按照您尝试的方式进行操作。我检查了所有的例子,但它从来没有奏效。如果您无法弄清楚,这些方法对我有用。

于 2012-11-07T19:59:22.343 回答
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,请在单击按钮时使用 postbacktrigger
于 2013-01-15T18:47:06.060 回答
0

这对我有用:

string fileName = "ExampleFileName.xlsx";
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;  filename=" + fileName);
Response.BinaryWrite(excelPackage.GetAsByteArray());
// Response.End(); Replaced with below 3 lines to avoid ThreadAbortException
Response.Flush(); // Sends all currently buffered output to the client.
Response.SuppressContent = true;  // Gets or sets a value indicating whether to send HTTP content to the client.
ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.

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

于 2016-08-11T23:18:58.160 回答