我有一个根据用户使用和不使用GUI运行的应用程序。我需要它将DataGrid导出为CSV文件,继承代码:
this
这适用于GUI。当我没有GUI时会出现问题,我认为这是因为剪贴板无法复制那些不存在的东西。是否有不同的导出方式,或者有没有办法设置剪贴板数据而不是执行复制命令?
答案 0 :(得分:1)
为了复制那些不存在的内容,您需要使用您的DataGrid
' {{{{ 1}}。
如果您的ItemsSource
DataGrid
是ItemsSource
,此方法类似于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;
}