web-dev-qa-db-fra.com

Problème d'encodage d'exportation ASP.NET Excel

Je fais quelques exportations Excel sur le site ASP.NET. Tout fonctionne sauf l'encodage. Lorsque je l'ouvre dans Excel, cela ressemble à ceci:

Eingabe Kosten je Gerät Gerät: Gerätebezeichnung: Betriebsmittel Heizöl en €: 4 Dieselverbrauch en €: 4

Voici mon code:

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

J'ai déjà essayé de définir explicitement l'encodage .. mais aucun changement ne s'est produit:

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'est-ce qui ne va pas, s'il vous plaît?

39
PaN1C_Showt1Me

Eh bien, j'ai découvert que le problème pouvait être dans l'en-tête du fichier Excel, qu'il ne contient pas la séquence d'octets BOM (au début du fichier représentant l'encodage utilisé).

Je l'ai donc fait de cette façon et cela fonctionne pour moi:

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

Avez-vous essayé de définir l'encodage dans une balise META dans le HTML?

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

Excel ne verra pas les en-têtes de réponse, il ne saura donc pas ce que le Response.Encoding est. La balise meta lui permet de le découvrir.

11
David Kemp

Pour les cas où UTF8 est nécessaire ...

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);
11
Franz

J'ai eu le même problème avec les caractères espagnols et je l'ai résolu avec cette ligne de code.

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

j'espère que cela t'aides

3
calterras

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

2
chan

Vous pouvez essayer d'utiliser "Server.HtmlDecode" pour décoder ces mots comme "João"

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