DataGridViewのデータをCSV出力するサンプルです。
セルにカンマ、ダブルクォーテーションが含まれてる場合、セルの値をダブルクォーテーションで囲って出力します。また、ダブルクォーテーションの場合、文字列中の文字として扱われるように「”」を2文字の「””」に置換して出力するサンプルです。
サンプルの内容
・データがなければメッセージを表示して処理を抜けます。
・CSV出力前に確認メッセージを表示します。「はい」でなければ処理を抜けます。
・列、行ループでぐるぐる回してセルの値を取得します。
・セルにカンマ、ダブルクォーテーションが含まれてる場合、セルの値をダブルクォーテーションで囲って出力します。
・ダブルクォーテーションが含まれてる場合、文字列中の文字として扱われるように「”」を2文字の「””」に置換して出力します。
・CSVファイルはプロジェクト配下のbin\Debug\sample.csvに出力されます。同名ファイルが存在する場合には上書きされます。
使用部品
No | 項目名 | Text | name | 部品 |
1 | 一覧 | 空 | dataGridView1 | DataGridView |
2 | 表示ボタン | 表示 | button1 | Button |
3 | CSV出力ボタン | CSV出力 | button2 | Button |
プログラミング
言語: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 sample
{
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);
// 追加行を除く行数を求める
int maxRowsCount = dataGridView1.Rows.Count;
if (dataGridView1.AllowUserToAddRows)
{
// 追加行が含まれているので、そのカウントを除く
maxRowsCount = maxRowsCount - 1;
}
// データ出力
// 行ループ
for (int iRow = 0; iRow < maxRowsCount; 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)
{
}
private void Form1_Load_1(object sender, EventArgs e)
{
}
}
}
実行結果
CSV出力ボタンをクリックします。
確認メッセージが表示されますので、はいをクリックします。
出力完了メッセージが表示されますので、OKをクリックします。
プロジェクト配下のbin\Debug\sample.csvにCSVファイルが出力されます。
CSVファイルをメモ帳で開きます。
カンマ、ダブルクォーテーションが含まれてる場合、セルの値がダブルクォーテーションで囲って出力されます。また、ダブルクォーテーションの場合、文字列中の文字として扱われるように「”」が2文字で出力されます。
CSVファイルをEXCELで開きます。
CSV出力した内容が表示されます。
以上です。