我使用了一个html表,其中的内容可以通过鼠标拖放来更改。从技术上讲,您可以将数据从任何表单元格移动到另一个表单元格。表格大小为50行*10列,每个单元格都有一个唯一的标识符。我想用C#EPPlus库将其导出为.xlsx格式,并将导出的文件返回给客户端。
因此,我需要在按下按钮时传递整个表格数据,并将其发布到web api或mvc控制器,创建一个excel文件(像原始的html表格数据一样(,然后将其发送回浏览器下载。
因此,我们的想法是创建一个数组,其中包含每个表单元格的值(当然,该数组中应该有空单元格(,并将该数组发布到控制器。
这种方法的问题在于下载,如果我用常规jquery的ajax.post调用api或mvc控制器,它不会将响应识别为文件。
ajax帖子后的C#代码:
[HttpPost]
public IHttpActionResult PostSavedReportExcel([FromBody]List<SavedReports> savedReports, [FromUri] string dateid)
{
//some excel creation code
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(new MemoryStream(package.GetAsByteArray()))
};
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
FileName = dateid + "_report.xlsx"
};
ResponseMessageResult responseMessageResult = ResponseMessage(response);
return responseMessageResult;
}
通常,对于这种结果,我可以使用window.location = myurltocontroller
正确下载,但这只是针对GET请求,POST任何操作都是不可能的。
我找到了一些可以帮助我解决这个问题的答案:JavaScript帖子请求类似于表单提交
这表明我应该创建一个传递值的表单,但我不知道如何在数组的情况下这样做(该表由50*10=500个值组成,我必须在表单中传递这些值(
我尝试了一些解决html excel导出问题的前端解决方案,当然这不需要在api端构建文件,但免费的jquery插件不推荐使用,不可定制,只处理.xls格式等。
我发现EPPlus nuget包是一个高度可定制的工具,这就是为什么我想首先尝试这个。
所以问题是:我如何发布一个由500个元素组成的数组,控制器会识别、生成文件,并使其自动从浏览器下载?
如果你能提供一些代码,那将是非常棒的,但给我正确的方向也很有帮助。
谢谢。
您可以使用fetch()
(docs(从JS前端发送请求。当浏览器(JS(收到响应时,它可以提供其二进制内容作为下载。类似这样的东西:
fetch("http://your-api/convert-to-excel", // Send the POST request to the Backend
{
method:"POST",
body: JSON.stringify(
[[1,2],[3,4]] // Here you can put your matrix
)
})
.then(response => response.blob())
.then(blob => {
// Put the response BLOB into a virtual download from JS
if (navigator.appVersion.toString().indexOf('.NET') > 0) {
window.navigator.msSaveBlob(blob, "my-excel-export.xlsx");
} else {
var a = window.document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = "my-excel-export.xlsx";
a.click();
}});
因此,浏览器的JS部分实际上首先在后台下载文件,只有当它完成时,才会触发"下载">从浏览器内存到HD上的文件。对于需要承载令牌身份验证的RESTAPI来说,这是一个非常常见的场景。