Экспорт DataGrid в CSV без графического интерфейса в WPF - PullRequest
0 голосов
/ 15 мая 2018

У меня есть приложение, которое работает с и без графического интерфейса в зависимости от пользователя.Мне нужно, чтобы экспортировать DataGrid в виде файла CSV, вот код:

// Copy contents of datagrid to clipboard, including header.
mainDataGrid.SelectAllCells();
mainDataGrid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
ApplicationCommands.Copy.Execute(null, mainDataGrid);

string result = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);

Это отлично работает с графическим интерфейсом.Проблема возникает, когда у меня нет GUI, я думаю, это потому, что буфер обмена не может скопировать то, чего нет.Есть ли другой способ его экспортировать или есть способ установить данные буфера обмена вместо выполнения команды копирования?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Чтобы «скопировать что-то, чего нет», вам нужно использовать базовый объект данных, который является DataGrid 'ItemsSource.

Если ваш DataGrid's ItemsSource - это DataTable, этот метод, аналогичный методу MosesTheHoly, вернет строку CSV, но более простым способом.

public string GetCSVFromDataTabe(DataTable datatable)
{
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.Append(string.Join(",", dt.Columns.ToList<DataColumn>().Select(column => column.ColumnName).ToList()) + "\n");
    dataTable.Rows.ToList<DataRow>().ForEach(row => sb.Append(string.Join(",", row.ItemArray) + "\n"));
    return stringBuilder.ToString();
}

Это должно сделать это.Довольно лаконично, на мой взгляд.Теперь просто запишите это string в любой файл, который вам нужен.

0 голосов
/ 16 мая 2018

Хорошо, код может быть сокращен, но я так и сделал. Я создал функцию, которая получает таблицу данных и возвращает строку CSV.

private void SaveToCSV() {
    DataTable dt = new DataTable();
    dt = ((DataView)mainDataGrid.ItemsSource).ToTable();

    string result = WriteDataTable(dt);

    // The File.Create().Close() is so it closes the filestream after it creates it.
    if (!File.Exists(CSVFilePath)) {
        File.Create(CSVFilePath).Close();
    }
    File.AppendAllText(CSVFilePath, result, UnicodeEncoding.UTF8);
}

private string WriteDataTable(DataTable dataTable) {
    string output = "";

    // Need to get the last column so I know when to add a new line instead of comma.
    string lastColumnName = dataTable.Columns[dataTable.Columns.Count - 1].ColumnName;

    // Get the headers from the datatable.
    foreach (DataColumn column in dataTable.Columns) {
        if (lastColumnName != column.ColumnName) {
            output += (column.ColumnName.ToString() + ",");
        }
        else {
            output += (column.ColumnName.ToString() + "\n");
        }
    }
    // Get the actual data from the datatable.
    foreach (DataRow row in dataTable.Rows) {
        foreach (DataColumn column in dataTable.Columns) {
            if (lastColumnName != column.ColumnName) {
                output += (row[column].ToString() + ",");
            }
            else {
                output += (row[column].ToString() + "\n");
            }
        }
    }
    return output;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...