2013-04-22 12 views
16

Die Datei, die Sie öffnen möchten, hat ein anderes Format als die Dateiendung C# error, wenn Sie versuchen, die Datei zu öffnen in Excel.Die Datei, die Sie öffnen möchten, hat ein anderes Format als in der Dateierweiterung in Asp.Net angegeben

Hier ist mein 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"); 

} 

wenn Excel zu öffnen versuche ich erhalte diese Störung

die Datei, die Sie versuchen, zu öffnen, ist in einem anderen Format als durch die Dateierweiterung angegeben

enter image description here

Nachdem Sie auf Ja geklickt haben, wird die Datei ordnungsgemäß geöffnet. aber ich möchte nicht, dass diese msg erscheint.

Antwort

20

Ich habe CloseXML verwendet, um das Problem zu lösen.

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

Installierte ClosedXML in meinem Projekt mit Nuget Package Manager.

+1

Sie können öffnen xml oder geschlossen xml check [this] (http://www.aspsnippets.com/Articles/Solution-ASPNet-GridView-Export- to-Excel-Die-Datei-Sie-versuchen-zu-öffnen-ist-in-einem-anders-Format-als-angegeben-durch-die-Datei-Erweiterung.aspx ** ** tutorial **, Hoffnung hilft jemand. – stom

+2

Endlich eine Lösung für mein Problem. Vielen Dank!!! –

+0

Ich habe versucht, diese und auf Datei Virus entdeckt Nachricht –

5

die Datei, die Sie versuchen, zu öffnen ist in einem anderen Format als durch die Dateierweiterung angegeben

Sie sind ständig, dass die Warnmeldung bekommen, weil die Datei, die erstellt wurde ist nicht eine tatsächliche Excel-Datei . Wenn Sie in die generierte Datei schauen, sind es nur ein paar HTML-Tags. Denken Sie daran, dass RenderControl von GridView eine HTML-Tabelle generiert.

Um das Problem zu beheben, müssen Sie entweder ein Drittanbieter-Tool verwenden, das eine echte Excel-Datei erstellt (ein Tool, das Sie verwenden möchten, ist NPOI) oder eine durch Kommas getrennte Datei oder einfach eine CSV-Datei erstellen gib diese Datei zurück.

+0

ich versuchte auch NPOI verwenden, aber es gibt mir immer noch denselben Fehler –

+0

Sie besser eine neue Frage mit den Details schaffen, was Sie getan haben (der Code, den Sie versuchen). Das Problem in Ihrer Frage betrifft nicht NPOI. –

+2

Ich löste das Problem mit http://closedxml.codeplex.com/ –

2

Falls jemand einen Datensatz als Excel-Datei mit CloseXML exportieren muss.

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

xlsx.Worksheets.Add(dataTable); 

xlsx.SaveAs("export.xlsx"); 
+0

Awesome Bibliothek. Wäre toll, wenn es auch ein XLWorkbook.ToDataTable() – pqsk

4

Falls jemand anderes stolpert über dieses ... Ich brauchte Blobs zurück in Dateien on-the-fly in C# zu konvertieren. PDF funktionierte gut und Excel gab mir den gleichen Fehler wie OP erklärt.

Dies ist der Code, den ich geschrieben habe, der Excel anders als andere Dateitypen behandelt.

Geben Excel-Anwendung/Oktettstream mit einem tatsächlichen Dateinamen gelöst mein Problem. Wahrscheinlich nicht der sauberste Weg, aber es war gut genug für meine Zwecke.

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

Upvote für die Freigabe einer Lösung, wo Sie Ihren Code nicht ändern müssen, um neue Bibliotheken zu verwenden. Dies ist eine perfekte Problemumgehung, wenn Sie bei der Arbeit in Eile sind. – EAmez