[C#] Silverlight DataGrid: exportation vers Excel ou csv


Answers

J'ai trouvé cela en utilisant le presse-papiers.

Pour rendre le code générique, vous pouvez modifier le premier exemple pour lire les liaisons de colonnes et les appliquer aux données en utilisant la réflexion:

public String ExportDataGrid(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.DataContext as System.Collections.IList);
    if (source == null)
        return "";

    foreach (Object data in source)
    {
        foreach (DataGridColumn col in datagrid.Columns)
        {
            if (col is DataGridBoundColumn)
            {
                binding = (col as DataGridBoundColumn).Binding;
                colPath = binding.Path.Path;
                propInfo = data.GetType().GetProperty(colPath);
                if (propInfo != null)
                {
                    strBuilder.Append(propInfo.GetValue(data, null).ToString());
                    strBuilder.Append(",");
                }                        
            }

        }
        strBuilder.Append("\r\n");
    }


    return strBuilder.ToString();
}

Bien sûr, cela ne fonctionne que lorsque le chemin de la liaison est le nom de la propriété. Pour les chemins plus avancés, vous devez appliquer la liaison aux données (je suppose que ce serait une meilleure solution, mais je ne suis pas sûr maintenant comment faire cela).

Question

Est-il possible d'exporter mes données Silverlight DataGrid vers Excel ou csv?

J'ai cherché sur le web mais je ne trouve aucun exemple!

Merci beaucoup




Vérifiez la solution de Ryan. Ça a l'air bien, je ne peux pas en témoigner parce que je viens de le trouver. Ryan fait ce que DLL a demandé ci-dessus.

http://www.rshelby.com/post/exporting-data-from-silverilght-datagrid-to-excel.aspx

David dans la solution de Dakota ci-dessus semble un peu plus facile à implémenter, et il y a toujours la redirection vers une page classique asp.net avec une grille de données et le type de contenu défini sur Excel, mais vous avez plus de code à supporter peut ne pas fonctionner pour des solutions de navigateur qui sont hors ligne (en fait ne fonctionnera pas).

Quoi qu'il en soit, c'est une tâche commune. J'espère que certaines personnes ici ou chez Microsoft trouveront une solution prête à l'emploi Mort:

J'ai trouvé une méthode d'extension pour l'export CVS à partir d'une grille de données Silverlight

http://www.codeproject.com/KB/silverlight/SilverlightDataGridExport.aspx

Il a le potentiel d'être plug and play, mais j'ai dû le tweek juste un peu pour le faire fonctionner avec des sources de données avec des sources de données (voir les commentaires dans le post). Quelqu'un de plus brillant et plus expérimenté que moi devrait être capable de peaufiner à la perfection. Vérifiez-le, il devrait vous rapprocher de ce dont vous avez besoin.




Je sais que c'est un vieux post mais ça m'a aidé. J'ai fait quelques modifications pour le faire fonctionner avec silverlight 4, convertit et excelle. Je voulais l'exportation rapide donc j'utilise d'abord CSV puis l'ouvre avec Excel. Ce code fonctionne Silverlight Web et OOB confiance élevée. Dans le Web ne s'ouvre pas dans Excel.

     private static void OpenExcelFile(string Path)
    {
        dynamic excelApp;
        excelApp = AutomationFactory.CreateObject("Excel.Application");
        dynamic workbook = excelApp.workbooks;
        object oMissing = Missing.Value;

        workbook = excelApp.Workbooks.Open(Path,

           oMissing, oMissing, oMissing, oMissing, oMissing,

           oMissing, oMissing, oMissing, oMissing, oMissing,

           oMissing, oMissing, oMissing, oMissing);



        dynamic sheet = excelApp.ActiveSheet;


        // open the existing sheet


        sheet.Cells.EntireColumn.AutoFit();
        excelApp.Visible = true;
    }
    private static string FormatCSVField(string data)
    {
        return String.Format("\"{0}\"",
            data.Replace("\"", "\"\"\"")
            .Replace("\n", "")
            .Replace("\r", "")
            );
    }
   public  static string ExportDataGrid(DataGrid grid,string SaveFileName,bool AutoOpen)
    {
        string colPath;
        System.Reflection.PropertyInfo propInfo;
        System.Windows.Data.Binding binding;
        System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
       var source = grid.ItemsSource;

        if (source == null)
            return "";

        List<string> headers = new List<string>();
        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 (var data in source)
        {
                List<string> csvRow = new List<string>();
                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)
                        {
                            string valueConverted = "";
                            if (binding.Converter.GetType().ToString() != "System.Windows.Controls.DataGridValueConverter")
                                valueConverted = binding.Converter.Convert(propInfo.GetValue(data, null), typeof(System.String), binding.ConverterParameter, System.Globalization.CultureInfo.CurrentCulture).ToString();
                            else
                                valueConverted = FormatCSVField(propInfo.GetValue(data, null) == null ? "" : propInfo.GetValue(data, null).ToString());

                            csvRow.Add(valueConverted.ToString());
                        }
                    }
                }
                strBuilder
                    .Append(String.Join(",", csvRow.ToArray()))
                    .Append("\r\n");
            }

        if (AutomationFactory.IsAvailable)
        {
            var sampleFile = "\\" + SaveFileName;
            var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            path += "\\Pement";


            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);
            }
            else
            {
                var files = System.IO.Directory.EnumerateFiles(path);
                foreach (var item in files)
                {
                    try
                    {
                        System.IO.File.Delete(item);
                    }
                    catch { }
                }
            }

            StreamWriter sw = File.CreateText(path + sampleFile);
            sw.WriteLine(strBuilder.ToString());
            sw.Close();

            if (AutoOpen)
                OpenExcelFile(path + sampleFile, true, true);
        }
        else
        {
            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(strBuilder.ToString());
                        writer.Close();
                    }
                    stream.Close();
                }
            } 
        }
        return strBuilder.ToString();
    }