C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件
Posted
技术标签:
【中文标题】C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件【英文标题】:C# Sending Excel xls over WebAPI controller to js and save it as a file 【发布时间】:2021-10-08 09:09:25 【问题描述】:我有一个收集数据的控制器,并且(仅用于测试目的)将其正确保存为 Excel 文件,代码如下所示:
[HttpPost]
public async Task<FileContentResult> ExampleToExcel()
using (var workbook = new XLWorkbook())
IXLWorksheet worksheet = workbook.Worksheets.Add("Example sheet");
int index = 1;
foreach (ExampleItem tmp in exampleItems)
worksheet.Cell(index, 1).Value = tmp.SomeData;
index++;
string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
string fileName = "TheName.xlsx");
using (var stream = new System.IO.MemoryStream())
workbook.SaveAs(stream);
var content = stream.ToArray();
var fileContentResult = new FileContentResult(content, contentType)
FileDownloadName = fileName
;
return await Task.FromResult(fileContentResult);
然后我把它放在 *.js 文件中
exampleExcelExport: function ()
httpClient.send(
url: "/Examples/ExampleToExcel",
method: 'POST'
).done(function (response)
var blob = response;
var binaryData = [];
binaryData.push(blob);
var a = document.createElement('a');
a.href = window.URL.createObjectURL(new Blob(binaryData, type: "application/octet-stream" ))
a.download = response.FileDownloadName;
a.dispatchEvent(new MouseEvent('click'));
);
,
请注意,在控制器端,Excel文件的长度约为30KB,在js端超过50KB,超过0x80的字节编码为2字节。
字符串的区别 *contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
和
类型:“应用程序/八位字节流”*
可能不是关于,反应比我预期的要大得多。即使它们与 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 相同,保存的 Excel 文件仍然不正确,大小超过 50KB,超过 0x80 的字节编码两次。
请告诉我如何正确操作?如何从响应中获取正确的字节数组内容并将其保存到文件中,以及如何获取响应的名称,因为 response.FileDownloadName 是 undefined?
【问题讨论】:
【参考方案1】:您的 api 中似乎没有正确的标头。
您必须为您的请求设置Access-Control-Expose-Headers
。
一个最小的工作示例如下。
public ActionResult DownloadExcel()
// do the stuff to get your byte array
var excelBytes = byte[];
// put in some headers so the file name is availble in the response
Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
return File(excelBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ,"filename_you_chose.xlsx")
并在javascript端提取文件名:
function(response, status, xhr)
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1)
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1])
filename = matches[1].replace(/['"]/g, '');
最后从响应中提取内容
【讨论】:
您好,我找到了解决办法。基本上,in 需要在 C# 中编码为 Base64 字符串,并在 js 中解码。就是这样:)【参考方案2】:我找到了解决方案。基本上,它需要在C#中编码为Base64字符串,并在js中解码。 @Admin:话题可以关闭了!
【讨论】:
以上是关于C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 从远程位置将 Excel csv 或 xls 文件的行读入 ASP.NET 应用程序?