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)继续
为什么要分别编写逗号和数据,而您只需迭代,vardata=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 ...