【问题标题】:How to export datagridview with multiline into one cell in csv如何将带有多行的datagridview导出到csv中的一个单元格中
【发布时间】:2019-02-09 16:00:20
【问题描述】:

使用下面的代码,当我将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 =&gt; "\"" + cell.Value + "\"").ToArray())); 时,image 混乱不堪。根据照片,第 2 行以后将转到另一个单元格。

【问题讨论】:

  • 不知道你所说的混乱是什么意思。 DTG 和 Excel 看起来非常相似。你能详细说明一下吗?
  • hai @kapd 我已经编辑了我的代码。在打印所有行(hibye)但不在它们各自的标题中的意义上混乱。

标签: c# datagridview export-to-csv


【解决方案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());

【讨论】:

  • 嗨@bene_rawr,如上所述,我已将线路更改为sb.AppendLine(string.Join(",", cells.Select(cell =&gt; cell.Value?.ToString().Replace("\r\n", "{BREAK}").Replace("\n", "{BREAK}").ToArray())));。但是现在,这些行反映为System.Char[],而不是实际数据。然后,当我想通过编写 string s = new string(sb); 将 char 转换为字符串时,我得到错误 cannot convert from Text.Stringbuilder to char。而且我不知道该怎么继续。
  • Mh.. 没有完整的代码我不能说那么多。但我用完整的例子更新了答案。
  • @hi bene_rawr。我试过你编辑的代码,但现在数据变成了hi{BREAK}bye。我不希望出现 {BREAK} 这个词。那可能吗?我发布的代码是将DTG导出为CSV的完整代码
  • 如前所述,您将无法创建带有实际换行符的 CSV 文件。因为大多数能够读取 CSV 的程序都使用换行符作为新的元组(行)。因此,您可以删除它并只保留一行,或者替换换行符,当您再次导入它们时,您可以重新替换它们。
  • 海@bene_rawr。好的,现在完全明白它是什么了。最终,我仍然必须使用 CSV。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2017-02-22
相关资源
最近更新 更多