web-dev-qa-db-fra.com

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

le fichier que vous essayez d'ouvrir est dans un format différent de celui spécifié par l'erreur d'extension de fichier c # 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'ouvre correctement. mais je ne veux pas que ce msg apparaisse.

18
Rahul Rajput

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 Nuget Package Manager .

23
Rahul Rajput

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

Vous recevez constamment ce message d'avertissement car le fichier qui a été créé n'est pas un fichier Excel réel. Si vous regardez dans le fichier généré, ce n'est qu'un tas de balises html. N'oubliez pas que le RenderControl de GridView va générer une table html.

Pour résoudre votre problème, vous devez soit utiliser un outil tiers qui crée un vrai fichier Excel (un outil que vous voudrez peut-être utiliser est NPOI ) ou créer un fichier délimité par des virgules, ou simplement un fichier csv, et renvoyez ce fichier.

5
von v.

Au cas où quelqu'un d'autre tomberait dessus ... J'avais besoin de reconvertir les blobs en fichiers à la volée en C #. Pdf a bien fonctionné et Excel m'a donné la même erreur que OP explique.

C'est le code que j'ai écrit qui gère Excel différemment des autres types de fichiers.

Donner une application Excel/octet-stream avec un nom de fichier réel a résolu mon problème. Ce n'était probablement pas la façon la plus propre de le faire, mais c'était assez bon pour mes besoins.

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
Mike Wallace

Dans le cas où quelqu'un a besoin d'exporter un jeu de données sous forme de 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
dvdmn