[英]C# Exporting DataGridView to CSV file
从下面的图片中可以看到,将其转换为有效的csv文件时遇到了一些麻烦。 我快到了,但我想不起来我需要的最后一点。 我需要将列标题带入文本框,并且还需要删除每行末尾的“,”。 顺便说一句,我正在转换顶级DGV。
这是我的代码-
private void btnSave_Click(object sender, EventArgs e)
{
int countRow = dgvCsv1.RowCount;
int cellCount = dgvCsv1.Rows[0].Cells.Count;
for (int rowIndex = 0; rowIndex <= countRow -1; rowIndex++)
{
for (int cellIndex = 0; cellIndex <= cellCount - 1; cellIndex++)
{
textBoxExport.Text = textBoxExport.Text + dgvCsv1.Rows[rowIndex].Cells[cellIndex].Value.ToString() + ",";
}
textBoxExport.Text = textBoxExport.Text + "\r\n";
}
System.IO.File.WriteAllText(lblFilePath.Text, textBoxExport.Text);
}
任何帮助,不胜感激。
这已经在这里解决了 。 LINQ解决方案完全可以满足您的需求。
var sb = new StringBuilder();
var headers = dgvCsv1.Columns.Cast<DataGridViewColumn>();
sb.AppendLine(string.Join(",", headers.Select(column => "\"" + column.HeaderText + "\"").ToArray()));
foreach (DataGridViewRow row in dgvCsv1.Rows)
{
var cells = row.Cells.Cast<DataGridViewCell>();
sb.AppendLine(string.Join(",", cells.Select(cell => "\"" + cell.Value + "\"").ToArray()));
}
因此,最终代码如下所示:
private void btnSave_Click(object sender, EventArgs e)
{
var sb = new StringBuilder();
var headers = dgvCsv1.Columns.Cast<DataGridViewColumn>();
sb.AppendLine(string.Join(",", headers.Select(column => "\"" + column.HeaderText + "\"").ToArray()));
foreach (DataGridViewRow row in dgvCsv1.Rows)
{
var cells = row.Cells.Cast<DataGridViewCell>();
sb.AppendLine(string.Join(",", cells.Select(cell => "\"" + cell.Value + "\"").ToArray()));
}
textBoxExport.Text = sb.ToString();
System.IO.File.WriteAllText(lblFilePath.Text, textBoxExport.Text);
}
您已经具有ColumnCount,
的列数ColumnCount,
因此,在遍历各列时,需要进行简单的检查以查看currentColumn
是否“小于” ColumnCount
-1。 如果currentColumn
小于ColumnCount
-1,那么你需要添加“逗号” ,
。 如果currentColumn
不小于ColumnCount
,那么这仅意味着一件事……这是最后一列,您无需添加逗号就可以添加新行。
if (currentCol < ColumnCount - 1) {
textBoxExport.Text += ",";
}
else {
textBoxExport.Text += Environment.NewLine;
}
这需要与遍历行分开。 在遍历行之前,遍历网格的列并获取每个列的Name
属性。 这将是CSV文件中的第一行。 您可以使用与上述相同的策略来避免最后一个逗号。
for (int currentCol = 0; currentCol < ColumnCount; currentCol++) {
textBoxExport.Text += dgvCsv1.Columns[currentCol].Name;
if (currentCol < ColumnCount - 1) {
textBoxExport.Text += ",";
}
else {
textBoxExport.Text += Environment.NewLine;
}
}
最后,不清楚为什么要使用TextBox
存储CSV字符串。 我建议使用StringBuilder.
以下是上述内容的示例。
private void btnSave_Click(object sender, EventArgs e) {
StringBuilder sb = new StringBuilder();
int RowCount = dgvCsv1.RowCount;
int ColumnCount = dgvCsv1.ColumnCount;
// get column headers
for (int currentCol = 0; currentCol < ColumnCount; currentCol++) {
sb.Append(dgvCsv1.Columns[currentCol].Name);
if (currentCol < ColumnCount - 1) {
sb.Append(",");
}
else {
sb.AppendLine();
}
}
// get the rows data
for (int currentRow = 0; currentRow < RowCount; currentRow++) {
if (!dgvCsv1.Rows[currentRow].IsNewRow) {
for (int currentCol = 0; currentCol < ColumnCount; currentCol++) {
if (dgvCsv1.Rows[currentRow].Cells[currentCol].Value != null) {
sb.Append(dgvCsv1.Rows[currentRow].Cells[currentCol].Value.ToString());
}
if (currentCol < ColumnCount - 1) {
sb.Append(",");
}
else {
sb.AppendLine();
}
}
}
}
textBoxExport.Text = sb.ToString();
System.IO.File.WriteAllText(@"D:\Test\DGV_CSV_EXPORT.csv", sb.ToString());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.