C# 使用EPPlus写入HTTP响应不起作用
我正在使用EPPlus库将数据写入Excel。我希望能够在HTTP响应对象中写入精细的内容,并将其发送出去,这样客户机将获得一个文件另存为对话框,并可以选择保存文件的位置 到目前为止,在网上搜索了很多之后,我仍然没有成功,下面是我的代码片段- 我试过了-C# 使用EPPlus写入HTTP响应不起作用,c#,export-to-excel,httpresponse,epplus,C#,Export To Excel,Httpresponse,Epplus,我正在使用EPPlus库将数据写入Excel。我希望能够在HTTP响应对象中写入精细的内容,并将其发送出去,这样客户机将获得一个文件另存为对话框,并可以选择保存文件的位置 到目前为止,在网上搜索了很多之后,我仍然没有成功,下面是我的代码片段- 我试过了- using (ExcelPackage package = new ExcelPackage()) { //Writing data to the worksheet Response.Clear(); Respons
using (ExcelPackage package = new ExcelPackage())
{
//Writing data to the worksheet
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=file.xlsx");
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.BinaryWrite(package.GetAsByteArray());
Response.End();
}
所有联机链接都显示相同的代码,但这不起作用。也没有客户端或服务器端错误
有什么想法吗
编辑:如果这段代码有效,调用这段代码的客户端可能会出现问题?我对请求-响应模型没有太多经验,很有可能我搞砸了
我提出了一个post请求,其中包含要写入文件的内容-
$post("/app/Services/ExcelDownloadHandler.ashx", { "columnValues": columnValues });
在ExcelDownloadHandler.ashx中,我有
public void ProcessRequest(HttpContext context)
{
var r = context.Response;
Models.DTData excelData = (Models.DTData)Newtonsoft.Json.JsonConvert.DeserializeObject(context.Request.Form["columnValues"], typeof(Models.DTData));
//Write excelData to worksheet using EPPlus
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=file.xlsx");
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.BinaryWrite(package.GetAsByteArray());
Response.End();
}
//一旦我对响应执行二进制写入,我应该会在浏览器上获得文件保存对话框,对吗?我也遇到了同样的问题。添加此处显示的四条注释行会出现提示,允许用户在IE11中打开、保存或另存为。
//将其写回客户端
Response.ClearContent()//明确当前响应的内容。
Response.BufferOutput=true//发送前的缓冲区输出。
Response.ContentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
AddHeader(“内容处置”、“附件;文件名=ExportData.xlsx”);
BinaryWrite(pck.GetAsByteArray());
Response.Flush()//将缓冲输出发送到客户端。
Response.End()//停止rqst。过程引发EndRequest事件。
I使用类似以下代码的EPPLUS:
MemoryStream ms = new MemoryStream();
pkg.SaveAs(ms);
byte[] ba = ms.GetBuffer();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachement; filename=ExportData.xlsx");
HttpContext.Current.Response.AddHeader("Content-Length", ba.Length.ToString());
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.BinaryWrite(ba);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
你能检查一下pck.GetAsByteArray()返回的是什么吗?@AntonioBakula我检查过了,它确实有内容,一个几千字节的数组。它怎么不工作?我试过你的代码,它工作正常,试着做一个简单的新项目来隔离可能的其他问题我刚做了一个新的ASP.NET应用程序,表单上有一个按钮,这个代码在button onClick事件中:它工作正常首先你做的请求不是“Post请求”,而是一个指向url的ajax帖子。我猜你是想把Ashx中的Excel文件直接输入javascript代码?这是不可能的,因为javascript不知道要发送的数据类型。将javascript中的ByTestStream解析为excel文档时,这是可能的。。。我不推荐的!尝试一些简单的方法,比如做asp回发!