【问题标题】:C# Exporting DataGridView to CSV fileC# 将 DataGridView 导出为 CSV 文件
【发布时间】:2019-04-18 17:27:03
【问题描述】:

从我附在下面的图片中可以看出,我在将其转换为有效的 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);
    }

非常感谢任何帮助。

【问题讨论】:

  • 如果您有一个字符串集合,您可以使用string.Join() 在字符串之间放置逗号(因此一种解决方案是将每一行构建为List&lt;string&gt; 然后Join 它们。另一个方法是创建一个布尔值(比如var firstItem=true;),然后将逗号放在除第一个之外的每个项目之前。
  • 对 cellIndex
  • 使用 CSV 需要担心的一件事是包含逗号的字段数据。一些解析器将忽略嵌入在引号中的字符串中的逗号。您可能会考虑将所有字符串放在双引号内,或者测试一个字段是否包含逗号,如果是,则将其括在引号中。这取决于文件使用者设置的规则。
  • 我建议阅读这里的问题以获得更好的选择。 stackoverflow.com/questions/1941392/… 正如 FlyDog 所说,如果您的任何表格中有逗号/引号,则可能会导致您出现问题。如果用户没有更改您的列,您可以遍历所有行并格式化每个新行 var newLine = string.Format("{0},{1},{2},{3}", dgvCsv1.Rows [0],dgvCsv1.Rows[1],dgvCsv1.Rows[2],dgvCsv1.Rows[3]);

标签: c# winforms csv datagridview export-to-csv


【解决方案1】:
  1. 删除最后一个分隔符(逗号)

您已经有了ColumnCount, 的列数,因此,在遍历列时,需要简单检查currentColumn 是否“小于”ColumnCount -1。如果currentColumn 小于ColumnCount -1,则需要添加“逗号”,。如果currentColumn 不是“小于”ColumnCount,那么这可能只意味着一件事……这是最后一列,而不是添加逗号,而是要添加新行。

if (currentCol < ColumnCount - 1) {
  textBoxExport.Text += ",";
}
else {
  textBoxExport.Text += Environment.NewLine;
}
  1. CSV 文件中的列标题

这需要与循环遍历行分开。在遍历行之前,遍历网格的列并获取每一列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());
}

【讨论】:

    【解决方案2】:

    这已经解决了here。 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);
        }
    

    【讨论】:

    • 这不是答案。指向另一个答案的链接只是指向答案所在位置的地图或指针,并且应该是评论。见Your answer is in another castle
    • 好的,我添加了相关代码。 sb.ToString() 的结果将是所需的 CSV。
    猜你喜欢
    • 2016-06-07
    • 2012-04-14
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多