ILo*_*low 6 c# excel asp.net-core asp.net-core-webapi
我正在尝试使用Web API下载Excel文件,但我无法在邮递员中下载文件,因为我在浏览器中输入URL时能够下载Excel文件虽然在打开文件时我收到如下警告消息:
当我使用POSTMAN命中端点时,文件被破坏并显示垃圾字符.
代码:
protected virtual byte[] ExportToXlsx<T>(IEnumerable<T> itemsToExport)
{
using (var stream = new MemoryStream())
{
using (var xlPackage = new ExcelPackage())
{
// get handles to the worksheets
var worksheet = xlPackage.Workbook.Worksheets.Add(typeof(T).Name);
//create Headers and format them
var manager = new PropertyManager<T>(itemsToExport.First());
manager.WriteCaption(worksheet, SetCaptionStyle);
var row = 2;
foreach (var items in itemsToExport)
{
manager.CurrentObject = items;
manager.WriteToXlsx(worksheet, row++, false);
}
xlPackage.Save();
}
return stream.ToArray();
}
}
private readonly IServiceContext ctx;
public void Download(string guid)
{
var bytes = ExportToXlsx(list);
ctx.reqobj.HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename=\"demo.xlsx\"");
ctx.reqobj.HttpContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
ctx.reqobj.HttpContext.Response.Body.Write(bytes, 0, bytes.Length);
}
Run Code Online (Sandbox Code Playgroud)
注意:我OfficeOpenXml用于创建Excel文件.
我将不胜感激任何帮助.
需要将流传递给包。
现在包裹里没有任何东西,
//...
using (var xlPackage = new ExcelPackage())
//...
Run Code Online (Sandbox Code Playgroud)
因此,没有任何内容被保存到流中,这就是尝试打开文件时显示错误的原因。
无需将内存流转换为数组。返回流并将其传递给响应。
protected virtual Stream ExportToXlsx<T>(IEnumerable<T> itemsToExport) {
var stream = new MemoryStream();
using (var xlPackage = new ExcelPackage(stream)) { //<<< pass stream
// get handles to the worksheets
var worksheet = xlPackage.Workbook.Worksheets.Add(typeof(T).Name);
//create Headers and format them
var manager = new PropertyManager<T>(itemsToExport.First());
manager.WriteCaption(worksheet, SetCaptionStyle);
var row = 2;
foreach (var items in itemsToExport) {
manager.CurrentObject = items;
manager.WriteToXlsx(worksheet, row++, false);
}
xlPackage.Save();
}
return stream;
}
Run Code Online (Sandbox Code Playgroud)
返回文件的控制器操作如下所示
public IActionResult Download(string guid) {
//...get list
var file = ExportToXlsx(list);
var contentType = "application/vnd.openxmlformats";
var fileName = "demo.xlsx";
return File(file, contentType, fileName); //returns a FileStreamResult
}
Run Code Online (Sandbox Code Playgroud)
评论中指出,上述是在支持方法中完成的。
使用相同的方法
private readonly IServiceContext ctx;
//...
public void Download(string guid) {
//...get list
using(var fileStream = ExportToXlsx(list)) {
if (fileStream.CanSeek && fileStream.Position != 0) {
fileStream.Seek(0, SeekOrigin.Begin);
}
var contentType = "application/vnd.openxmlformats";
var fileName = "demo.xlsx";
var response = ctx.reqobj.HttpContext.Response;
response.Headers.Add("Content-Disposition", $"attachment; filename=\"{fileName}\"");
response.Headers.Add("Content-Length", fileStream.Length.ToString());
response.ContentType = contentType;
fileStream.CopyTo(response.Body);
}
}
Run Code Online (Sandbox Code Playgroud)
生成的文件被复制到响应正文中。
对于邮递员来说,该工具只是显示响应中返回的内容。它不会尝试将实际文件作为附件下载。
| 归档时间: |
|
| 查看次数: |
1200 次 |
| 最近记录: |