C#生成的Excel文件:文件格式或文件扩展名无效

时间:2018-05-22 12:55:11

标签: c# excel syncfusion

我正在调用“导出”操作,其中我传递了一个视图模型列表并定义了格式

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()没有太大变化,它只是关闭先前打开的输出流。

2 个答案:

答案 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工作。