由于权限问题,此方法智能在OOB模式时使用
由于DataGrid的功能限制,要导出全部数据需要将DataGrid放在ScrollViewer中,同时不设置DataGrid高度,即DataGrid中显示全部数据行
适用于任何数据源
泛型方法,可扩展为导出DataGrid/Grid等
可自由修改,修改后请Email给我一份: azjcdy@163.com
请保留作者信息
不多说,上代码
导出方法:
/// <summary>
/// By: Yixuan 导出到Excel.需要将DataGrid放在ScrollViewer中,同时不设置DataGrid高度,即DataGrid中显示全部数据行
/// </summary>
/// <typeparam name="T">源控件类型</typeparam>
/// <param name="custome">源控件名称(目前支持DataGrid和Grid)</param>
public static void LaunchExcel<T>(T custome)
{
excel = AutomationFactory.CreateObject("Excel.Application");
((dynamic)excel).Visible = true;
dynamic Excelbooks = ((dynamic)excel).workbooks;
Excelbooks.Add();
dynamic ExcelSheet = ((dynamic)excel).ActiveSheet;
dynamic ExcelCell = null;
if (custome.GetType().Name == "DataGrid")
{
int row = 0;
DataGrid datagrid = custome as DataGrid;
foreach (var p in datagrid.ItemsSource)
{
int column = 0;
for (column = 0; column < datagrid.Columns.Count; column++)
{
ExcelCell = ExcelSheet.Cells[row + 1, column + 1];
if (row == 0)
{
ExcelCell.Value = datagrid.Columns[column].Header.ToString();
}
else
{
var dgcell = datagrid.Columns[column].GetCellContent(p) as TextBlock;
ExcelCell.Value = dgcell.Text;
}
}
row++;
}
}
else if (custome.GetType().Name == "Grid")
{
//Grid支持TextBlock 和 TextBox ,未详细测试,会有问题,等待你发挥才智 ^_^
Grid grid2 = custome as Grid;
foreach (UIElement element in grid2.Children)
{
int row;
int column;
if (element.GetType().Name == "TextBlock")
{
TextBlock block = element as TextBlock;
row = Grid.GetRow(block);
column = Grid.GetColumn(block);
ExcelCell = ExcelSheet.Cells[row + 1, column + 1];
ExcelCell.Value = block.Text;
}
else if (element.GetType().Name == "TextBox")
{
TextBox box = element as TextBox;
row = Grid.GetRow(box);
column = Grid.GetColumn(box);
ExcelCell = ExcelSheet.Cells[row + 1, column + 1];
ExcelCell.Value = box.Text;
}
}
}
excel = null;
}
调用方法:
ExcelClass.LaunchExcel<DataGrid>(DataGrid实例);
xmal:
<ScrollViewer Grid.Column="1" Grid.Row="1">
<sdk:DataGrid