Silverlight DataGrid: Export to excel or csv

后端 未结 9 2217
野趣味
野趣味 2020-12-13 10:17

Is there a way I can export my Silverlight DataGrid data to excel or csv?

I searched the web but can\'t find any examples!

Thanks a lot

9条回答
  •  生来不讨喜
    2020-12-13 10:49

    Silverlight 3 changes the answer to this question because it gives the ability of the user to create a file on the user's desktop in a location that they specify. I adapted the code submitted by DaniCE, split things into a few methods for readability and am using a loosely defined CSV format that Excel should recognize.

    private void exportHistoryButton_Click(object sender, RoutedEventArgs e) 
    {
        string data = ExportDataGrid(true, historyDataGrid);
        SaveFileDialog sfd = new SaveFileDialog()
        {
        DefaultExt = "csv",
        Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*",
        FilterIndex = 1
        };
        if (sfd.ShowDialog() == true)
        {
        using (Stream stream = sfd.OpenFile())
        {
            using (StreamWriter writer = new StreamWriter(stream)) {
            writer.Write(data);
            writer.Close();
            }
            stream.Close();
        }
        }
    }
    
    private string FormatCSVField(string data) {
        return String.Format("\"{0}\"",
            data.Replace("\"", "\"\"\"")
            .Replace("\n", "")
            .Replace("\r", "")
            );
    }
    
    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 headers = new List();
        grid.Columns.ToList().ForEach(col => {
        if (col is DataGridBoundColumn){
            headers.Add(FormatCSVField(col.Header.ToString()));
        }
        });
        strBuilder
        .Append(String.Join(",", headers.ToArray()))
        .Append("\r\n");
    
        foreach (Object data in source)
        {
        List csvRow = new List();
        foreach (DataGridColumn col in grid.Columns)
        {
            if (col is DataGridBoundColumn)
            {
            binding = (col as DataGridBoundColumn).Binding;
            colPath = binding.Path.Path;
            propInfo = data.GetType().GetProperty(colPath);
            if (propInfo != null)
            {
                csvRow.Add(FormatCSVField(propInfo.GetValue(data, null).ToString()));
            }
            }
        }
        strBuilder
            .Append(String.Join(",", csvRow.ToArray()))
            .Append("\r\n");
        }
    
    
        return strBuilder.ToString();
    }
    

提交回复
热议问题