le fichier que vous essayez d'ouvrir est dans un format différent de celui spécifié par l'extension du fichier dans Asp.Net

le fichier que vous essayez d'ouvrir est dans un format différent de celui spécifié par l'extension de fichier c# d'erreur lorsque vous essayez d'ouvrir le fichier dans excel.

Voici mon code

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");

}

quand j'essaie d'ouvrir excel, j'obtiens cette erreur

le fichier que vous essayez d'ouvrir est dans un format différent de celui spécifié par l'extension de fichier

enter image description here

Après avoir cliqué sur Oui, le fichier s'ouvrir correctement. mais je n'ai pas je veux que ce msg apparaisse.

17
demandé sur Rahul Rajput 2013-04-22 14:31:37

4 réponses

j'ai utilisé CloseXML pour résoudre le problème.

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();
}

installé ClosedXML dans mon projet en utilisant Gestionnaire De Package Nuget.

21
répondu Rahul Rajput 2016-06-22 20:39:04

vous recevez constamment ce message d'avertissement parce que le fichier qui a été créé n'est pas un fichier excel réel. Si vous regardez dans le fichier généré, il est juste un tas de balises html. Rappelez-vous qu'un GridView's RenderControl générera une table html.

Pour résoudre votre problème, vous devez soit utiliser un outil tiers qui crée un véritable fichier excel (un outil que vous souhaitez utiliser est NPOI) ou créer un fichier délimité par des virgules, ou simplement un fichier csv, et retourner ce fichier.

5
répondu von v. 2013-04-22 12:27:50

au cas où quelqu'un d'autre trébucherait là-dessus... J'avais besoin de convertir les blobs en fichiers à la volée dans C#. Pdf a bien fonctionné et excel m'a donné cette même erreur que L'OP explique.

c'est le code que j'ai écrit qui traite excel différemment des autres types de fichiers.

donner à excel application / octet-stream un vrai nom de fichier a résolu mon problème. Probablement pas la façon la plus propre de le faire mais c'était assez bon pour mes fins.

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
répondu Mike Wallace 2014-08-18 17:34:11

Dans le cas où quelqu'un a besoin d'exporter un jeu de données comme fichier excel avec CloseXML.

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

xlsx.Worksheets.Add(dataTable);

xlsx.SaveAs("export.xlsx");
2
répondu dvdmn 2014-02-20 13:26:57