วันจันทร์ที่ ๑๐ ตุลาคม พ.ศ. ๒๕๕๔

ASP.NET Gridview export UNICODE to Excel (แก้ปัญหา export ภาษาไทยแล้วอ่านไม่ออก)

ผมเจอปัญหาว่าพอสั่ง Export Gridview ไปเป็น Excel แล้วภาษาไทยมันอ่านไม่ออกครับ
ลองแก้ Response.Charset แล้วก็ยังไม่ได้ครับ ค้นใน google ก็เลยเจอว่าน่าจะเป็นเพราะคำสั่งที่ export นั้นไม่สนับสนุน UTF8 ผมใช้ StringWriter ครับ พอลองมาค้นดูก็เจอว่า StreamWriter มันรองรับการทำ Encoding ได้ ก็เลยปิ๊งครับ

           
gvContact.DataSource = mlSummaries
gvContact.DataBind()

Response.Clear()

Response.AddHeader("content-disposition", "attachment;filename=EventMailingList.xls")
Response.Charset = "tis-620"
Response.ContentType = "application/vnd.ms-excel"

If Request("EventName") IsNot Nothing Then lblCaption.Text = Server.UrlDecode(Request("EventName"))

' โค้ดเดิมที่ใช้ไม่ได้
'Dim stringWrite As New System.IO.StringWriter
'Dim htmlWrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite)

'divExport.RenderControl(htmlWrite)
'Response.Write(stringWrite.ToString())

Dim ms As New System.IO.MemoryStream()
Dim streamWrite As New System.IO.StreamWriter(ms, Encoding.UTF8)
Dim htmlWrite As New System.Web.UI.HtmlTextWriter(streamWrite)
divExport.RenderControl(htmlWrite)

Dim strEncodedHTML As String = Encoding.UTF8.GetString(ms.ToArray)
Response.Write(strEncodedHTML)
Response.End()


ทดลองดูใช้ได้ครับ ออกมาเป็นภาษาไทยถูกต้องแล้ว

๑๐ ความคิดเห็น:

jamesan noiamka กล่าวว่า...
ความคิดเห็นนี้ถูกผู้เขียนลบ
ไม่ระบุชื่อ กล่าวว่า...

หรือจะลองใช้แบบนี้ก็ได้ครับ

Response.Clear();
Response.AddHeader("content-disposition","attachment;filename=Export1.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);

GridView1.RenderControl(hw);
Response.Write(sw.ToString());
Response.End();

LoCoNus กล่าวว่า...

ขอบคุณสำหรับบทความดีๆ

ถ้าไม่มีบทความนี้เราคงแย่

ขอบคุณจริงๆ ค่ะ : )

อาร์ม .net Programmer กล่าวว่า...

เจ๋งมากเลยครับ

รู้ไหมครับผมเสียเวลาหาโค้ดตรงนี้เกือบครึ่งค่อนวัน ดีใจที่หาโค้ดนี้เจอ ขอบคุณนะครับ

ขอบคุณ ขอบคุณ ขอบคุณครับ

Unknown กล่าวว่า...

ขอบคุณมากครับ

Unknown กล่าวว่า...

สุดยอดครับ ขอบคุณครับ

tanakamma กล่าวว่า...

ขอบคุณครับ สุดยอดจริงๆ

Unknown กล่าวว่า...

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

อธิบายบรรนี้ให้ฟังหน่อยครับ คืออะไรครับ

Unknown กล่าวว่า...

Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
#อันนี้ได้

EX กล่าวว่า...

ขอบคุณมากครับ ได้แล้วครับ