[c#] Silverlight DataGrid: exportation vers Excel ou CSV



3 Answers

J'ai trouvé this utilisant le presse-papier.

Pour rendre le code générique, vous pouvez modifier le premier exemple pour lire les liaisons de colonne 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 entendu, cela ne fonctionne que lorsque le chemin de la liaison est le nom de la propriété. Pour des 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 de savoir comment procéder).

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







Je sais que c'est un ancien message mais ça m'a aidé. J'ai fait quelques modifications pour que cela fonctionne avec Silverlight 4, convertit et excelle. Je voulais l'export rapide donc j'utilise d'abord CSV puis l'ouvre avec Excel. Ce code fonctionne silverlight web et oob elevated trust. Dans le Web ne s'ouvrira 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();
    }



Vérifiez la solution de Ryan. On dirait bien, mais je ne peux pas le garantir parce que je viens de le trouver. Ryan fait ce que la DLL ci-dessus a demandé.

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

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

Quoi qu’il en soit, c’est une tâche courante. J'espère que certains ici ou chez Microsoft proposent une solution Mort plug and play :)

J'ai trouvé une méthode d'extension pour l'exportation 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 un petit peu pour le faire fonctionner avec des datagrids avec des sources de données d'article (voir les commentaires dans le post). Quelqu'un 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.






Related