【问题标题】:How to export my DataGridView to a csv file?如何将我的 DataGridView 导出到 csv 文件?
【发布时间】:2018-08-02 12:22:54
【问题描述】:

我正在尝试使用以下代码将我的 DataGridView 导出到 csv 文件:

private void saveToCsv(DataGridView dGV, string filename)
{
    if (dGV.RowCount > 0)
    {
        DataTable dt = new DataTable();
        dt = dGV.DataSource as DataTable;
        int d = dt.Columns.Count;
        int c = dt.Rows.Count;
        foreach (var column in dt.Columns.Cast<DataColumn>().ToArray())
        {
            if (dt.AsEnumerable().All(dr => dr.IsNull(column)))
                d--;
        }
        string stOutput = "";
        DataGridViewRow ds = new DataGridViewRow();
        StreamWriter swOut = new StreamWriter(filename);

        //write header rows to csv
        for (int i = 0; i <= d - 1; i++)
        {
            if (i > 0)
            {
                swOut.Write(",");
            }
            swOut.Write(dGV.Columns[i].HeaderText);
        }

        swOut.WriteLine();

        //write DataGridView rows to csv
        for (int j = 0; j <= c - 1; j++)
        {
            if (dt.Rows[j].IsNull)
            if (j > 0)
            {
                swOut.WriteLine();
            }

            ds = dGV.Rows[j];

            for (int i = 0; i <= d - 1; i++)
            {
                if (i > 0)
                {
                    swOut.Write(",");
                }

                stOutput = ds.Cells[i].Value.ToString();
                //replace comma's with spaces
                stOutput = stOutput.Replace(',', ' ');
                //replace embedded newlines with spaces
                stOutput = stOutput.Replace(Environment.NewLine, " ");

                swOut.Write(stOutput);
            }
        }
        swOut.Close();
    }
    MessageBox.Show("Data successfully saved");
}

但输出是这样的:

0.512,45,tested_negative 0.966,33,tested_negative 0.42,35,tested_negative 0.665,46,tested_positive 0.329,29,tested_negative ,, ,, ,, ,, ,, ,, ,, ,,

空行也被导出。

我该如何解决这个问题?

【问题讨论】:

  • 为什么要单独写逗号和数据,你只是迭代和 var data= string.Format("{0},{1}", first, second);
  • if (dt.Rows[j].IsNull) continue;

标签: c#


【解决方案1】:

首先,如果您要创建逗号分隔文件,您应该限定您的文本数据以防它们包含逗号

取自stackoverflow(参考Exporting datagridview to csv file

var sb = new StringBuilder();

var headers = dGV.Columns.Cast<DataGridViewColumn>();
sb.AppendLine(string.Join(",", headers.Select(column => "\"" + column.HeaderText + "\"").ToArray()));

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    var cells = row.Cells.Cast<DataGridViewCell>();

    string temp string.Join(",", cells.Select(cell => "\"" + cell.Value + "\"").ToArray())
    temp = temp.Replace(",","");
    temp = temp.Replace("\"","");
    if(temp.Length > 0)
    {
      sb.AppendLine(string.Join(",", cells.Select(cell => "\"" + cell.Value + "\"").ToArray()));
    }
}
System.IO.StreamWriter file = new System.IO.StreamWriter(@"c:\test\hereIam.csv");
file.WriteLine(sb.ToString()); // 

【讨论】:

  • 他正在替换他数据中的任何,。你扫描他的代码了吗?如果您从其他内容复制并粘贴此代码,则应在源代码中添加引用。
【解决方案2】:

如果您想坚持使用您的代码,请检查 stOutput - 如果是 ',,',请不要将其写入文件中。

您可能想查看https://stackoverflow.com/a/4959869/7505395 - c# datatable to csv 的答案之一

// ... your code ...

if ( stOutput != ",,")
    swOut.Write(stOutput); 
else suppressNewLine = true;  // suppress newline above, and reset bool to false

// ... more of your code ...

之后您必须修复空的换行符。

最好的办法是将每一行(或整个表 gasp)组合成一个 StringBuilder - 并且只在文件中写入一次(或至少逐行) (线或整个表)完全组装。

StringBuilders 是 build 用于迭代地添加它们并且应该使您的代码更快。

【讨论】:

  • 最好不要先写空行而不是检查',,'
  • @mason - 这就是为什么我用 “如果你想坚持你的代码” 来限定它,并从另一个问题中提供了一个更好的解决方案。他正在对他的数据执行数据替换,因此在所有这些替换之后,该行可能是空的,而不是之前,这就是为什么在他的数据替换操作之前跳过它更加困难 - 并且检查防止现在空的行被写入.
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2019-04-18
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2018-10-03
  • 2016-06-07
相关资源
最近更新 更多