Problématique liée à l’export du GridView vers Excel : le symbole €

Il existe un bout de code très pratique qui permet d’exporter assez rapidement un GridView vers Excel :

Code .aspx :

<asp:GridView ID="myGridView" runat="server" AutoGenerateColumns="false">
     <Columns>
         <asp:BoundField ItemStyle-HorizontalAlign="Center" 
            HeaderText="Symbole €" DataField="Valeurs"/>
     </Columns>
</asp:GridView>

Code .cs :

DataTable table = new DataTable();

DataColumn column = new DataColumn("Valeurs");
        
table.Columns.Add(column);

for (int i = 0; i < 10; i++)
{
    DataRow row;
    row = table.NewRow();
    row["Valeurs"] = i;
    table.Rows.Add(row);
}

myGridView.DataSourceID = String.Empty;
myGridView.DataSource = table;
myGridView.DataBind();
HtmlForm form = new HtmlForm();
this.Controls.Add(form);
StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
Response.AddHeader("content-disposition", "attachment;filename=fileName.xls");
Response.ContentType = "application/vnd.xls";
form.Controls.Add(myGridView); 
form.RenderControl(htmlWrite);

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

Néanmoins, si vous exécuter ce code, vous remarquerez que dans l’entête de colonne, le symbôle € n’est pas correctement restitué. Au lieu d’avoir le « € », on obtient un « â‚¬ ».

Pour palier à ce problème, il faut remplacer le précédent code par le suivant :

Code .cs :

 

HtmlForm form = new HtmlForm();
this.Controls.Add(form);
StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
Response.AddHeader("content-disposition", "attachment;filename=fileName.xls");
Response.ContentType = "application/vnd.xls";
form.Controls.Add(myGridView);
form.RenderControl(htmlWrite);

Response.Write(stringWrite.ToString());

string output = stringWrite.ToString();

byte[] euroByte = new byte[1];
euroByte[0] = (byte)128;
bool isAfterFirst = false;
foreach (string item in output.Split('€'))
{
   if (isAfterFirst)
   {
        Response.OutputStream.Write(euroByte, 0, 1);
   }
   Response.Write(item);
   Response.Flush();
   isAfterFirst = true;
}
        
Response.End();
Pour marque-pages : permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>