Wygląda na to, że Excel domyślnie nie stosuje kodowania UTF8. Aby "zmusić" go do tego, należy dodać BOM na początku strumienia.
string csv = GenerateCsv(); var encoding = Encoding.UTF8; byte[] bytes = encoding.GetBytes(csv); bytes = Encoding.UTF8.GetPreamble().Concat(bytes).ToArray();
// ... return application/octet-stream with filename=something.csv
Teraz otwierając ściągnięty plik w Excelu, widzimy polskie znaki.
Żródło:http://stackoverflow.com/questions/4414088/how-to-getbytes-in-c-sharp-with-utf8-encoding-with-bom