Webapi导出到excel损坏的文件下载
本文关键字:损坏 文件下载 excel Webapi | 更新日期: 2023-09-27 18:18:30
我使用OfficeOpenXml ExcelPackage从对象列表生成excel这成功地下载了文件,但是当我打开文件excel抱怨说它是损坏的,没有保存在适当的文件格式。我也尝试过使用filesver .js,但也没有运气。同样的错误。对如何解决这个问题有什么建议吗?
服务器代码: ExcelPackage _excelPackage = new ExcelPackage();
ExcelWorksheet _sheet = _excelPackage.Workbook.Worksheets.Add("New Sheet");
int currentRow = 1;
foreach (var prod in Products)
{
_sheet.Cells[currentRow, 0].Value = prod.Id;
_sheet.Cells[currentRow, 0].Value = prod.Name;
_sheet.Cells[currentRow, 0].Value = prod.Price;
currentRow++;
}
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
byte[] stream = _excelPackage.GetAsByteArray()
response.Content = new ByteArrayContent(stream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "Products.xlsx"
};
return response;
客户端(AngularJS服务代码):
var req = {
url: fpReportsWebAPIURL + 'api/Export/DownloadFile',
method: 'POST',
responseType: 'arraybuffer',
//data: json, //this is your json data string
headers: {
'Content-type': 'application/json',
'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}
};
return $http(req).then(function (data) {
var type = data.headers('Content-Type');
var blob = new Blob([data], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
saveAs(blob, 'Products' + '.xlsx');
return true;
});
当我打开Excel时,我得到错误为"Excel发现产品中不可读的内容。xlsx您想恢复此工作簿的内容......."。
我检查了API响应,看到WebApi以OfficeOpenML格式返回一些数据,不确定这是否是问题
请帮我解决这个问题。我认为问题在于您将文件保存到流的方式,ExcelPackage对象有自己的方法将其保存到内存流,我会像这样修复它:
使用using块
using (ExcelPackage xls = new ExcelPackage())
然后写入MemoryStream
MemoryStream ms = new System.IO.MemoryStream();
xls.SaveAs(ms);
在关闭流之前将其写入响应
response.BinaryWrite(ms.ToArray());
ms.close(); //close the MemoryStream
应该可以