梅花西飞博客

WPF导出MasterDetail及所属子级详情至Excel

利用PrintHelper将WPF中的MasterDetail及所属子级详情导出至Excel。

TableView

WPF的DataGrid导出Excel到指定文件夹很简单,直接利用如下代码即可实现功能。

using System.Diagnostics;
using System.Windows;
using DevExpress.Mvvm;
using DevExpress.Mvvm.UI;
using DevExpress.Xpf.Core;
using DevExpress.Xpf.Grid;  

SaveFileDialogService saveFileDialogService = new SaveFileDialogService()
{
    DefaultExt = "xls",
    Filter = "Excel 2007+|*.xls",
    DefaultFileName = "You_Want_Excel_Name"
};
if (saveFileDialogService.ShowDialog())
{
    var fileName = saveFileDialogService.GetFullFileName();
    (MasterDetailDemo.View as TableView).ExportToXls(fileName);
    if (DXMessageBox.Show("是否打开导出文件?", "系统提示", 
                         MessageBoxButton.OKCancel, MessageBoxImage.Information)
                         == MessageBoxResult.OK)
        Process.Start(fileName);
}

只需要将上面代码中的DefaultFileName替换成你想要的Excel文件名,其中MasterDetailDemoTableViewName属性值。

PrintHelper

上面代码已经实现了最常见的DataGrid导出到Excel,但有些时候我们需要将MasterDetail及所属子级详情导出至Excel,这时候可能就需要用到PrintHelper,这时候只需引用DevExpress.Xpf.Printing,然后需要为TableView添加PrintAllDetails属性,并将上述代码更改成如下:

using DevExpress.Xpf.Printing

if (saveFileDialogService.ShowDialog())
{
    var fileName = saveFileDialogService.GetFullFileName();
    var tableView = ((TableView)MaterielPurchaseGrid.View); 
    tableView.PrintAutoWidth = false; 
    PrintHelper.ExportToXlsx(tableView, fileName,
                            new XlsxExportOptions() {
                              ShowGridLines = true
                            }); 
    if (DXMessageBox.Show("是否打开导出文件?", "系统提示",
                         MessageBoxButton.OKCancel, MessageBoxImage.Information) == MessageBoxResult.OK)
        Process.Start(fileName);
}

 

其中的PrintAutoWidth控制最终输出至Excel中列的是否自适应,Demo中用到的TableView如下:

 <dxg:TableView Name="MasterDetailDemo" PrintAllDetails="True"></dxg:GridControl.View>