C# DataGridView・CSV出力する

C#サンプルコードプログラミング

概要説明

DataGridViewのデータをCSV出力するサンプルです。

セルにカンマ、ダブルクォーテーションが含まれてる場合、セルの値をダブルクォーテーションで囲って出力します。また、ダブルクォーテーションの場合、文字列中の文字として扱われるように「”」を2文字の「””」に置換して出力するサンプルです。

プログラムでの設定

// <summary>
/// CSV出力処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
    // 出力先
    const string FILE_PATH = @"sample.csv";
    //const string FILE_PATH = @"d:\sample.csv";

    // メッセージ文字列
    string msg = "";

    // データがなければ処理を抜ける
    if (dataGridView1.RowCount <= 0)
    {
        msg = "出力データがありません。";
        MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
    }

    // 確認「はい」でなければ処理を抜ける
    msg = "CSVファイルを出力します。" + "\n" + "宜しいですか?";
    DialogResult result = MessageBox.Show(msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (result != DialogResult.Yes)
    {
        return;
    }

    // Shift-JISの上書きモードでファイルを開く
    using (StreamWriter sw = new StreamWriter(FILE_PATH, false, System.Text.Encoding.Default))
    {
        // ワーク文字列言
        string s = "";

        // ヘッダー出力
        // 行ループ
        for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
        {
            // ヘッダーの値を取得する
            String sCell = dataGridView1.Columns[iCol].HeaderCell.Value.ToString();

            // 2列目以降ならワーク文字列に「,」を追加する
            if (iCol > 0)
            {
                s += ",";
            }

            // ワーク文字列にセルの値を追加する
            s += quoteCommaCheck(sCell);
        }
        // ワーク文字列をファイルに出力する
        sw.WriteLine(s);

        // データ出力
        // 行ループ
        for (int iRow = 0; iRow < dataGridView1.Rows.Count; iRow++)
        {
            // ワーク文字初期化
            s = "";

            // 列ループ
            for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
            {
                // セルの値を取得する
                String sCell = dataGridView1[iCol, iRow].Value.ToString();

                // 2列目以降ならワーク文字列に「,」を追加する
                if (iCol > 0)
                {
                    s += ",";
                }

                // ワーク文字列にセルの値を追加する
                s += quoteCommaCheck(sCell);

            }
            // ワーク文字列をファイルに出力する
            sw.WriteLine(s);
        }
    }
    msg = "CSV出力が完了しました。";
    MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

/// <summary>
/// ダブルクォーテーション、カンマチェック処理
/// </summary>
/// <returns>データ</returns>
private string quoteCommaCheck(string sCell)
{
    const string QUOTE = @""""; // 「"」
    const string COMMA = @",";  // 「,」

    // OR検索用文字列
    string[] a = new string[] { QUOTE, COMMA };

    // セルの値に「”」か「,」が含まれていないか判定する
    if (a.Any(sCell.Contains))
    {
        // 「"」を「"」で囲む
        sCell = sCell.Replace(QUOTE, QUOTE + QUOTE);

        // セルの値を「"」で囲む
        sCell = QUOTE + sCell + QUOTE;
    }
    return sCell;
}

サンプルの内容

・データがなければメッセージを表示して処理を抜けます。

・CSV出力前に確認メッセージを表示します。「はい」でなければ処理を抜けます。

・列、行ループでぐるぐる回してセルの値を取得します。

・セルにカンマ、ダブルクォーテーションが含まれてる場合、セルの値をダブルクォーテーションで囲って出力します。

・ダブルクォーテーションが含まれてる場合、文字列中の文字として扱われるように「”」を2文字の「””」に置換して出力します。

・CSVファイルはプロジェクト配下のbin\Debug\sample.csvに出力されます。同名ファイルが存在する場合には上書きされます。

使用部品

No項目名Textname部品
1一覧dataGridView1DataGridView
表示ボタン表示button1Button
3CSV出力ボタンCSV出力button2Button

プログラミング

言語:C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        /// <summary>
        /// 表示クリック処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            // データを作成する
            DataTable dt = createData();

            // データ行の高さを設定する
            dataGridView1.RowTemplate.Height = 30;

            // データの余白を左上右下5pxに設定する
            //dataGridView1.RowTemplate.DefaultCellStyle.Padding = new Padding(5, 5, 5, 5);

            // データの余白を左上右下5pxに設定する(こちらの設定でもOKです)
            dataGridView1.RowTemplate.DefaultCellStyle.Padding =  new Padding(5);

            // dataGridViewにデータをセットする
            dataGridView1.DataSource = dt;

            // ヘッダーのタイトルを設定する(列名指定)
            dataGridView1.Columns["no"].HeaderText = "No";
            dataGridView1.Columns["title"].HeaderText = "書名";
            dataGridView1.Columns["author_name"].HeaderText = "著者名";
            dataGridView1.Columns["price"].HeaderText = "価格";
            dataGridView1.Columns["publisher"].HeaderText = "出版社名";
            dataGridView1.Columns["publication_date"].HeaderText = "出版年月";
            dataGridView1.Columns["stock"].HeaderText = "在庫";

            // Visualスタイルを使用しない
            dataGridView1.EnableHeadersVisualStyles = false;

            // 列ヘッダの背景色を設定する
            dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Blue;

            // 列ヘッダの文字色を設定する
            dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;

            // 行ヘッダーを非表示にする
            dataGridView1.RowHeadersVisible = false;

            // 列ヘッダーを表示する
            dataGridView1.ColumnHeadersVisible = true;

            // 列ヘッダーの高さを調整不可に設定する
            dataGridView1.ColumnHeadersHeightSizeMode =
                DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

            // 行ヘッダーの幅を調整不可に設定する
            dataGridView1.RowHeadersWidthSizeMode =
                DataGridViewRowHeadersWidthSizeMode.DisableResizing;

            // 列ヘッダーの高さを設定する
            dataGridView1.ColumnHeadersHeight = 30;

            // no の配置を上下左右の中央に設定する
            dataGridView1.Columns["no"].HeaderCell.Style.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // title の配置を上下左右の中央に設定する
            dataGridView1.Columns["title"].HeaderCell.Style.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // author_name の配置を上下左右の中央に設定する
            dataGridView1.Columns["author_name"].HeaderCell.Style.Alignment =
               DataGridViewContentAlignment.MiddleCenter;

            // price の配置を上下左右の中央に設定する
            dataGridView1.Columns["price"].HeaderCell.Style.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // publisher の配置を上下左右の中央に設定する
            dataGridView1.Columns["publisher"].HeaderCell.Style.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // publication_date の上下左右の中央に設定する
            dataGridView1.Columns["publication_date"].HeaderCell.Style.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // stock の配置を上下左右の中央に設定する
            dataGridView1.Columns["stock"].HeaderCell.Style.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // ユーザが行追加を不可に設定する
            dataGridView1.AllowUserToAddRows = false;

            // ユーザが行削除を不可に設定する
            dataGridView1.AllowUserToDeleteRows = false;

            // 複数セルの選択を不可に設定する
            dataGridView1.MultiSelect = false;

            // 行単位に選択モードを設定する
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

            // ユーザが列の幅を変更不可に設定する
            dataGridView1.AllowUserToResizeColumns = true;

            // ユーザが行の高さを変更可に設定する
            dataGridView1.AllowUserToResizeRows = false;

            // セルの入力を不可に設定する
            dataGridView1.ReadOnly = true;

            //  No(no) を右寄せに設定する
            dataGridView1.Columns["no"].DefaultCellStyle.Alignment =
                DataGridViewContentAlignment.MiddleRight;

            // 書名(title) を左寄せに設定する
            dataGridView1.Columns["title"].DefaultCellStyle.Alignment =
                DataGridViewContentAlignment.MiddleLeft;

            // 著者名(author_name)  を左寄せに設定する
            dataGridView1.Columns["author_name"].DefaultCellStyle.Alignment =
               DataGridViewContentAlignment.MiddleLeft;

            // 価格(price) を右寄せに設定する
            dataGridView1.Columns["price"].DefaultCellStyle.Alignment =
                DataGridViewContentAlignment.MiddleRight;

            // 出版社名(publisher) を左寄せに設定する
            dataGridView1.Columns["publisher"].DefaultCellStyle.Alignment =
                DataGridViewContentAlignment.MiddleLeft;

            // 出版年月(publication_date)  を中央に設定する
            dataGridView1.Columns["publication_date"].DefaultCellStyle.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // 在庫(stock)を中央に設定する
            dataGridView1.Columns["stock"].DefaultCellStyle.Alignment =
                DataGridViewContentAlignment.MiddleCenter;

            // 列幅を設定する(列名指定)
            dataGridView1.Columns["no"].Width = 40;
            dataGridView1.Columns["title"].Width = 250;
            dataGridView1.Columns["author_name"].Width = 100;
            dataGridView1.Columns["price"].Width = 70;
            dataGridView1.Columns["publisher"].Width = 150;
            dataGridView1.Columns["publication_date"].Width = 80;
            dataGridView1.Columns["stock"].Width = 50;

            // 選択を解除する
            dataGridView1.ClearSelection();
        }

        /// <summary>
        /// データ(DataTable)作成処理
        /// </summary>
        /// <returns>データ</returns>
        private DataTable createData() {

            // DataTableを宣言する
            DataTable dt = new DataTable();

            // 列を作成する          
            dt.Columns.Add("no", typeof(int));                      // No
            dt.Columns.Add("title", typeof(String));                // 書名
            dt.Columns.Add("author_name", typeof(String));          // 著者名
            dt.Columns.Add("price", typeof(Decimal));               // 価格
            dt.Columns.Add("publisher", typeof(String));            // 出版社名
            dt.Columns.Add("publication_date", typeof(DateTime));   // 出版年月
            dt.Columns.Add("stock", typeof(bool));                  // 在庫

            // データを追加する
            dt.Rows.Add(1, @"がんばれるC#, 入門", "坂本 学"  , 2980, "ABC出版", "2018/01/01", true);
            dt.Rows.Add(2, @"パーフェクト""C#", "高橋 健一", 4200, "海上出版  ", "2019/03/03", false);
            dt.Rows.Add(3, @"学ぶC#", "工藤 太郎", 1600, "電気出版  ", "2020/08/04", true);
            dt.Rows.Add(4, @"初めての""C,#", "渡辺 銀時", 2000, "川上出版  ", "2020/10/06", false);
            dt.Rows.Add(5, @"どんどん学べるC#", "沢田 剛"  , 3200, "心の友出版", "2020/11/11", true);

            // dataGridViewを返す
            return dt;
        }

        // ■ 今回のサンプル --->

        // <summary>
        /// CSV出力処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            // 出力先
            const string FILE_PATH = @"sample.csv";
            //const string FILE_PATH = @"d:\sample.csv";

            // メッセージ文字列
            string msg = "";

            // データがなければ処理を抜ける
            if (dataGridView1.RowCount <= 0)
            {
                msg = "出力データがありません。";
                MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            // 確認「はい」でなければ処理を抜ける
            msg = "CSVファイルを出力します。" + "\n" + "宜しいですか?";
            DialogResult result = MessageBox.Show(msg, "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (result != DialogResult.Yes)
            {
                return;
            }

            // Shift-JISの上書きモードでファイルを開く
            using (StreamWriter sw = new StreamWriter(FILE_PATH, false, System.Text.Encoding.Default))
            {
                // ワーク文字列言
                string s = "";

                // ヘッダー出力
                // 行ループ
                for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
                {
                    // ヘッダーの値を取得する
                    String sCell = dataGridView1.Columns[iCol].HeaderCell.Value.ToString();

                    // 2列目以降ならワーク文字列に「,」を追加する
                    if (iCol > 0)
                    {
                        s += ",";
                    }

                    // ワーク文字列にセルの値を追加する
                    s += quoteCommaCheck(sCell);
                }
                // ワーク文字列をファイルに出力する
                sw.WriteLine(s);

                // データ出力
                // 行ループ
                for (int iRow = 0; iRow < dataGridView1.Rows.Count; iRow++)
                {
                    // ワーク文字初期化
                    s = "";

                    // 列ループ
                    for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
                    {
                        // セルの値を取得する
                        String sCell = dataGridView1[iCol, iRow].Value.ToString();

                        // 2列目以降ならワーク文字列に「,」を追加する
                        if (iCol > 0)
                        {
                            s += ",";
                        }

                        // ワーク文字列にセルの値を追加する
                        s += quoteCommaCheck(sCell);
 
                    }
                    // ワーク文字列をファイルに出力する
                    sw.WriteLine(s);
                }
            }
            msg = "CSV出力が完了しました。";
            MessageBox.Show(msg, "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        /// <summary>
        /// ダブルクォーテーション、カンマチェック処理
        /// </summary>
        /// <returns>データ</returns>
        private string quoteCommaCheck(string sCell)
        {
            const string QUOTE = @""""; // 「"」
            const string COMMA = @",";  // 「,」

            // OR検索用文字列
            string[] a = new string[] { QUOTE, COMMA };

            // セルの値に「”」か「,」が含まれていないか判定する
            if (a.Any(sCell.Contains))
            {
                // 「"」を「"」で囲む
                sCell = sCell.Replace(QUOTE, QUOTE + QUOTE);

                // セルの値を「"」で囲む
                sCell = QUOTE + sCell + QUOTE;
            }
            return sCell;
        }
        // ■ <--- 今回のサンプル

        private void Form1_Load(object sender, EventArgs e)
        {
        }
    }
}

実行結果

CSV出力ボタンをクリックします。

確認メッセージが表示されますので、はいをクリックします。

出力完了メッセージが表示されますので、OKをクリックします。

プロジェクト配下のbin\Debug\sample.csvにCSVファイルが出力されます。

CSVファイルをメモ帳で開きます。

カンマ、ダブルクォーテーションが含まれてる場合、セルの値がダブルクォーテーションで囲って出力されます。また、ダブルクォーテーションの場合、文字列中の文字として扱われるように「”」が2文字で出力されます。

CSVファイルをEXCELで開きます。

CSV出力した内容が表示されます。

以上です。

コメント

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