在WPF中没有GUI的情况下将DataGrid导出为CSV

时间:2018-05-15 10:42:48

标签: c# wpf datagrid

我有一个根据用户使用和不使用GUI运行的应用程序。我需要它将DataGrid导出为CSV文件,继承代码:

this

这适用于GUI。当我没有GUI时会出现问题,我认为这是因为剪贴板无法复制那些不存在的东西。是否有不同的导出方式,或者有没有办法设置剪贴板数据而不是执行复制命令?

2 个答案:

答案 0 :(得分:1)

为了复制那些不存在的内容,您需要使用您的DataGrid' {{{{ 1}}。

如果您的ItemsSource DataGridItemsSource,此方法类似于MosesTheHoly,将返回CSV字符串,但更简单

DataTable

应该这样做。在我看来,相当简洁。现在,只需将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(); } 写入您需要的任何文件。

答案 1 :(得分:0)

好吧,代码可能会缩短,但这就是我这样做的方式。我创建了一个函数,它接收一个数据表并返回一个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;
}