2009-11-05 22 views
35

Sto eseguendo alcune esportazioni Excel sul sito ASP.NET. Tutto funziona tranne la codifica. Quando ho aperto in Excel, sembra che questo:ASP.NET Problema di codifica esportazione Excel

Eingabe Kosten je Gerät Gerät: Gerätebezeichnung: Betriebsmittel Heizöl in â,¬: 4 Dieselverbrauch in â,¬ : 4

Questo è il mio codice:

Response.Clear(); 
Response.ContentType = "application/ms-excel"; 
Response.AddHeader("Content-Disposition", "inline;filename=NachkalkGeraete.xls;"); 
var writer = new HtmlTextWriter(Response.Output); 

SomeControl.RenderControl(writer); /* FormView, Table, DataGrid... */ 

Response.End(); 

ho già provato a impostare in modo esplicito la codifica .. ma nessun cambiamento si è verificato:

Response.Clear(); 
Response.ContentType = "application/vnd.ms-excel"; 
Response.AddHeader("Content-Disposition", "attachment; filename=NachkalkGeraete.xls"); 

Response.BufferOutput = true; 
Response.ContentEncoding = System.Text.Encoding.UTF8; 
Response.Charset = "UTF-8"; 
EnableViewState = false; 

System.IO.StringWriter tw = new System.IO.StringWriter(); 
HtmlTextWriter hw = new HtmlTextWriter(tw); 

SomeControl.RenderControl(hw); 

Response.Write(tw.ToString()); 
Response.End(); 

Cosa c'è che non va, per favore?

risposta

112

Bene ho scoperto che il problema potrebbe essere nell'intestazione del file excel, che non contiene la sequenza byte BOM (all'inizio del file che rappresenta la codifica utilizzata).

così ho fatto in questo modo e funziona per me:

Response.Clear(); 
Response.AddHeader("content-disposition","attachment;filename=Test.xls"); 
Response.ContentType = "application/ms-excel"; 
Response.ContentEncoding = System.Text.Encoding.Unicode; 
Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble()); 

System.IO.StringWriter sw = new System.IO.StringWriter(); 
System.Web.UI.HtmlTextWriter hw = new HtmlTextWriter(sw); 

FormView1.RenderControl(hw); 

Response.Write(sw.ToString()); 
Response.End(); 
+0

Come minimalista ho provato a eliminare le righe 4 ('ContentEncoding') e 5 (' BinaryWrite') e sono rimasto sorpreso nel constatare che non funzionava. Ottimo lavoro nel trovare questa soluzione. Rispetto! :) – Chiramisu

+0

Ho passato qualche ora a cercare di farlo funzionare e alla fine ho rinunciato e concatenato "" di fronte alle mie corde. Un trucco totale. Grazie mille per averlo capito. – user441058

+0

Il mio ultimo commento non suona bene.Stavo cercando di capire una soluzione da solo e non sono riuscito a risolverlo finché non ho trovato la tua risposta. :-) – user441058

9

Hai provato a impostare la codifica in un metatag nell'HTML?

<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" /> 

Excel non vedere le intestazioni di risposta, in modo da non sapere qual è il Response.Encoding è. Il meta tag gli permette di scoprirlo.

+0

sto esportazione di un controllo che è resa che significa che il file esportato è html con solo una tabella. nessun corpo, nessuna intestazione. niente .. –

+0

L'aggiunta di almeno ... probabilmente vale la pena allora. –

+0

Sì, ma penso che sia la stessa soluzione di aggiungere un'intestazione di byte con la codifica .. comunque è un file da aprire in ufficio .. cosa ne pensi? –

2

aggiungere Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());

+0

Dovresti aggiungere qualcosa in più del semplice codice, ad esempio dove aggiungere il tuo rivestimento. – EdChum

+0

sì, questo ha funzionato per me – BrainCoder

9

Per le istanze in cui è necessario UTF8 ...

FileInfo dataExportFile = new FileInfo(dsExport.Tables[0].Rows[0]["DataExportFile"].ToString()); 

Response.Clear(); 
Response.ContentType = "application/ms-excel";       
Response.AddHeader("Content-Disposition", "attachment;filename=" + dataExportFile.Name); 
Response.ContentEncoding = System.Text.Encoding.UTF8; 
Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble()); 
Response.TransmitFile(dataExportFile.FullName); 
3

Ho avuto lo stesso problema con caratteri spagnoli e risolto con questa riga di codice.

 response.ContentEncoding = System.Text.Encoding.Default ; 

speranza che questo aiuta

1

Si può provare ad usare "Server.HtmlDecode" per decodificare queste parole come "João"

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e){ 
String wrong = "Jo&#227;o"; 
String corrected = Server.HtmlDecode(wrong);} 
Problemi correlati