zukucode
主にWEB関連の情報を技術メモとして発信しています。

ASP.NET Core C# ダウンロードしたCSVファイルをエクセルで開くと文字化けする場合の対処法

ASP.NET Core(C#)の環境で、CSVファイルのダウンロード機能を実装したとき、ダウンロードしたCSVファイルをエクセルで開くと文字化けする現象がありました。

CSVファイルの文字コードをUTF-8にしていると文字化けするようです。

対処法としては、文字コードをShift_JisもしくはUTF-8(BOM)にする方法があります。

ここではCSVUTF-8(BOM)BOMありのUTF-8)でダウンロードする方法を紹介します。

なお、CSVASP.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(); // 文字列をバイト配列に変換する

以下のようにGetPreambleBOMを取得し、実際のデータと連結することにより、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", ファイル名);
}

関連記事