WPF DataGrid到csv,只导出网格中的可见值

时间:2016-01-10 10:20:44

标签: c# wpf xaml csv datagrid

我对WPF很新,并且想知道是否存在将WPF DataGrid导出到csv文件的可能性。我尝试过使用反射来获取所需的值,虽然这在一定程度上起作用,我想知道是否可以使用附加属性来获取显示的值,这些不一定对应于项目来源。只要我使用静态字符串或字符串的静态资源等,下面附加的属性就可以工作。如果我尝试使用列绑定,我只得到一个默认的string.empty

    public static readonly DependencyProperty ExportStringProperty =
        DependencyProperty.RegisterAttached("ExportString", //name of    attached property
        typeof(string), //type of attached property
        typeof(ExportBehaviour), //type of this owner class
        new PropertyMetadata(string.Empty)); //the default value of the attached property

    public static string GetExportString(DataGridColumn column)
    {
        return (string)column.GetValue(ExportStringProperty);
    }

    public static void SetExportString(DataGridColumn column, string value)
    {
        column.SetValue(ExportStringProperty, value);
    }

是否有类似的方式从xaml获取绑定值:

    <DataGridTextColumn Header="Name" Binding="{Binding (datagridexcel:Product.Name)}" datagridexcel:ExportBehaviour.ExportString="{Binding (datagridexcel:Product.Name)}"/>

如上所述,上面的内容适用于静态类型字符串而不适用于绑定。 必须要说的是,应该避免在这种情况下使用项目源,我唯一感兴趣的是数据网格和那里显示的值。

2 个答案:

答案 0 :(得分:2)

我制作了这个简单的应用,以演示从DataGrid获取CSV的方法。 你有DataGrid

<DataGrid x:Name="MyDataGrid" Grid.Row="0" ItemsSource="{Binding Rows}" />

在此示例中,它绑定到viewmodel中的以下属性:

private IEnumerable<RowViewModel> _rows;
public IEnumerable<RowViewModel> Rows
{
    get { return _rows; }
    set
    {
        _rows = value;
        OnPropertyChanged("Rows");
    }
}

将行设置为以下示例数据:

Rows = new List<RowViewModel>
{
    new RowViewModel { FirstName = "John", LastName = "Doe", DateOfBirth = new DateTime(1988, 12, 19) },
    new RowViewModel { FirstName = "Lara", LastName = "Croft", DateOfBirth = new DateTime(1975, 5, 3) },
    new RowViewModel { FirstName = "Sam", LastName = "Fisher", DateOfBirth = new DateTime(1967, 2, 9) }
};

DataGrid下我有Button

<Button Grid.Row="1" Content="Copy values as CSV" Command="{Binding CopyAsCsvCommand}" CommandParameter="{Binding ElementName=MyDataGrid}" />

它与视图模型中的Command绑定,CommandParameter是整个DataGrid

CopyAsCsvCommand = new DelegateCommand<DataGrid>(CopyAsCsvHandler);

发生实际复制的Command处理程序方法:

private void CopyAsCsvHandler(DataGrid dg)
{
    dg.SelectAllCells();
    dg.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
    ApplicationCommands.Copy.Execute(null, dg);
    dg.UnselectAllCells();
    LivePreviewText = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
}

这相当于用CTRL + A选择所有单元格并按CTRL + C.

实施例

Example image

现在您已拥有CSV内容,只需将其保存为CSV扩展名的文件即可。我希望这会有所帮助,这就是你要找的东西。

答案 1 :(得分:1)

这对我有用。数据网格导出为CSV(WPF)

   private void button_Click(object sender, RoutedEventArgs e)
    {       
        dataGrid1.SelectAllCells();
        dataGrid1.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
        ApplicationCommands.Copy.Execute(null, dataGrid1);
        dataGrid1.UnselectAllCells();
        String result = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
        File.AppendAllText("D:\\test.csv", result, UnicodeEncoding.UTF8);

    }