views:

1333

answers:

4

Hi!

I'm doing some Excel Exports on the ASP.NET Site. Everything works except of the Encoding. When I open it in Excel, it looks like this:

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

This is my 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();

I've already tried explicitly set the Encoding.. but no change occured:

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

What is wrong, please?

A: 

Have you tried setting the encoding in a meta tag in the HTML?

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

Excel won't see the response headers, so it won't know what the Response.Encoding is. The meta tag allows it to find out.

David Kemp
I'm exporting a Control that is rendered which means that the file exported is html with a table only. no body, no headers. nothing..
PaN1C_Showt1Me
Adding at least <html><head><meta... /></head><body>...</body> is probably worth while then.
David Kemp
Yeah but i think that's the same solution as to add a byte header with encoding.. anyways it's a file to be opened in office.. what do you think ?
PaN1C_Showt1Me
if the unicode pre-amble works, stick with it.
David Kemp
+3  A: 

Well I found out that the problem could be in the header of the excel file, that it does not contain the BOM byte sequence (at the beginning of the file representing the encoding used).

So I made it this way and it works for 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();
PaN1C_Showt1Me
A: 

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

chan
A: 

Thank you very much it worked for me, even when using arabic charcters

Response.ContentEncoding = System.Text.Encoding.Unicode; Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());

Mohammad Shami
I'm glad that it worked for you :)
PaN1C_Showt1Me