2013-04-22 6 views
16

il file che stai tentando di aprire è in un formato diverso da quello specificato dall'errore di estensione C# dell'estensione del file quando si tenta di aprire il file in Excel.il file che stai tentando di aprire è in un formato diverso da quello specificato dall'estensione file in Asp.Net

Ecco il mio codice

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

} 

quando sto cercando di aprire Excel ottengo questo errore

il file che si sta tentando di aprire è in un formato diverso da quello specificato l'estensione del file

enter image description here

Dopo aver fatto clic su Sì, il file si apre correttamente. ma non voglio che questo messaggio appaia.

risposta

20

Ho usato CloseXML per risolvere il problema.

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

Installato ClosedXML nel mio progetto utilizzando Nuget Package Manager.

+1

è possibile utilizzare open xml o closed xml check [this] (http://www.aspsnippets.com/Articles/Solution-ASPNet-GridView-Export- to-Excel-The-file-you-are-trying-to-open-is-in-a-different-format-than-specified-by-the-file-extension.aspx) ** tutorial **, speranza aiuta qualcuno. – stom

+2

Finalmente una soluzione per il mio problema. Grazie!!! –

+0

Ho provato questo e in uscita il file rilevando il virus messaggio –

5

il file che si sta tentando di aprire è in un formato diverso da quello specificato dall'estensione del file

si sono costantemente ottenere che il messaggio di avviso perché il file che ha ottenuto ha creato non è un vero e proprio file excel . Se esaminerai il file generato, sarà solo un insieme di tag html. Ricorda che il RenderControl di GridView genererà una tabella html.

Per risolvere il problema, è necessario usare sia ad uno strumento di terze parti che crea un vero e proprio file Excel (uno strumento che potrebbe desiderare di utilizzare è NPOI) o creare un file delimitato da virgole, o semplicemente un file CSV, e restituire quel file.

+0

Ho provato ad utilizzare NPOI anche ma mi dà ancora lo stesso errore –

+0

È meglio creare una nuova domanda con i dettagli di quello che hai fatto (il codice si è tentato). Il problema nella tua domanda non riguarda NPOI. –

+2

Ho risolto il problema con http://closedxml.codeplex.com/ –

2

Nel caso in cui qualcuno debba esportare un set di dati come file excel con CloseXML.

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

xlsx.Worksheets.Add(dataTable); 

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

Libreria impressionante. Sarebbe fantastico se avesse anche un XLWorkbook.ToDataTable() – pqsk

4

Nel caso in cui qualcun altro si imbatte in questo ... Ho bisogno di convertire le chiazze di nuovo in file on-the-fly in C#. Pdf ha funzionato bene ed excel mi ha dato lo stesso errore di OP spiega.

Questo è il codice che ho scritto che gestisce eccellere in modo diverso da altri tipi di file.

L'invio di applicazione excel/octet-stream con un nome file effettivo ha risolto il problema. Probabilmente non è il modo più pulito per farlo, ma è stato abbastanza buono per i miei scopi.

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 per la condivisione di una soluzione in cui non è necessario modificare il codice per poter utilizzare nuove librerie. Questa è una soluzione perfetta quando sei di fretta al lavoro. – EAmez