将数据网格导出为 CSV,而无需在 WPF 中使用 GUI



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

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

如果你DataGridItemsSource是一个DataTable,这个类似于摩西圣洁的方法,将返回一个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写入所需的任何文件即可。

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

最新更新