Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将我的DataGridView导出到csv文件?_C# - Fatal编程技术网

C# 如何将我的DataGridView导出到csv文件?

C# 如何将我的DataGridView导出到csv文件?,c#,C#,我正在尝试使用以下代码将我的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;

我正在尝试使用以下代码将我的
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");
}
private void saveToCsv(DataGridView dGV,字符串文件名)
{
如果(dGV.RowCount>0)
{
DataTable dt=新的DataTable();
dt=dGV.DataSource作为数据表;
int d=dt.Columns.Count;
int c=dt.Rows.Count;
foreach(dt.Columns.Cast().ToArray()中的var列)
{
if(dt.AsEnumerable().All(dr=>dr.IsNull(列)))
d--;
}
字符串stOutput=“”;
DataGridViewRow ds=新DataGridViewRow();
StreamWriter swOut=新的StreamWriter(文件名);
//将标题行写入csv
对于(int i=0;i 0)
{
写出(“,”);
}
Write(dGV.Columns[i].HeaderText);
}
swOut.WriteLine();
//将DataGridView行写入csv
对于(int j=0;j 0)
{
swOut.WriteLine();
}
ds=dGV.行[j];
对于(int i=0;i 0)
{
写出(“,”);
}
stOutput=ds.Cells[i].Value.ToString();
//用空格替换逗号
stOutput=stOutput.Replace(',','');
//用空格替换嵌入的换行符
stOutput=stOutput.Replace(Environment.NewLine,“”);
写(粗体字);
}
}
swOut.Close();
}
MessageBox.Show(“数据成功保存”);
}
但结果是:

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 ,, ,, ,, ,, ,, ,, ,, ,, 0.512,45,测试结果为阴性 0.966,33,测试结果为阴性 0.42,35,测试结果为阴性 0.665,46,测试呈阳性 0.329,29,测试结果为阴性 ,, ,, ,, ,, ,, ,, ,, ,, 空行也会被导出


如何解决此问题?

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

取自stackoverflow(参考)

var sb=new StringBuilder();
var headers=dGV.Columns.Cast();
sb.AppendLine(string.Join(“,”,headers.Select(column=>“\”+column.HeaderText+“\”).ToArray());
foreach(dataGridView1.Rows中的DataGridViewRow行)
{
var cells=row.cells.Cast();
string temp string.Join(“,”,cells.Select(cell=>“\”+cell.Value+“\”).ToArray()
温度=温度替换(“,”,”);
温度=温度替换(“\”,“);
如果(温度长度>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());//

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

取自stackoverflow(参考)

var sb=new StringBuilder();
var headers=dGV.Columns.Cast();
sb.AppendLine(string.Join(“,”,headers.Select(column=>“\”+column.HeaderText+“\”).ToArray());
foreach(dataGridView1.Rows中的DataGridViewRow行)
{
var cells=row.cells.Cast();
string temp string.Join(“,”,cells.Select(cell=>“\”+cell.Value+“\”).ToArray()
温度=温度替换(“,”,”);
温度=温度替换(“\”,“);
如果(温度长度>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());//

如果您想继续使用您的代码,请检查
stOutput
-如果是
,,“
,请不要将其写入文件

您可能需要检查以下问题的答案之一:

在那之后,你必须修复空的换行符

最好的做法是将每一行(或整个表)组装成一个-并在(行或整个表)完全组装好后只将其写入文件一次(或至少按行写入)


StringBuilder是为IT创造性地添加到它们而构建的,应该会使您的代码更快

如果您想继续使用您的代码,请检查
stOutput
-如果是
,,“
,请不要将其写入文件

您可能需要检查以下问题的答案之一:

在那之后,你必须修复空的换行符

最好的做法是将每一行(或整个表)组装成一个-并在(行或整个表)完全组装好后只将其写入文件一次(或至少按行写入)


StringBuilder是为IT创造性地添加到它们而构建的,应该会使您的代码更快

为什么要分别编写逗号和数据呢?您只需迭代,var
data=string.Format(“{0},{1}”,first,second)
如果(dt.Rows[j].IsNull)继续
为什么要分别编写逗号和数据,而您只需迭代,var
data=string.Format(“{0},{1}”,第一,第二)
如果(dt.Rows[j].IsNull)继续他正在替换数据中的任何
。你扫描他的密码了吗?如果您从其他内容复制并粘贴此代码,则应在源代码中添加引号。他正在替换其数据中的任何
。你扫描他的密码了吗?如果您从其他内容复制并粘贴此代码,您应该在源代码中添加一个引号。与其检查
,,,,,,
@mason,不如先不写空行-这就是为什么我用“如果您想坚持使用您的代码”来限定它,并从另一个问题中提供了更好的解决方案。他正在对他的数据执行数据替换,因此在所有这些替换之后,而不是之前,行可能是空的,这就是为什么在他的数据替换操作之前跳过它更困难的原因-并且检查会阻止写入现在的空行。最好不要首先写入空行,而不要检查
,,“
@mason-这就是为什么我用“如果你想坚持你的代码”来限定它,并提供了一个
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()); // 
// ... your code ...

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

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