gpt4 book ai didi

asp.net-web-api - 从 Web API ASP Net Core 返回 Excel 文件

转载 作者:行者123 更新时间:2023-12-04 19:30:03 28 4
gpt4 key购买 nike

我正在尝试创建将使用 ClosedXML 库返回 Excel 文件的 WebAPI。

如果我返回 FileStreamResult,一切正常。但是,如果我按照此处讨论的那样将其更改为 HttpResponseMessage Web API Return A File ,我无法再下载文件或查看内容并获取 JSON 字符串。

我想知道如何从此 HttpResponseMessage 中提取文件内容。

我在浏览器或 PostMan 工具中进行了测试,得到的只是 JSON 字符串:

{
"version": {
"major": 1,
"minor": 1,
"build": -1,
"revision": -1,
"majorRevision": -1,
"minorRevision": -1
},
"content": {
"headers": [
{
"key": "Content-Disposition",
"value": [
"attachment; filename=ERSheet.xlsx"
]
},
{
"key": "Content-Type",
"value": [
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
]
}
]
},
"statusCode": 200,
"reasonPhrase": "OK",
"headers": [],
"requestMessage": null,
"isSuccessStatusCode": true
}

我的代码如下:
[HttpGet("ERSheet2")]
public HttpResponseMessage ER_GenerateWBLWorksheet2()
{
MemoryStream stream = new MemoryStream();
var workbook = new XLWorkbook();

var SheetNames = new List<string>() { "15-16", "16-17", "17-18", "18-19", "19-20" };

foreach (var sheetname in SheetNames)
{
var worksheet = workbook.Worksheets.Add(sheetname);

worksheet.Cell("A1").Value = sheetname;
}

workbook.SaveAs(stream);
stream.Seek(0, SeekOrigin.Begin);

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(stream.ToArray());
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
result.Content.Headers.ContentDisposition.FileName = "ERSheet.xlsx";
return result;
}

更新

这个和这个问题不一样 Download file with ClosedXML因为我提到我已经通过使用“FileStreamResult”使它工作了。我问这个是因为这个评论“最好返回包含 StreamContent 的 HttpResponseMessage”。在此线程中制作 Web API Return A File .因此,尝试在 .Net Core 中使用 HttpResponseMessage 并且不知道它不再支持 Darin 的答案。

最佳答案

在 .NET Core 上运行的 ASP.NET Web API 不支持 HttpResponseMessage了。所以基本上它会尝试序列化你要返回到 JSON 的这个对象的实例(好像它是你的一个简单的 View 模型)。有一些 compatibility shim hacks 您可以使用,但总的来说,我建议您使用更惯用的方法 - 返回 IActionResult来自您的操作的实例:

[HttpGet("ERSheet2")]
public IActionResult ER_GenerateWBLWorksheet2()
{
using (MemoryStream stream = new MemoryStream())
{
var workbook = new XLWorkbook();

var SheetNames = new List<string>() { "15-16", "16-17", "17-18", "18-19", "19-20" };

foreach (var sheetname in SheetNames)
{
var worksheet = workbook.Worksheets.Add(sheetname);

worksheet.Cell("A1").Value = sheetname;
}

workbook.SaveAs(stream);
stream.Seek(0, SeekOrigin.Begin);

return this.File(
fileContents: stream.ToArray(),
contentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",

// By setting a file download name the framework will
// automatically add the attachment Content-Disposition header
fileDownloadName: "ERSheet.xlsx"
);
}
}

关于asp.net-web-api - 从 Web API ASP Net Core 返回 Excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41746313/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com