2009-11-05 11 views
35

Estoy haciendo algunas Exportaciones de Excel en el sitio ASP.NET. Todo funciona excepto la codificación. Cuando lo abro en Excel, que se ve así:Problema de codificación de exportación de ASP.NET Excel

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

Este es mi código:

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

ya he intentado establecer explícitamente la codificación .. pero ningún cambio se produjo:

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

¿Qué pasa, por favor?

Respuesta

112

Bien, descubrí que el problema podría estar en el encabezado del archivo de Excel, que no contiene la secuencia de bytes BOM (al comienzo del archivo que representa la codificación utilizada).

Hice, pues de esta manera y funciona para mí:

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

Como minimalista, traté de eliminar las líneas 4 ('ContentEncoding') y 5 (' BinaryWrite') y me sorprendió que no funcionara. Excelente trabajo para encontrar esta solución. ¡El respeto! :) – Chiramisu

+0

Pasé unas horas tratando de hacer que esto funcione y finalmente me rendí y concatené "" frente a mis hilos. Un truco total. Muchas gracias por descubrir esto. – user441058

+0

Mi último comentario no suena bien.Estaba tratando de encontrar una solución por mi cuenta y no pude solucionarlo hasta que encontré tu respuesta. :-) – user441058

9

¿Has intentado configurar la codificación en una metaetiqueta en el HTML?

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

Excel no verá las cabeceras de respuesta, por lo que no se sabe lo que el Response.Encoding es. La metaetiqueta le permite descubrirlo.

+0

Estoy exportar un control que se representa lo que significa que el archivo exportado es html con una tabla solamente. sin cuerpo, sin encabezados nada .. –

+0

Agregar al menos ... es probable que valga la pena en ese momento. –

+0

Sí, pero creo que es la misma solución que agregar un encabezado de bytes con codificación. De todos modos, es un archivo para abrir en la oficina. ¿Qué opinas? –

2

añadir Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());

+0

Debe agregar un poco más que solo código, como dónde agregar su trazador de líneas. – EdChum

+0

si esto funcionó para mí – BrainCoder

9

Para los casos donde se necesita 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

Tengo mismo problema con personajes españoles y lo resolvió con esta línea de código.

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

esperanza esto ayuda

1

Usted puede tratar de utilizar "Server.HtmlDecode" para decodificar estas palabras como "João"

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