wpf 視窗程式下將datagrid匯出為excel
阿新 • • 發佈:2019-02-19
/// <summary>
/// CSV格式化
/// </summary>
/// <param name="data">資料</param>
/// <returns>格式化資料</returns>
private static string FormatCsvField(string data) {
return String.Format("\"{0}\"", data.Replace("\"", "\"\"\"").Replace("\n", "").Replace("\r", ""));
}
/// <summary>
/// 匯出DataGrid資料到Excel
/// </summary>
/// <param name="withHeaders">是否需要表頭</param>
/// <param name="grid">DataGrid</param>
/// <param name="dataBind"></param>
/// <returns>Excel內容字串</returns>
public static string ExportDataGrid(bool withHeaders, System.Windows.Controls.DataGrid grid, bool dataBind) {
try {
var strBuilder = new System.Text.StringBuilder();
var source = (grid.ItemsSource as System.Collections.IList);
if (source == null)
return "";
var headers = new List < string > ();
List < string > bt = new List < string > ();
foreach(var hr in grid.Columns) {
// DataGridTextColumn textcol = hr. as DataGridTextColumn;
headers.Add(hr.Header.ToString());
if (hr is DataGridTextColumn) //列繫結資料
{
DataGridTextColumn textcol = hr as DataGridTextColumn;
if (textcol != null)
bt.Add((textcol.Binding as Binding).Path.Path.ToString()); //獲取繫結源
} else if (hr is DataGridTemplateColumn) {
if (hr.Header.Equals("操作"))
bt.Add("Id");
} else {}
}
strBuilder.Append(String.Join(",", headers.ToArray())).Append("\r\n");
foreach(var data in source) {
var csvRow = new List < string > ();
foreach(var ab in bt) {
string s = ReflectionUtil.GetProperty(data, ab).ToString();
if (s != null) {
csvRow.Add(FormatCsvField(s));
} else {
csvRow.Add("\t");
}
}
strBuilder.Append(String.Join(",", csvRow.ToArray())).Append("\r\n");
// strBuilder.Append(String.Join(",", csvRow.ToArray())).Append("\t");
}
return strBuilder.ToString();
} catch (Exception ex) {
LogHelper.Error(ex);
return "";
}
}
/// <summary>
/// 匯出DataGrid資料到Excel為CVS檔案
/// 使用utf8編碼 中文是亂碼 改用Unicode編碼
///
/// </summary>
/// <param name="withHeaders">是否帶列頭</param>
/// <param name="grid">DataGrid</param>
public static void ExportDataGridSaveAs(bool withHeaders, System.Windows.Controls.DataGrid grid) {
try {
string data = ExportDataGrid(true, grid, true);
var sfd = new Microsoft.Win32.SaveFileDialog{
DefaultExt = "csv",
Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*",
FilterIndex = 1
};
if (sfd.ShowDialog() == true) {
using(Stream stream = sfd.OpenFile()) {
using(var writer = new StreamWriter(stream, System.Text.Encoding.Unicode)) {
data = data.Replace(",", "\t");
writer.Write(data);
writer.Close();
}
stream.Close();
}
}
MessageBox.Show("匯出成功!");
} catch (Exception ex) {
LogHelper.Error(ex);
}
}
public class ReflectionUtil{
public static object GetProperty(object obj, string propertyName) {
PropertyInfo info = obj.GetType().GetProperty(propertyName);
if (info == null && propertyName.Split('.').Count() > 0) {
object o = ReflectionUtil.GetProperty(obj, propertyName.Split('.')[0]);
int index = propertyName.IndexOf('.');
string end = propertyName.Substring(index + 1, propertyName.Length - index - 1);
return ReflectionUtil.GetProperty(o, end);
}
object result = null;
try {
result = info.GetValue(obj, null);
} catch (TargetException) {
return "";
}
return result == null ? "" : result;
}
}