Как экспортировать сетевое представление с мультилинией в одну ячейку в CSV - PullRequest
0 голосов
/ 09 февраля 2019

С кодом ниже, когда я экспортирую свой datagridview в Excel, код будет читать только первую строку в ячейке.Вот мое DTG-изображение и способ его экспорта в CSV-файл .Ниже приведен мой код:

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()));.Согласно фотографии, 2-я линия вперед перейдет в другую камеру.

1 Ответ

0 голосов
/ 09 февраля 2019

Проблема начинается с 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());
...