ASP.NET Core C# ダウンロードしたCSVファイルをエクセルで開くと文字化けする場合の対処法
ASP.NET Core(C#)
の環境で、CSV
ファイルのダウンロード機能を実装したとき、ダウンロードしたCSV
ファイルをエクセルで開くと文字化けする現象がありました。
CSV
ファイルの文字コードをUTF-8
にしていると文字化けするようです。
対処法としては、文字コードをShift_Jis
もしくはUTF-8(BOM)
にする方法があります。
ここではCSV
をUTF-8(BOM)
(BOM
ありのUTF-8
)でダウンロードする方法を紹介します。
なお、CSV
はASP.NET Core CSVファイルをダウンロードするWebAPIを作成するで紹介した方法でダウンロードしています。
UTF-8(BOM)
の文字コードは以下のように取得できます。
var enc = new UTF8Encoding(true);
しかし、以下のように文字コードをUTF-8(BOM)
にするだけではうまくいきません。
string csv = "CSVデータ";
byte[] file = new UTF8Encoding(true).GetBytes(csv).ToArray(); // 文字列をバイト配列に変換する
以下のようにGetPreamble
でBOM
を取得し、実際のデータと連結することにより、BOM
付きのデータとなります。
string csv = "CSVデータ";
byte[] data = new UTF8Encoding(true).GetBytes(csv); // 文字列をバイト配列に変換する
// Excelで開いたときに文字化けしないようにBOMを追加する
byte[] file = new UTF8Encoding(true).GetPreamble().Concat(data).ToArray();
WebAPI
としては以下のようになります。
[HttpGet("{id}/[action]")]
public async Task<IActionResult> Download(string id)
{
string csv = "CSVデータ";
byte[] file = Encoding.UTF8.GetBytes(csv).ToArray(); // 文字列をバイト配列に変換する
byte[] data = new UTF8Encoding(true).GetBytes(csv); // 文字列をバイト配列に変換する
// Excelで開いたときに文字化けしないようにBOMを追加する
byte[] file = new UTF8Encoding(true).GetPreamble().Concat(data).ToArray();
return File(file, "application/octet-stream", ファイル名);
}