找了好多都有問題,這個可以分享給到家 轉自:https://www.cnblogs.com/kmust/p/4412228.html ...
1 private void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 4 ExportDataGridSaveAs(true, this.data); 5 } 6 #region wpf客戶端 導出DataGrid數據到Excel 7 8 /// <summary> 9 /// CSV格式化 10 /// </summary> 11 /// <param name="data">數據</param> 12 /// <returns>格式化數據</returns> 13 private static string FormatCsvField(string data) 14 { 15 return String.Format("\"{0}\"", data.Replace("\"", "\"\"\"").Replace("\n", "").Replace("\r", "")); 16 } 17 18 19 20 /// <summary> 21 /// 導出DataGrid數據到Excel 22 /// </summary> 23 /// <param name="withHeaders">是否需要表頭</param> 24 /// <param name="grid">DataGrid</param> 25 /// <param name="dataBind"></param> 26 /// <returns>Excel內容字元串</returns> 27 public static string ExportDataGrid(bool withHeaders, System.Windows.Controls.DataGrid grid, bool dataBind) 28 { 29 try 30 { 31 var strBuilder = new System.Text.StringBuilder(); 32 var source = (grid.ItemsSource as System.Collections.IList); 33 if (source == null) return ""; 34 var headers = new List<string>(); 35 List<string> bt = new List<string>(); 36 37 foreach (var hr in grid.Columns) 38 { 39 // DataGridTextColumn textcol = hr. as DataGridTextColumn; 40 headers.Add(hr.Header.ToString()); 41 if (hr is DataGridTextColumn)//列綁定數據 42 { 43 DataGridTextColumn textcol = hr as DataGridTextColumn; 44 if (textcol != null) 45 bt.Add((textcol.Binding as Binding).Path.Path.ToString()); //獲取綁定源 46 47 } 48 else if (hr is DataGridTemplateColumn) 49 { 50 if (hr.Header.Equals("操作")) 51 bt.Add("Id"); 52 } 53 else 54 { 55 56 } 57 } 58 strBuilder.Append(String.Join(",", headers.ToArray())).Append("\r\n"); 59 foreach (var data in source) 60 { 61 var csvRow = new List<string>(); 62 foreach (var ab in bt) 63 { 64 string s = ReflectionUtil.GetProperty(data, ab).ToString(); 65 if (s != null) 66 { 67 csvRow.Add(FormatCsvField(s)); 68 } 69 else 70 { 71 csvRow.Add("\t"); 72 } 73 } 74 strBuilder.Append(String.Join(",", csvRow.ToArray())).Append("\r\n"); 75 // strBuilder.Append(String.Join(",", csvRow.ToArray())).Append("\t"); 76 } 77 return strBuilder.ToString(); 78 } 79 catch (Exception ex) 80 { 81 // LogHelper.Error(ex); 82 return ""; 83 } 84 } 85 public class ReflectionUtil 86 { 87 public static object GetProperty(object obj, string propertyName) 88 { 89 PropertyInfo info = obj.GetType().GetProperty(propertyName); 90 if (info == null && propertyName.Split('.').Count() > 0) 91 { 92 object o = ReflectionUtil.GetProperty(obj, propertyName.Split('.')[0]); 93 int index = propertyName.IndexOf('.'); 94 string end = propertyName.Substring(index + 1, propertyName.Length - index - 1); 95 return ReflectionUtil.GetProperty(o, end); 96 } 97 object result = null; 98 try 99 { 100 result = info.GetValue(obj, null); 101 } 102 catch (TargetException) 103 { 104 return ""; 105 } 106 return result == null ? "" : result; 107 } 108 } 109 /// <summary> 110 /// 導出DataGrid數據到Excel為CVS文件 111 /// 使用utf8編碼 中文是亂碼 改用Unicode編碼 112 /// 113 /// </summary> 114 /// <param name="withHeaders">是否帶列頭</param> 115 /// <param name="grid">DataGrid</param> 116 public static void ExportDataGridSaveAs(bool withHeaders, System.Windows.Controls.DataGrid grid) 117 { 118 try 119 { 120 string data = ExportDataGrid(true, grid, true); 121 var sfd = new Microsoft.Win32.SaveFileDialog 122 { 123 DefaultExt = "csv", 124 Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*", 125 FilterIndex = 1 126 }; 127 if (sfd.ShowDialog() == true) 128 { 129 using (Stream stream = sfd.OpenFile()) 130 { 131 using (var writer = new StreamWriter(stream, System.Text.Encoding.Unicode)) 132 { 133 data = data.Replace(",", "\t"); 134 writer.Write(data); 135 writer.Close(); 136 } 137 stream.Close(); 138 } 139 } 140 MessageBox.Show("導出成功!"); 141 } 142 catch (Exception ex) 143 { 144 // LogHelper.Error(ex); 145 } 146 } 147 148 #endregion 導出DataGrid數據到Excel 149 150
找了好多都有問題,這個可以分享給到家
轉自:https://www.cnblogs.com/kmust/p/4412228.html