【问题标题】:Exporting DataGrid to CSV without a GUI in WPF在 WPF 中不使用 GUI 将 DataGrid 导出为 CSV
【发布时间】:2018-10-25 04:04:18
【问题描述】:

根据用户的不同,我有一个可以使用和不使用 GUI 运行的应用程序。我需要它将 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。当我没有 GUI 时会出现问题,我认为这是因为剪贴板无法复制不存在的内容。有没有其他方法可以导出它,或者有没有一种方法可以设置剪贴板数据而不是执行复制命令?

【问题讨论】:

  • Clipboard 类有一些SetDataSetDataObject 方法可能会有所帮助。 msdn Clipboard doc
  • @MikeHjortChristensen 我试过了,我使用 SetData 将它作为字符串“System.Windows.Controls.DataGrid Items.Count:196”返回给我,而 SetDataObject 则返回 null
  • 您是否尝试过使用 DataGridView 代替? Link
  • 我决定循环遍历所有列和行并用逗号分隔它会更容易

标签: c# wpf datagrid


【解决方案1】:

为了“复制不存在的东西”,您需要使用底层数据对象,即您的 DataGridItemsSource

如果您的DataGridItemsSourceDataTable,则此方法类似于 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 写入您需要的任何文件即可。

【讨论】:

  • 总有一天我能写出这么简洁的代码
  • 谢谢。我相信这不会花很长时间。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多