C # Экспорт DataGridView в файл CSV - PullRequest
0 голосов
/ 15 ноября 2018

Как вы можете видеть из рисунков, которые я прикрепил ниже, у меня возникли проблемы с преобразованием этого файла в действительный файл CSV. Я почти на месте, но не могу понять, какой последний бит мне нужен. Мне нужно перенести заголовки столбцов в текстовое поле, а также удалить «,» в конце каждой строки. Кстати, я конвертирую топ DGV.

enter image description here

enter image description here

вот мой код -

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);
    }

Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018
  1. Удалить последний разделитель (запятую)

У вас уже есть количество столбцов ColumnCount,, поэтому при циклическом просмотре столбцов необходима простая проверка, чтобы определить, является ли currentColumn «меньше» ColumnCount -1.Если currentColumn меньше ColumnCount -1, то вам нужно добавить «запятую» ,.Если currentColumn НЕ «меньше» ColumnCount, то это может означать только одно: это последний столбец, и вместо добавления запятой вы хотите добавить новую строку.

if (currentCol < ColumnCount - 1) {
  textBoxExport.Text += ",";
}
else {
  textBoxExport.Text += Environment.NewLine;
}
Заголовки столбцов в 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());
}
0 голосов
/ 15 ноября 2018

Это уже решено здесь . Решение 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);
    }
...