Экспорт WPF DataGrid в текстовый файл в привлекательном формате. Текстовый файл должен быть легким для чтения

Есть ли простой способ экспортировать WPF DataGrid в текстовый файл и файл.csv? Я провел некоторый поиск и не вижу, что для этого есть простой метод DataGrid. Я получил что-то работающее (едва), используя ItemsSource DataGrid. В моем случае это массив структур. Я делаю что-то с StreamWriters и StringBuilders (подробности доступны) и в основном:

StringBuilder destination = new StringBuilder();
destination.Append(row.CreationDate);
destination.Append(seperator);  // seperator is '\t' or ',' for csv file
destination.Append(row.ProcId);
destination.Append(seperator);
destination.Append(row.PartNumber);
destination.Append(seperator);

Я делаю это для каждой структуры в массиве (в цикле). Это отлично работает. Проблема в том, что текстовый файл читать нелегко. Данные могут быть разной длины в одном и том же столбце. Я хотел бы видеть что-то вроде: 2007-03-03 234238423823 823829923 2007-03-03 66 99 И, конечно, я получаю что-то вроде: 2007-03-03 234238423823 823829923 2007-03-03 66 99

Неудивительно, что я использую разделители табуляции, но надеюсь добиться большего. Это, конечно, легко прочитать в DataGrid! Конечно, я мог бы иметь некоторую логику для заполнения коротких значений пробелами, но это выглядит довольно грязно. Я думал, что может быть лучше. У меня также есть ощущение, что это общая проблема, которая, вероятно, была решена раньше (возможно, в самих классах.NET).

Благодарю.

2 ответа

Решение

Я предполагаю, что цель состоит в том, чтобы быть как можно более WYSIWYG. В этом случае я бы:

  1. Переберите все DataGridRow и создайте для каждого строку [], содержащую данные, отображаемые в каждом DataGridCell. Это легко для большинства типов DataGridColumn. Для DataGridTemplateColumn вам нужно использовать Binding, а затем преобразовать.ToString().
  2. Также я бы отслеживал максимальную длину строки в каждом столбце.

Следующий шаг зависит от типа экспорта:

  • Для экспорта в CSV я добавил бы все строки в каждой строке [] внутри кавычек с запятыми между ними и выписал их.
  • Для экспорта в виде простого текста я бы добавил все строки в каждой строке [], дополненные пробелами, до 1+ максимальной длины строки для этого столбца и выписал их.

Причина использования реальных объектов DataGridRow, DataGridCell и DataGridColumn заключается в том, чтобы записать именно то, что видит конечный пользователь. Например, вы можете пропускать скрытые столбцы, применять строковые форматы в связывании, фильтровать / группировать / сортировать и т. Д.

Я хотел бы использовать функциональность Application.Copy в сетке, выбрать все, затем скопировать в код, а затем вы можете проанализировать вспомогательные данные буфера обмена в формате CSV, HTML и некоторых других форматах.

Другие вопросы по тегам