/// <summary>
///导出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void btnExcel_Click(object sender, RoutedEventArgs e)
{
string data = ExportDataGrid(true, modelList);//modelList 绑定控件名称
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();
}
}
}
public string ExportDataGrid(bool withHeaders, DataGrid grid)
{
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 string FormatCSVField(string data)
{
//return String.Format("/"{0}/"", data.Replace("/"", "/"/"/"").Replace("/n", "").Replace("/r", ""));
return String.Format("/t{0}", data.Replace("/"", "/t/n"));
}