我一直在尝试让我的 ASP.NET MVC 网站将一些数据导出为 Excel 文件。几个小时以来,我一直以为 NPOI 只是在生产垃圾,所以我转向了 EPPlus。我在 LINQPad 中对其进行了测试,它创建了一个正常工作的 XLSX 文件,因此我将代码移至 MVC 应用程序。我再次收到损坏的文件。偶然间,我偶然查看了临时目录,发现 EPPlus 创建的文件大小为 3.87KB,并且工作正常,但是
FileResult
返回的文件大小为 6.42KB,该文件已损坏。为什么会发生这种情况?我在某处读到这是服务器 GZip 压缩导致的,所以我将其关闭,但它没有任何效果。有人请帮助我,我快疯了......这是我的代码。
[HttpGet]
public FileResult Excel(
CenturyLinkOrderExcelQueryModel query) {
var file = Manager.GetExcelFile(query); // FileInfo
return File(file.FullName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", query.FileName);
}
就我而言,
FileResult
及其附带方法存在问题。我最终通过覆盖 Response
对象来“解决”问题:
[HttpGet]
public void Excel(
CenturyLinkOrderExcelQueryModel query) {
var file = Manager.GetExcelFile(query);
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=" + query.FileName);
Response.BinaryWrite(System.IO.File.ReadAllBytes(file.FullName));
Response.Flush();
Response.Close();
Response.End();
}
尝试使用
OpenRead
中的 FileInfo
获取文件流并查看是否有效。
[HttpGet]
public FileResult Excel(CenturyLinkOrderExcelQueryModel query) {
var file = Manager.GetExcelFile(query); // FileInfo
var fileStream = file.OpenRead();
return File(fileStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", query.FileName);
}
我正在使用
FileStreamResult(fileStream, MIMEType)
下载 Excel 文件。当我打开它时,它说:
Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.
和
Errors were detected in file ....
Excel completed file level validation and repair. Some parts of this workbook may have been repaired or discarded.
对我来说,我必须像这样下载文件才能解决问题并毫无问题地下载 Excel 文件:
[HttpGet]
public async Task<ActionResult> Download(Guid? Id)
{
Models.File fileInDb = .....;
FileStream fileStream = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
Response.BufferOutput = false;
Response.ContentType = fileInDb.MIMEType;
return new FileStreamResult(fileStream, fileInDb.MIMEType);
}