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?
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();
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.
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);
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
ajouter Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
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ão";
String corrected = Server.HtmlDecode(wrong);}