【C#】DataGridViewの内容をExcel/CSVへエクスポートする

広告

DataGridViewで一覧表示・編集したデータを「Excelで開けるファイルとして保存したい」というのは業務アプリの定番要望です。本記事では、追加ライブラリ不要なCSV出力と、より本格的なExcel(.xlsx)出力の2パターンを紹介します。

1. CSV形式でエクスポートする(標準ライブラリのみ)

CSVはテキスト形式なので、.NET標準の機能だけで出力できます。もっとも手軽な方法です。

private void ExportToCsv(DataGridView dgv, string filePath)
{
    var sb = new StringBuilder();

    // ヘッダー行
    var headers = dgv.Columns.Cast<DataGridViewColumn>().Select(c => Escape(c.HeaderText));
    sb.AppendLine(string.Join(",", headers));

    // データ行
    foreach (DataGridViewRow row in dgv.Rows)
    {
        if (row.IsNewRow) continue; // 空の新規行を除外

        var cells = row.Cells.Cast<DataGridViewCell>()
            .Select(c => Escape(c.Value?.ToString() ?? ""));
        sb.AppendLine(string.Join(",", cells));
    }

    // Excelで文字化けしないようにUTF-8 BOM付きで出力
    File.WriteAllText(filePath, sb.ToString(), new UTF8Encoding(true));
}

private string Escape(string value)
{
    // カンマ・改行・ダブルクォートを含む場合はダブルクォートで囲む
    if (value.Contains(',') || value.Contains('"') || value.Contains('\n'))
    {
        return "\"" + value.Replace("\"", "\"\"") + "\"";
    }
    return value;
}

ポイントは2つあります。

  • カンマや改行を含む値のエスケープ処理を忘れると、値がずれて壊れたCSVになる
  • 日本語Windows版Excelで開く前提なら、UTF-8 BOM付き(new UTF8Encoding(true))で保存しないと文字化けする

2. Excel形式(.xlsx)でエクスポートする(ClosedXMLを使う)

CSVはExcelで開けますが、「セルの色を付けたい」「シートを分けたい」など本格的な体裁が必要な場合は.xlsx形式で直接出力した方が確実です。ここではオープンソースライブラリのClosedXMLを使う例を紹介します(NuGetからClosedXMLパッケージを追加してください)。

using ClosedXML.Excel;

private void ExportToExcel(DataGridView dgv, string filePath)
{
    using var workbook = new XLWorkbook();
    var sheet = workbook.Worksheets.Add("Sheet1");

    // ヘッダー行
    for (int col = 0; col < dgv.Columns.Count; col++)
    {
        sheet.Cell(1, col + 1).Value = dgv.Columns[col].HeaderText;
        sheet.Cell(1, col + 1).Style.Font.Bold = true;
    }

    // データ行
    int rowIndex = 2;
    foreach (DataGridViewRow row in dgv.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dgv.Columns.Count; col++)
        {
            sheet.Cell(rowIndex, col + 1).Value = row.Cells[col].Value?.ToString() ?? "";
        }
        rowIndex++;
    }

    sheet.Columns().AdjustToContents(); // 列幅を内容に合わせて自動調整
    workbook.SaveAs(filePath);
}

AdjustToContents()で列幅を自動調整できるほか、セルの背景色やフォント、罫線などもStyleプロパティから細かく設定できます。

3. 保存先をユーザーに選ばせる(SaveFileDialog)

実際のアプリでは、保存先を固定せずダイアログで選んでもらうのが一般的です。

using var dialog = new SaveFileDialog
{
    Filter = "Excelファイル(*.xlsx)|*.xlsx|CSVファイル(*.csv)|*.csv",
    FileName = "export.xlsx"
};

if (dialog.ShowDialog() == DialogResult.OK)
{
    if (Path.GetExtension(dialog.FileName).Equals(".csv", StringComparison.OrdinalIgnoreCase))
        ExportToCsv(dataGridView1, dialog.FileName);
    else
        ExportToExcel(dataGridView1, dialog.FileName);
}

まとめ

  • 手軽さ重視なら CSV出力(標準ライブラリのみ、エスケープ処理とBOMに注意)
  • 見た目や書式にもこだわりたいなら ClosedXMLによる.xlsx出力
  • 保存先はSaveFileDialogでユーザーに選んでもらうのが実践的

これで、DataGridView入門ガイドで予告した5つの応用トピックが揃いました。基礎から応用まで、実務で使える一通りの操作を身につけていただけたのではないかと思います。

訪問数 3 回, 今日の訪問数 3回

広告

WindowsFormアプリ

Posted by hidepon