我正在调用“导出”操作,其中我传递了一个视图模型列表并定义了格式
public ActionResult DownloadTokenlist(string startDate = null, string endDate = null)
{
using (HRCTSStatisticDb db = new HRCTSStatisticDb(Setting.ClientId))
{
List<TokenExportViewModel> tokenExportViewModels = new List<TokenExportViewModel>();
Response.AddHeader("content-disposition", $"attachment;filename=Tokenlist_{DateTime.Now.ToString("dd.MM.yyyy")}.xlsx");
log.InfoFormat($"The {new HomeController().UserRole(Context.LoggedInUser)}: {Context.LoggedInUser} has used the exceldownload");
return File(new ExcelExport().Export(tokenExportViewModels), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
}
我调用的动作(ExcelEngine是Syncfusion):
public MemoryStream Export(List<TokenExportViewModel> list)
{
MemoryStream stream = new MemoryStream();
using (ExcelEngine excelEngine = new ExcelEngine())
{
IApplication application = excelEngine.Excel;
application.DefaultVersion = ExcelVersion.Excel2010;
IWorkbook workbook = application.Workbooks.Create(1);
IWorksheet worksheet = workbook.Worksheets.Create("Tokenlist");
IStyle defaultStyle = workbook.Styles.Add("default");
defaultStyle.Font.Size = 12;
worksheet.SetDefaultColumnStyle(1, 20, defaultStyle);
worksheet.SetDefaultRowStyle(1, 300, defaultStyle);
worksheet.UsedRange.AutofitColumns();
worksheet.Range["A1"].Text = $"Tokenlist - {DateTime.Today.ToString("dd.MM.yyyy")}";
worksheet.Range["A1"].CellStyle = h1Style;
workbook.SaveAs(stream);
workbook.Close();
}
return stream;
}
我只发布了对文件有影响的代码,并且(可能)可能会产生错误。 没有错误,直到我打开文件,然后弹出这个异常:
Excel无法打开'Tokenlist_22.05.2018.xlsx'文件,因为 文件格式或文件扩展名无效。验证文件是否有 没有损坏,文件扩展名与。的格式匹配 文件。
我试图将文件格式更改为.xls和.vbs,但都不起作用。使用.xls我可以打开文档,但它没有数据。
.close()没有太大变化,它只是关闭先前打开的输出流。
答案 0 :(得分:1)
使用FileContentResult Overload,您可以像这样提供fileDownloadName
:
return File(excelExport.Export(tokenExportViewModels).ToArray(),"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"Tokenlist_{DateTime.Now.ToString("dd.MM.yyyy")}.xlsx");
并使用流ToArray()
扩展程序返回byte[]
。
(我假设您的Export
方法正在生成有效文档)
答案 1 :(得分:1)
当流在返回时到达结束位置时,下载的文件已损坏。因此,建议将其当前位置设置为0以解决此问题。请参考以下代码以实现相同的目的。
代码示例:
workbook.SaveAs(stream);
workbook.Close();
stream.Position = 0;
我们还共享了一个简单的示例供您参考,可以从以下链接下载该示例。
示例链接:http://www.syncfusion.com/downloads/support/directtrac/general/ze/Sample1020485770.zip
我为Syncfusion工作。