22 Aug 2019
This post will help you fix the issue where you csv export has corrupt characters when opening it in excel.
Here was the code before:
public HttpResponseMessage GetFileDownloadResponse(string fileName,string csvData)
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (StreamWriter outfile = new StreamWriter(ms))
        {
            outfile.Write(csvData);
        }
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
        httpResponseMessage.Content = new ByteArrayContent(ms.ToArray());
        httpResponseMessage.Content.Headers.Add("x-filename", fileName);
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
        httpResponseMessage.StatusCode = HttpStatusCode.OK;
        return httpResponseMessage;
    }
}
We need to enable a BOM character that will tell Excel that the CSV file is in unicode
We do this by passing true when instaniating UTF8Encoding
here:
using (StreamWriter outfile = new StreamWriter(ms, new UTF8Encoding(true)))
and here:
httpResponseMessage.Content.Headers.ContentType.CharSet = new UTF8Encoding(true).HeaderName;
Here is the full code after:
public HttpResponseMessage GetFileDownloadResponse(string fileName,string csvData)
{
    using (MemoryStream ms = new MemoryStream())
    {
        using (StreamWriter outfile = new StreamWriter(ms, new UTF8Encoding(true)))
        {
            outfile.Write(csvData);
        }
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
        httpResponseMessage.Content = new ByteArrayContent(ms.ToArray());
        httpResponseMessage.Content.Headers.Add("x-filename", fileName);
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/ms-excel");
        httpResponseMessage.Content.Headers.ContentType.CharSet = new UTF8Encoding(true).HeaderName;
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        httpResponseMessage.Content.Headers.ContentDisposition.FileName = fileName;
        httpResponseMessage.StatusCode = HttpStatusCode.OK;
        return httpResponseMessage;
    }
}