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

4 回答 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 Package Manager在我的项目中安装了 ClosedXML 。

于 2013-04-29T05:35:42.287 回答
5

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

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

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

于 2013-04-22T12:27:50.450 回答
4

以防其他人偶然发现...我需要在 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();
于 2014-08-18T17:34:11.333 回答
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");
于 2014-02-18T18:11:19.310 回答