public static string ExportDataGrid(this DataGrid grid, bool withHeaders) { string colPath; System.Reflection.PropertyInfo propInfo; System.Windows.Data.Binding binding; System.Text.StringBuilder strBuilder = new System.Text.StringBuilder(); System.Collections.IList source = (grid.ItemsSource as System.Collections.IList); if (source == null) return ""; List<string> headers = new List<string>(); grid.Columns.ToList().ForEach(col => { if (col is DataGridBoundColumn) { headers.Add(FormatCSVField(col.Header.ToString())); } }); strBuilder .Append(String.Join("", headers.ToArray())) .Append("\t\n"); foreach (Object data in source) { List<string> csvRow = new List<string>(); foreach (DataGridColumn col in grid.Columns) { if (col is DataGridBoundColumn) { binding = (col as DataGridBoundColumn).Binding; colPath = binding.Path.Path; string[] pathlist = colPath.Split('.');//此处往下做了修改 object currentData = data; int count = 0; foreach (string item in pathlist) { propInfo = currentData.GetType().GetProperty(item); if (propInfo == null) break; count++; if (count == pathlist.Count()) { csvRow.Add(FormatCSVField(propInfo.GetValue(currentData, null).GetTrimString())); break; } else { currentData = propInfo.GetValue(currentData, null); } } } } strBuilder .Append(String.Join("", csvRow.ToArray())) .Append("\t\n"); } return strBuilder.ToString(); } private static string FormatCSVField(string data) { //return String.Format("\"{0}\"", data.Replace("\"", "\"\"\"").Replace("\n", "").Replace("\r", "")); return String.Format("\t{0}", data.Replace("\"", "\t\n")); }
使用示范:
void btnExcelExport_Click(object sender, RoutedEventArgs e) { string data = gridOrderList.ExportDataGrid(true);//调用函数 byte[] tmp; tmp = Encoding.Unicode.GetBytes(data); SaveFileDialog sfd = new SaveFileDialog() { DefaultExt = "csv", Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*", FilterIndex = 1 }; if (sfd.ShowDialog() == true) { using (System.IO.Stream stream = sfd.OpenFile()) { using (System.IO.StreamWriter writer = new System.IO.StreamWriter(stream, Encoding.Unicode, 30)) { writer.Write(data); writer.Close(); } stream.Close(); } } }