【问题标题】:the file you are trying to open is in a different format than specified by the file extension in Asp.Net您尝试打开的文件的格式与 Asp.Net 中文件扩展名指定的格式不同
【发布时间】:2013-04-22 10:31:37
【问题描述】:

您尝试打开的文件与尝试在 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 时出现此错误

您尝试打开的文件的格式不同于 由文件扩展名指定

单击“是”后,文件正确打开。但我不希望出现此消息。

【问题讨论】:

    标签: excel c#-4.0 asp.net-mvc-4 export-to-excel


    【解决方案1】:

    我已经用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 Package Manager 安装了 ClosedXML。

    【讨论】:

    • 可以使用open xml或者close xml检查this教程,希望对大家有所帮助。
    • 我已经尝试过这个并且在文件中出现检测到病毒的消息
    【解决方案2】:

    您尝试打开的文件的格式不同于 由文件扩展名指定

    您不断收到该警告消息,因为创建的文件不是实际的 excel 文件。如果您查看生成的文件,它只是一堆 html 标签。请记住,GridView 的 RenderControl 将生成一个 html 表。

    要解决您的问题,您需要使用第三方工具来创建真正的 excel 文件(您可能想要使用的一个工具是 NPOI)或创建一个逗号分隔的文件,或者只是一个 csv 文件,并返回该文件。

    【讨论】:

    • 您最好创建一个新问题,详细说明您所做的事情(您尝试过的代码)。您问题中的问题与 NPOI 无关。
    【解决方案3】:

    以防其他人偶然发现...我需要在 C# 中即时将 blob 转换回文件。 Pdf 运行良好,excel 给了我与 OP 解释的相同的错误。

    这是我编写的代码,它处理 excel 与其他文件类型不同。

    为 excel application/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();
    

    【讨论】:

    • 赞成分享一个无需更改代码即可使用新库的解决方案。当您赶时间工作时,这是一个完美的解决方法。
    【解决方案4】:

    如果有人需要使用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()
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多