我有这个代码有效:
public async Task<IActionResult> OnGet()
{
var workbook = GenerateClosedXMLWorkbook();
MemoryStream memoryStream = new MemoryStream();
workbook.SaveAs(memoryStream);
memoryStream.Position = 0;
return File(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "hello.xlsx");
}
private XLWorkbook GenerateClosedXMLWorkbook()
{
var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sample Sheet");
worksheet.Cell("A1").Value = "Hello World!";
worksheet.Cell("A2").FormulaA1 = "=MID(A1, 7, 5)";
return workbook;
}
但是,在我看来,我不知何故需要关闭或处理memoryStream。那是对的吗?还是自动关闭?
由于内存流封装在返回值中,因此不应将其丢弃。如果你这样做,它将在FileStreamResult
可以访问它之前处理。
正如你在FileStreamResultExecutor.ExecuteAsync
中看到的那样,流已经被置于the source方法内部。
ASP.NET MVC也是如此,FileStreamResult.WriteFile
在哪里处理(source)。