【Visual Studio】DataGridViewのデータをCSVに出力する


この記事はプロモーションを含みます。

C#

C#でDataGridViewに登録されているデータをCSVファイルに出力する方法を解説します。

デザインコード

Windowsフォームアプリのデザインコード「Form1.Designer.cs」になります。

namespace WinFormsApp2
{
    partial class Form1
    {
        /// <summary>
        ///  Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        ///  Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        ///  Required method for Designer support - do not modify
        ///  the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            button1 = new Button();
            Column3 = new DataGridViewTextBoxColumn();
            Column2 = new DataGridViewTextBoxColumn();
            Column1 = new DataGridViewTextBoxColumn();
            dataGridView1 = new DataGridView();
            ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
            SuspendLayout();
            // 
            // button1
            // 
            button1.Location = new Point(12, 12);
            button1.Name = "button1";
            button1.Size = new Size(116, 44);
            button1.TabIndex = 0;
            button1.Text = "button1";
            button1.UseVisualStyleBackColor = true;
            button1.Click += button1_Click;
            // 
            // Column3
            // 
            Column3.HeaderText = "カラム3";
            Column3.Name = "Column3";
            // 
            // Column2
            // 
            Column2.HeaderText = "カラム2";
            Column2.Name = "Column2";
            // 
            // Column1
            // 
            Column1.HeaderText = "カラム1";
            Column1.Name = "Column1";
            // 
            // dataGridView1
            // 
            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            dataGridView1.Columns.AddRange(new DataGridViewColumn[] { Column1, Column2, Column3 });
            dataGridView1.Location = new Point(12, 62);
            dataGridView1.Name = "dataGridView1";
            dataGridView1.Size = new Size(600, 247);
            dataGridView1.TabIndex = 1;
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 15F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(624, 321);
            Controls.Add(dataGridView1);
            Controls.Add(button1);
            Name = "Form1";
            Text = "Form1";
            Load += Form1_Load;
            ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
            ResumeLayout(false);
        }

        #endregion

        private Button button1;
        private DataGridViewTextBoxColumn Column3;
        private DataGridViewTextBoxColumn Column2;
        private DataGridViewTextBoxColumn Column1;
        private DataGridView dataGridView1;
    }
}

ソースコード

DataGridViewに登録されているデータを、CSV形式のファイルに出力するソースコードです。

using System.Text;
using System.Windows.Forms;

namespace WinFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 列(カラム)数の設定
            dataGridView1.ColumnCount = 3;

            // ヘッダーテキストの設定
            dataGridView1.Columns[0].HeaderText = "カラム1";
            dataGridView1.Columns[1].HeaderText = "カラム2";
            dataGridView1.Columns[2].HeaderText = "カラム3";

            // 行の追加
            dataGridView1.Rows.Add("11", "12", "13");
            dataGridView1.Rows.Add("21", "22", "23");
            dataGridView1.Rows.Add("31", "32", "33");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 出力するCSVファイルのパス
            string csvPath = @"C:\Workspace\output.csv";
            
            // CSVファイルの出力
            ExportDataGridViewToCsv(dataGridView1, csvPath);
        }

        public static void ExportDataGridViewToCsv(DataGridView dataGridView, string filePath)
        {
            // CSVへの出力情報
            StringBuilder csvContent = new();

            // ヘッダーを追加
            for (int i = 0; i < dataGridView.Columns.Count; i++)
            {
                csvContent.Append(dataGridView.Columns[i].HeaderText);
                if (i < dataGridView.Columns.Count - 1)
                {
                    csvContent.Append(',');
                }
            }
            csvContent.AppendLine();

            // 各行のデータを追加
            foreach (DataGridViewRow row in dataGridView.Rows)
            {
                // 新しい行をスキップ
                if (row.IsNewRow) continue;

                for (int i = 0; i < dataGridView.Columns.Count; i++)
                {
                    // セルの値を取得
                    var value = row.Cells[i].Value?.ToString() ?? string.Empty;
                    csvContent.Append(value);
                    if (i < dataGridView.Columns.Count - 1)
                    {
                        csvContent.Append(',');
                    }
                }
                csvContent.AppendLine();
            }
            // CSVファイルに書き込み
            File.WriteAllText(filePath, csvContent.ToString());
        }
    }
}

32行目で出力するCSVファイルを指定します。

38~74行目で、DataGridViewのデータを読み込み、CSVファイルに書き込んでいます。

55行目のforeachでは、ループ回数が1回多いため、新しい行(データが入っていない行)が、CSVファイルに出力されてしまいます。
これを防止するため、58行目にスキップする処理を入れています。

注意事項として、DataGridViewのデータにカンマが含まれる場合は、適切にエスケープする必要があります。
(例えば、値をダブルクォーテーションで囲むなど、、)
でなければ、CSVファイルに出力した時に、カラムの数にズレが発生してしまいます。

こちらをベースにエラー処理やファイルの上書き防止など、色々カスタマイズして頂ければと思います。

実行イメージ

DataGridViewの登録データを出力後のCSVファイルのイメージです。
以下は、DataGridViewです。
ボタンをクリックすることで、CSVへの書き込み処理が実行されます。

以下は、出力されたCSVファイルです。

カラム1,カラム2,カラム3
11,12,13
21,22,23
31,32,33

コメント

タイトルとURLをコピーしました