使用下面的代码,当我将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感到困惑。根据照片,第二行向前将转到另一个单元格。
答案 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());