簡體   English   中英

C#將DataGridView導出到CSV文件

[英]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);
    }
  1. 刪除最后一個定界符(逗號)

您已經具有ColumnCount,的列數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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM