Dev Express WPF GridControl 数据导出到Excel

Dev Express WPF 给控件提供了公共的导出方法:

以导出数据到Excel表格为例:

导出模式分为两种类型: Data-Aware Export 和 WYSIWYG Export

其中 WYSIWYG Export 模式支持导出结果保持GridControl设置的 PrintStyle,但在Excel中显示有写问题,同时性能也稍差一些,可能这是Dev 升级导出引擎的部分原因吧。

Data-Aware Export 模型导出数据则不支持PrintStyle,如果需要设置表格数据的展示样式,可以实现 CustomizeCell 事件;

测试代码:

<Window x:Class="GridExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
        xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
        xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
        xmlns:local="clr-namespace:GridExample" 
        Width="600" Height="350"
        >
    
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/GridExample;component/Themes/PrintCellStylesWPF.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>        
    </Window.Resources>

    <Grid VerticalAlignment="Top">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        
        <dxg:GridControl Name="grid" AutoGenerateColumns="AddNew">
            <dxg:GridControl.Columns>
                
                <dxg:GridColumn FieldName="PlainText"/>
                
                <dxg:GridColumn FieldName="MemoText" 
                                PrintCellStyle="{StaticResource MemoColumnPrintingStyle}"
                                >
                    <dxg:GridColumn.EditSettings>
                        <dxe:MemoEditSettings/>
                    </dxg:GridColumn.EditSettings>
                </dxg:GridColumn>

                <dxg:GridColumn FieldName="BooleanMember"
                                PrintCellStyle="{StaticResource CheckEditColumnPrintingStyle}"
                                > 
                    <dxg:GridColumn.EditSettings>
                        <dxe:CheckEditSettings/>
                    </dxg:GridColumn.EditSettings>
                </dxg:GridColumn>

                <dxg:GridColumn FieldName="Image"
                                PrintCellStyle="{StaticResource ImageColumnPrintingStyle}"
                                >
                    <dxg:GridColumn.EditSettings>
                        <dxe:PopupImageEditSettings/>
                    </dxg:GridColumn.EditSettings>
                </dxg:GridColumn>

            </dxg:GridControl.Columns>
            
            <dxg:GridControl.View>
                <dxg:TableView Name="view" PrintColumnHeaderStyle="{StaticResource HeaderStyle}"/>
            </dxg:GridControl.View>         
        </dxg:GridControl>
        
        <Button Grid.Row="1" Width="150" Name="PrintButton" Click="PrintButton_Click" Content="Show print preview"/>
    </Grid>
</Window>
View Code

 

// Developer Express Code Central Example:
// How to use the PrintCellStyle property to customize cell's printing appearance
// 
// This example shows how to create custom PrintCellStyle for grid columns to bring
// a custom printing appearance for PopupImageEdit, CheckBoxEdit and MemoEdit.
// 
// You can find sample updates and versions for different programming languages here:
// http://www.devexpress.com/example=E3227

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Collections.Generic;
using System.Windows.Resources;
using System.IO;
using System.Drawing;
using System.Windows.Data;
using DevExpress.XtraPrinting;
using DevExpress.Export;

namespace GridExample {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();

            Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e) {
            grid.ItemsSource = new List<TestData>() {
                new TestData() { PlainText = "LMA AG", MemoText = "Mercedes-Benz SLK \n 2004 \n Silver", BooleanMember = true, Image = GetImage("/Images/1.png") },
                new TestData() { PlainText = "Western Motors", MemoText ="Rolls-Royce Corniche \n 1975 \n Snowy whight", BooleanMember = false, Image = GetImage("/Images/2.png") },
                new TestData() { PlainText = "Sun car rent", MemoText = "Ford Ranger FX-4\n 1999 \n Red rock", BooleanMember = true, Image = GetImage("/Images/3.png") }
            };
        }

        ImageSource GetImage(string path) {
            return new BitmapImage(new Uri(path, UriKind.Relative));
        }

        private void PrintButton_Click(object sender, RoutedEventArgs e) {
            //view.ExportToCsv(@"C:\Users\lenovo\Desktop\testExport\aa.csv");
            view.ExportToXlsx(@"C:\Users\lenovo\Desktop\testExport\aa.xlsx", new XlsxExportOptionsEx 
            { ExportType = ExportType.WYSIWYG
            });
            XlsxExportOptionsEx options = new XlsxExportOptionsEx();
            options.CustomizeCell += Options_CustomizeCell;
            view.ExportToXlsx(@"C:\Users\lenovo\Desktop\testExport\aa11.xlsx", options);
            view.ShowPrintPreview(this);
        }

        private void Options_CustomizeCell(CustomizeCellEventArgs e)
        {
            if(e.AreaType == SheetAreaType.Header)
            {
                e.Formatting.Font = new DevExpress.Export.XlCellFont { Name= "微软雅黑", Bold = true, Size = 20 };
                e.Formatting.BackColor = System.Drawing.Color.Pink;
                e.Handled = true;
            }
        }
    }
}
View Code

PrintStyle 设置

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
                    xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
                    xmlns:dxp="http://schemas.devexpress.com/winfx/2008/xaml/printing"
                    xmlns:dxgt="clr-namespace:DevExpress.Xpf.Grid.Themes;assembly=DevExpress.Xpf.Grid.v20.1"
                    >
    <Style x:Key="HeaderStyle"  
       TargetType="{x:Type dxe:TextEdit}"  
       BasedOn="{StaticResource {dxgt:TableViewThemeKey ResourceKey=DefaultPrintCellStyle}}">
        <Setter Property="dxp:ExportSettings.TargetType" Value="Text" />
        <Setter Property="FontSize" Value="11pt" />
        <Setter Property="FontFamily" Value="Calibri" />
        <Setter Property="Background" Value="#177477" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="FontWeight" Value="Bold" />
    </Style>
    
    <Style x:Key="ImageColumnPrintingStyle" 
           TargetType="{x:Type dxe:PopupImageEdit}"
           BasedOn="{StaticResource {dxgt:TableViewThemeKey ResourceKey=DefaultPrintCellStyle}}">
        <Setter Property="dxp:ExportSettings.TargetType" Value="Panel" />
        <Setter Property="DisplayTemplate">
            <Setter.Value>
                <ControlTemplate TargetType="dxe:PopupImageEdit">

                    <dxe:ImageEdit Source="{Binding Path=Value}"
                                    IsPrintingMode="True" 
                                    Margin="4" 
                                    HorizontalAlignment="Center" 
                                    VerticalAlignment="Center"       
                                    />

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <dx:BoolToObjectConverter x:Key="BoolToTextConverter" TrueValue="Avaliable" FalseValue="NotAvaliable" />

    <Style x:Key="CheckEditColumnPrintingStyle" 
           TargetType="dxe:CheckEdit"
           BasedOn="{StaticResource {dxgt:TableViewThemeKey ResourceKey=DefaultPrintCellStyle}}">
        <Style.Setters>
            <Setter Property="dxp:ExportSettings.TargetType" Value="Panel" />
            <Setter Property="DisplayTemplate">
                <Setter.Value>
                    <ControlTemplate TargetType="dxe:CheckEdit">
                        <dxe:TextEdit Text="{Binding Path=Value, Converter={StaticResource BoolToTextConverter}}" HorizontalAlignment="Center" Margin="4"
                                          />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>

    <Style x:Key="MemoColumnPrintingStyle" 
           TargetType="dxe:MemoEdit"
           BasedOn="{StaticResource {dxgt:TableViewThemeKey ResourceKey=DefaultPrintCellStyle}}">
        <Style.Setters>
            <Setter Property="dxp:ExportSettings.TargetType" Value="Panel" />
            <Setter Property="DisplayTemplate">
                <Setter.Value>
                    <ControlTemplate TargetType="dxe:MemoEdit">
                        <dxe:TextEdit Text="{Binding Value}"
                                          TextWrapping="Wrap"
                                          IsPrintingMode="True"
                                          Margin="4"
                                          VerticalContentAlignment="Center"
                                          HorizontalContentAlignment="Left"
                                          />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>
</ResourceDictionary>
View Code

 

    public class TestData {
        public string PlainText { get; set; }
        public string MemoText { get; set; }
        public bool BooleanMember { get; set; }
        public ImageSource Image { get; set; }
    }
View Code

 

Demo

 

posted on 2020-10-28 17:41  积跬步---行千里  阅读(444)  评论(0编辑  收藏  举报