如何将具有多行的datagridview导出到csv中的一个单元格

时间:2019-02-09 16:00:21

标签: c# datagridview export-to-csv

使用下面的代码,当我将datagridview导出到excel时,代码将只读取单元格的第一行。这是我的DTG image,以及它如何导出到CSV file。下面是我的代码:

var sb = new StringBuilder();
var headers = dataGridView1.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>();
   sb.AppendLine(string.Join(",", cells.Select(cell => "\"" + cell.Value + "\"").ToArray()));
 }

  string filepath = @"C:\Data.csv"; ;
  File.WriteAllText(filepath, sb.ToString());

当我将,更改为;|作为单元格值时,它打印了所有行,但数据在不同的单元格中混杂了。希望得到帮助,谢谢。

已编辑:当我将代码行更改为sb.AppendLine(string.Join(";", cells.Select(cell => "\"" + cell.Value + "\"").ToArray()));时,对此image感到困惑。根据照片,第二行向前将转到另一个单元格。

1 个答案:

答案 0 :(得分:1)

问题始于StringBuilder,结束于File.WriteAllText

StringBuilder解释所有换行符,并用\r\n替换它们,然后File.WriteAllText做完全相同的事情。 解释所有换行符,并将它们作为“实际”换行符添加到文件中。

您试图将每个值放在两个常见的"之间,但是没有规则要求每个程序都必须以这种方式解释它。因此,对于值的换行或逗号,CSV文件并不真正支持,因为大多数编辑器都将换行视为新行,将逗号视为新列。

因此,最好的方法是删除它们或用一个自定义字符串替换它们,使用此文件的每个人都知道该字符串,然后可以将其替换。

所以那是这样做的一种选择:

cell.Value?.ToString().Replace("\r\n", "{BREAK}").Replace("\n", "{BREAK}")

编辑1:

var sb = new StringBuilder();
var headers = dataGridView1.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>();
    sb.AppendLine(string.Join(",", cells.Select(cell => cell.Value?.ToString().Replace("\r\n", "{BREAK}").Replace("\n", "{BREAK}")).ToArray()));
}

string filepath = "data.csv"; ;
File.WriteAllText(filepath, sb.ToString());