我正在尝试将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
答案 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
答案 2 :(得分:0)
这对我有用:
{{1}}
我正在使用名为'EPPlus.dll'的dll作为我的Excel库。不需要Ajax调用,因为您可以从Asp.net按钮实例化下载,或者只是在您想要开始下载时从服务器端代码调用方法。