您正在尝试打开的文件与Asp.Net中指定的文件扩展名格式不同。

18

您试图打开的文件与文件扩展名指定的格式不同,在尝试在Excel中打开文件时出现了C#错误。

这是我的代码

public ActionResult Export(string filterBy)
{
    MemoryStream output = new MemoryStream();
    StreamWriter writer = new StreamWriter(output, Encoding.UTF8);

    var data = City.GetAll().Select(o => new
    {
        CountryName = o.CountryName,
        StateName = o.StateName,
        o.City.Name,
        Title = o.City.STDCode
    }).ToList();
    var grid = new GridView { DataSource = data };
    grid.DataBind();
    var htw = new HtmlTextWriter(writer);

    grid.RenderControl(htw);

    writer.Flush();
    output.Position = 0;

    return File(output, "application/vnd.ms-excel", "test.xls");

}

打开Excel时遇到以下错误:

您要打开的文件与文件扩展名指定的格式不同。

图片描述

单击“是”后,文件可以正常打开。但我不想看到这个提示。

4个回答

23

我已经使用CloseXML解决了这个问题。

public static void ExportToExcel(IEnumerable<dynamic> data, string sheetName)
{
    XLWorkbook wb = new XLWorkbook();
    var ws = wb.Worksheets.Add(sheetName);
    ws.Cell(2, 1).InsertTable(data);
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    HttpContext.Current.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx",sheetName.Replace(" ","_")));

    using (MemoryStream memoryStream = new MemoryStream())
    {
        wb.SaveAs(memoryStream);
        memoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
        memoryStream.Close();
    }

    HttpContext.Current.Response.End();
}

使用Nuget包管理器在我的项目中安装了ClosedXML。


1
你可以使用Open XML或Closed XML,查看这个教程:http://www.aspsnippets.com/Articles/Solution-ASPNet-GridView-Export-to-Excel-The-file-you-are-trying-to-open-is-in-a-different-format-than-specified-by-the-file-extension.aspx。希望能对某些人有所帮助。 - Shaiju T
我已经尝试过这个,但输出文件出现了病毒检测信息。 - Kamran Shahid

5
您一直收到警告信息的原因是所创建的文件不是实际的excel文件。如果您查看生成的文件,它只是一堆html标签。请记住,GridView的RenderControl会生成一个html表格。
要解决您的问题,您需要使用第三方工具创建真正的excel文件(您可能想使用的一个工具是NPOI),或者创建逗号分隔的文件,或者简单地创建一个csv文件并返回该文件。

最好创建一个新问题,并提供您所做的详细信息(您尝试的代码)。您的问题与NPOI无关。 - von v.

4

如果有其他人也遇到了这个问题……在C#中,我需要实时将blob转换为文件。PDF效果很好,而Excel给出了与OP相同的错误。

以下是我编写的处理Excel与其他文件类型不同的代码。

将excel应用程序/octet-stream与实际文件名一起使用,可以解决我的问题。可能不是最干净的解决方案,但对于我的目的来说已经足够。

string theExt = Path.GetExtension(theDoc.documentFileName).ToUpper();

Response.Clear();

if (theExt == ".XLS" || theExt == ".XLSX"){
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentFileName));
    }
else{
    Response.ContentType = theDoc.documentMimeType;
    Response.AddHeader("Content-Disposition", string.Format("inline; filename={0}", theDoc.documentTitle));
}

using (MemoryStream stream = new MemoryStream(theDoc.file))
{
    stream.WriteTo(Response.OutputStream);
    stream.Close();
};

Response.End();

1
点赞分享一个解决方案,其中您不必更改代码即可使用新库。当您在工作中匆忙时,这是一个完美的解决方法。 - EAmez

2

如果有人需要使用CloseXML将数据集导出为Excel文件。

Dataset ds = { your data from db }
var xlsx = new XLWorkbook();
var dataTable = ds.Tables[0];

xlsx.Worksheets.Add(dataTable);

xlsx.SaveAs("export.xlsx");

很棒的库。如果它还有一个XLWorkbook.ToDataTable()就更棒了。 - pqsk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接