In ASP.Net, if you write a file to the client using code like this:
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader( "content-disposition", string.Format( "attachment; filename={0}", fileName ) );
HttpContext.Current.Response.ContentType = "application/ms-excel";
using( StringWriter sw = new StringWriter() )
{
using( HtmlTextWriter htw = new HtmlTextWriter( sw ) )
{
// Create a form to contain the grid
Table table = new Table();
// render the table into the htmlwriter
table.RenderControl( htw );
// render the htmlwriter into the response
HttpContext.Current.Response.Write( sw.ToString() );
HttpContext.Current.Response.End();
}
}
My situation is to render a table to a file named xxx.xls(Excel file) and send to the client. And the file contains Chinese or other languages, it may cause some error codes in the file. This could happen randomly, sometimes error codes sometimes not.
After trying, I found if you save the file to UTF-8 with Signature, the error codes gone.
Then I tried to add the BOM the file before sending to the client:
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader( "content-disposition", string.Format( "attachment; filename={0}", fileName ) );
HttpContext.Current.Response.ContentType = "application/ms-excel;charset=UTF-8;";
//prepare a memory stream
MemoryStream ms = new MemoryStream();
using( StreamWriter sw = new StreamWriter( ms ) )
{
using( HtmlTextWriter htw = new HtmlTextWriter( sw ) )
{
// Create a form to contain the grid
Table table = new Table();
//process your table here
// render the table into the htmlwriter
table.RenderControl( htw );
//remember to flush
htw.Flush();
//add the BOM
byte[] bBOM = new byte[] { 0xEF, 0xBB, 0xBF };
byte[] bContent = ms.ToArray();
byte[] bToWrite = new byte[bBOM.Length + bContent.Length];
//combile the BOM and the content
bBOM.CopyTo( bToWrite, 0 );
bContent.CopyTo( bToWrite, bBOM.Length );
//write to the client
HttpContext.Current.Response.Write( Encoding.UTF8.GetString( bToWrite ) );
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
ms.Dispose();
}
}
The file being rendered will be added the BOM at the beginning.