C#プログラムでDataGridViewのデータをCSVに保存する方法

このQ&Aのポイント
  • C#プログラムでDataGridViewのデータをCSVに保存する方法について教えてください。
  • データグリッドビューにあるデータすべてをCSVに保存するには、配列などにデータを格納する必要があります。
  • SaveFileDialogを使用してファイルの保存先を指定し、StreamWriterを使用してCSVファイルにデータを書き込めます。
回答を見る
  • ベストアンサー

C# プログラム

今,下記のようなプログラムを組んでdatagridviewのデータをcsvに保存するようにしようとしているのですが,1つのデータであれば保存が出来たのですが,今行いたいのはdatagridviewにあるデータすべてをcsvに保存したいのです.おそらく配列か何かに入れないといけないんだとは思うのですが, どなたかご教授頂けないでしょうか? private void button2_Click(object sender, EventArgs e) { //データテーブル設定 int R, C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; string wdata = string.Empty; string tmpdata = string.Empty; //string Ter =Convert.ToString(R); //string Tec = Convert.ToString(C); //textBox1.Text = Ter; //textBox2.Text = Tec; //SaveFileDialogクラスのインスタンスを作成 //SaveFileDialog sfd = new SaveFileDialog(); //ダイアログを表示する //if (sfd.ShowDialog() == DialogResult.OK) //c = dataGridView1[Rdata, Gdata].Value.ToString(); // 以下を変更 string c = Convert.ToString(dataGridView1.Rows[0].Cells[0].Value); // 以下ファイル書き込みと保存 string strName = "xxx.csv"; // 仮のファイル名 string strPath = "c:/csv/"; // 仮のディレクトリ名 SaveFileDialog sfd = new SaveFileDialog(); sfd.InitialDirectory = strPath; sfd.FileName = strName; sfd.Filter = "CSVファイル(*.csv)|*.csv"; sfd.Title = "保存先を指定してください"; sfd.RestoreDirectory = true; sfd.CheckFileExists = false; if (sfd.ShowDialog() == DialogResult.OK) { // ファイルを指定してインスタンス作成 System.IO.StreamWriter sw = new System.IO.StreamWriter(sfd.FileName); try { // ファイル書き込み sw.Write(c); } catch { // エラー処理(これだとダメだけどとりあえず) MessageBox.Show("ファイル書き込みエラー", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // 解放 sw.Dispose(); sfd.Dispose(); } }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

どこかで見たコメントがと思ったら私のコメントでした(笑) //ここでしかデータを取ってないので、ここをコメントアウト //string c = Convert.ToString(dataGridView1.Rows[0].Cells[0].Value); // 行のループ for(R=0; R<dataGridView1.Rows.Count; R++){  for(C=0; C<dataGridView1.Columns.Count; C++){    if(C==0){     // カラム、行の順に位置を指定     c = Convert.ToString(dataGridView1[C, R].Value);    }    else{     // カラム、行の順に位置を指定     c += "," + Convert.ToString(dataGridView1[C, R].Value);    }  }   // 一行の終わりに改行コードを付ける   c += "\n"   // ファイルに一行書き込む   sw.Write(c); } という感じです。 sw.Writeの部分(tryの中)に上のループを組み込めば行けます。

Ashgin
質問者

お礼

shincha119さん ありがとうございました. おかげさまで,思い通りに処理が出来ました. 本当にありがとうございました.

関連するQ&A

  • C#でのcsv保存

    今,下記のようなプログラムを組んでいます.ですが,うまくdataGridviewのデータが保存されません.何がいけないのでしょうか?だれかご教授よろしくお願いいたします. int R,C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; string[] cdata = new string[R]; //string Ter =Convert.ToString(R); //string Tec = Convert.ToString(C); //textBox1.Text = Ter; //textBox2.Text = Tec; for (int Gdata = 1; Gdata < R; Gdata++) { string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value); cdata[Gdata] = c; //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv"; //if (saveFileDialog1.ShowDialog() == DialogResult.OK) //{ // int cdata = Convert.ToInt16(c); // cdata.saveNewCSVdata(saveFileDialog1.FileName); //} } //SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); //ダイアログを表示する if (sfd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき //選択された名前で新しいファイルを作成し、 //読み書きアクセス許可でそのファイルを開く //既存のファイルが選択されたときはデータが消える恐れあり System.IO.Stream stream; stream = sfd.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream); sw.Write(cdata); //閉じる sw.Close(); stream.Close(); } }

  • C# datagridview csv 読込

    datagridviewにcsvファイルを読み込んでいるのですが,csvファイル内の行列数分のみ列数・行数をdatagridviewに生成したいのですが,どうも必要以上の列数・行数を生成してしまいます. 下記にそのプログラムを記載いたします. どなたか,必要分のみするにはどうすればよろしいかご教授願えないでしょうか? private void button1_Click(object sender, EventArgs e) { string strName = "xxx.csv"; // 仮のファイル名 string strPath = "c:/csv/"; // 仮のディレクトリ名 OpenFileDialog sfd = new OpenFileDialog(); sfd.InitialDirectory = strPath; sfd.FileName = strName; sfd.Filter = "CSVファイル(*.csv)|*.csv|xlsファイル(*.xls)|*.xls|xlsxファイル(*.xlsx)|*.xlsx|テキスト(*.txt)|*.txt"; sfd.Title = "開くファイルを選択してください"; sfd.RestoreDirectory = true; sfd.CheckFileExists = false; if (sfd.ShowDialog() == DialogResult.OK) { // CSVファイルオープン System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName); // CSVファイルの各セルをDataGridViewに表示 int r = 0; String lin = ""; do { lin = sw.ReadLine(); if (lin != null) { dataGridView1.Columns.Add("clmName1", "日付"); this.dataGridView1.Columns.Add("Time","データ"); this.dataGridView1.Rows.Add(); String[] csv = lin.Split(','); for (int c = 0; c <= csv.GetLength(0) - 1; c++) { if (c < this.dataGridView1.Columns.Count) { this.dataGridView1.Rows[r].Cells[c].Value = csv[c]; } } r += 1; } } while (lin != null); // CSVファイルクローズ sw.Close(); }

  • C# datagridview

    いくつかこまごまとしたものをまとめてご質問させて頂きますが, 1)csvファイルを読込,ある処理を行おうとすると 「列の FillWeight 値の合計が 65535 を超えることはできません。」 というエラーが出て処理が出来ません.このエラーの解消法を教えて頂けないでしょうか? 2)画像のように読み込んだヘッダー部分が文字化けしてしまいます. こちらの解消法をご教授頂けないでしょうか? 3)csvのすべてのデータをdatagridviewに表示させたいのですが,2列分しか表示されません. 下記に2)とも関連したプログラムを記載いたします.どなたかご教授願えないでしょうか? string strName = "xxx.csv"; // 仮のファイル名 string strPath = "c:/csv/"; // 仮のディレクトリ名 OpenFileDialog sfd = new OpenFileDialog(); sfd.InitialDirectory = strPath; sfd.FileName = strName; sfd.Filter = "CSVファイル(*.csv)|*.csv|xlsファイル(*.xls)|*.xls|xlsxファイル(*.xlsx)|*.xlsx|テキスト(*.txt)|*.txt"; sfd.Title = "開くファイルを選択してください"; sfd.RestoreDirectory = true; sfd.CheckFileExists = false; if (sfd.ShowDialog() == DialogResult.OK) { // CSVファイルオープン System.IO.StreamReader sw = new System.IO.StreamReader(sfd.FileName); // CSVファイルの各セルをDataGridViewに表示 int r = 0; String lin = ""; do { lin = sw.ReadLine(); if (lin != null) { if (r == 0) { dataGridView1.Columns.Add("clmName1", "日付"); this.dataGridView1.Columns.Add("Time", "データ"); } this.dataGridView1.Rows.Add(); String[] csv = lin.Split(','); for (int c = 0; c <= csv.GetLength(0) - 1; c++) { if (c < this.dataGridView1.Columns.Count) { this.dataGridView1.Rows[r].Cells[c].Value = csv[c]; } } r += 1; } } while (lin != null); // CSVファイルクローズ sw.Close(); tabControl1.SelectedIndex = 1; }

  • CSVファイルへの保存の際、データが途中で切れてしまいます。

    はじめまして。初心者になりますが、よろしくお願いします。 visual basic 2008を使って、研究で数値シミュレーションを組んでいるのですが、 その値をcsv形式で出力した際に、値の終わりの方が消えてしまう現象が出てしまいます。 具体的には、(出力データ数,xの値,zの値)という形でファイルに書き込んでいくのですが、 出力データ数を1001個にした際、保存したファイルをExcelやメモ帳で開くと、 最後が、(991,0.111540025,0.2)といった形となってしまい。値の数が合わないのです。 他にも出力データ数の値を変えて試してみましたが、 出力データ数が101個の際には、実際保存されたのは97個 出力データ数が2001個の際には、実際保存されたのは1998個 出力データ数が5001個の際には、実際保存されたのは4988個 となります。 いずれも、途中は完全に保存されていて、最後の部分のみ保存されていない(途中で切られている)といった状況です。 デバッグで切られている部分も値が存在していることは確認できていますので、 おそらく保存する際の間違いだと思うのですが、原因がわかりません。 すみませんが、ご指導をお願いします。 (以下、保存のためのプログラムを記します) Private Sub RK_ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Rk_ToolStripMenuItem.Click 'ルンゲクッタデータを保存するためのモジュール Dim myStream As Stream Dim saveFileDialog1 As New SaveFileDialog() Dim s As String = "" If save_flag = False Then MsgBox("Error!!" & vbLf & "データがありません。") Else saveFileDialog1.Filter = "csv files (*.csv)|*.csv|txt files (*.txt)|*.txt|All files (*.*)|*.*" saveFileDialog1.DefaultExt = "csv" saveFileDialog1.FilterIndex = 1 saveFileDialog1.RestoreDirectory = True saveFileDialog1.OverwritePrompt = True If saveFileDialog1.ShowDialog() = DialogResult.OK Then myStream = saveFileDialog1.OpenFile() Dim sw As StreamWriter = New streamWriter(myStream) If (myStream IsNot Nothing) Then For i As Integer = 0 To n s = t_temp(i).ToString & "," & x_temp(i).ToString & "," & z_temp(i).ToString sw.WriteLine(s) Next i myStream.Close() MsgBox("ファイルへの書き込みが終了しました") End If End If End If End Sub

  • C#におけるstringとstring[]データの変換

    お世話になります。C#をはじめて使っています。 いま行おうとしているのがコモンダイアログからファイル名を取得して、CSVファイルを読み出そうとしています。 OpenFileDialogから出力されるファイル名はstring[]と配列になり(すいません、C#でも”配列”といっていいのですよね?) CSVを開くためのTextFieldParserの引数はstringになります。Cならポインタで変換できるのですが、C#はポインタがないため、いくつか試しましたが、うまく変換でききませんでした。 たとえば string a; string[] b: で  a=b; a=(string)b; a=convert.tostring b; 全部だめでした、どなたかご存知の方お見えになれば教えていただけると助かります。

  • C# ファイル名を指定してオープン

    StreamWriter swrite = new StreamWriter("C:\\19yamana.csv",false, System.Text.Encoding.GetEncoding("shift-jis")); のファイル名"C:\\19yamana.csv"の部分を変数にしたいのですがうまく出来ません。 やったこと: string fileName = "C:\\19yamana.csv"; StreamWriter swrite = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("shift-jis"));

  • 保存しても全く表示されない;;

    保存しても全く表示されない;; 任意に選択したファイルに出力保存したいのですが全く出力されません;; 以下は保存先を選択するボタンの中身です。 private void button7_Click(object sender, EventArgs e) { SaveFileDialog od = new SaveFileDialog(); od.Filter = "テキストファイル(*.txt) | *.txt"; if (od.ShowDialog() == DialogResult.OK) { cl_filename = od.FileName; textBox8.Text = cl_filename; } } このようにして保存先を選択して 別ボタンで StreamWriter sw = new StreamWriter(cl_filename, false, System.Text.Encoding.GetEncoding("shift_jis")); と宣言しています。保存先のところには先ほどのcl_filenameを指定しています。 なお、cl_filenameはグローバルに宣言してあります。 そしてこのボタン内で // Write the data to a file // 分析情報をファイルに書く stbuf = "データ数:" + kosu_i.ToString(); sw.WriteLine(stbuf); stbuf = ""; stbuf = "次元数:" + zigen_i.ToString(); sw.WriteLine(stbuf); stbuf = ""; stbuf = "クラスター数:" + cl_i.ToString(); sw.WriteLine(stbuf); stbuf = ""; stbuf = "初期分割:"; sw.WriteLine(stbuf); stbuf = ""; としているのですが全く表示されません。。;; 上手く行くはずなのですが・・;; 分かる方お願い致します;;

  • C# datagridview データバインド系

    datagridviewのデータバインドについて教えてください. 今,下記のプログラム(一部)を組んで処理を行おうとしていますがうまくいかないため 何が悪いのか教えて頂けないでしょうか? 今datagridviewをデータテーブルにバインドしています. for (j = t; j < R - 1; j++) { object Ti = this.dataGridView1.Rows[j].Cells[0].Value; object Tibf = this.dataGridView1.Rows[j + 1].Cells[0].Value; string TiS = Convert.ToString(Ti); string TiSbf = Convert.ToString(Tibf); # region // シリアル値化 long serial = DateTime.Parse(TiS).ToBinary(); long serialbf = DateTime.Parse(TiSbf).ToBinary(); long parsesum = serial + Oneparse; if (serialbf != parsesum) { dataGridView1.Rows.Insert(j + 1, 1); // シリアル値から復元 DateTime dtm = DateTime.FromBinary(parsesum); string s = Convert.ToString(dtm); // 指定した書式で日付を文字列に変換する string stPrompt1 = dtm.ToString("yyyy/M/d H:mm"); this.dataGridView1.Rows[j + 1].Cells[0].Value = stPrompt1; } } 簡単に言うと,行を追加したいのですが,forの前でデータソースをnullにすると object Ti = this.dataGridView1.Rows[j].Cells[0].Value;でエラー if (serialbf != parsesum)の後にすると dataGridView1.Rows.Insert(j + 1, 1);でエラー が起こります.どちらの場合も下記のエラーが出ます. インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 パラメーター名: index 本当に困っています. よろしくお願いいたします.

  • 【C#】作成したファイルに書き込みしたい

    開発環境はMicrosoft VisualC#2008です。 C#初心者です。よろしくお願いします。 現在、Form1とUserControl1を組み合わせてパズルゲームを作成中です。 Form1でボタンをクリックすると、クリックした日時を取得して、その日時をファイル名とするテキストファイルを作成することは出来ました。(例:20100115154717.txt) 今度は、そのファイルをUserControl1で開いて、書き込みをしていきたいのですが、エラーが出てしまい、この作成したファイルに書き込むことが出来ない状況です。 ※ちなみに、別のファイル(log_sample.txt)を指定したら書き込みは出来ました。 アドバイスよろしくお願いします。 <Form1.cs>一部抜粋 public string File_name { get { return this.file_name; } set { this.file_name = value; } } private void select_button_Click(object sender, EventArgs e) { //開いた時刻をファイル名に指定 DateTime dt = DateTime.Now; file_name = dt.ToString("yyyyMMddHHmmss"); //ログファイル作成・データ追加 StreamWriter sw = new StreamWriter(new FileStream"C:\\Documents and Settings\\My Documents\\log\\" + file_name + ".txt", FileMode.CreateNew)); } <UserControl1.cs>一部抜粋 //候補選択 private void label1_Click(object sender, EventArgs e) { Form1 f1 = this.Controls["Form1"] as Form1; DateTime dt = DateTime.Now; //ログ書き込み(日付、場所(ユーザーコントロール、ラベル名)、クリック(1)orダブルクリック(2)) StreamWriter sw = new StreamWriter(new FileStream("C:\\Documents and Settings\\My Documents\\log\\"+ f1.File_name +".txt", FileMode.Append)); sw.Write(dt.ToString()+","); sw.Write(this.Name +","); sw.Write("label1,"); sw.WriteLine("1"); sw.Close(); }

  • C#でエクセルのシートを追加し末尾に移動したい

    C#でエクセルのシートを追加し、末尾に移動したいのですが Sheet1/Sheet2/Sheet3/Sheet4/ の順にならず Sheet1/Sheet2/Sheet4/Sheet3/ になってしまいます、どこが間違っているのでしょうか? すみませんが教えていただけないでしょうか? Excel.Application ExcelApp = new Excel.Application(); ExcelApp.Visible = false; Workbook wb = ExcelApp.Workbooks.Add(); Worksheet ws = wb.Worksheets.Add(); ws.Select(Type.Missing); ws.Cells[1, 1] = "aaa"; //末尾に移動する int totalSheets = wb.Sheets.Count; ws.Move(wb.Worksheets[totalSheets]); //saveダイアログを表示する SaveFileDialog sfd = new SaveFileDialog(); sfd.FileName = ""; sfd.Filter = "EXCELファイル(;*.xlsx)|*.xlsx|すべてのファイル(*.*)|*.*"; sfd.FilterIndex = 1; sfd.Title = "保存先のファイルを選択してください"; sfd.RestoreDirectory = true; //OKなら保存する if (sfd.ShowDialog() == DialogResult.OK) { Console.WriteLine(sfd.FileName); wb.SaveAs(sfd.FileName); } //エクセルを閉じる sfd.Dispose(); wb.Close(Type.Missing, Type.Missing, Type.Missing); ExcelApp.Quit();

専門家に質問してみよう