Silverlight DataGrid: Экспорт в Excel или csv

22
задан Michael S. Scherotter 25 November 2010 в 16:15
поделиться

6 ответов

Я нашел этот использование буфера обмена.

Для создания кода универсальным можно изменить первый пример, чтобы считать привязку столбца и применить их к данным с помощью отражения:

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();
}

, конечно, это только работает, когда путь привязки является именем свойства. Для более усовершенствованных путей необходимо применить привязку к данным (я предполагаю, что это было бы лучшим решением, но я не уверен теперь, как сделать это).

4
ответ дан DaniCE 29 November 2019 в 05:13
поделиться

Я не думаю, что Silverlight предлагает способ загрузить файлы. Можно добавить кнопку к приложению, которое называет URL - т.е. http://www.mysite.com/generateexcelfile.aspx . Включайте как значения Querystring, параметры раньше генерировали данные, отображаемые в Вашем приложении Silverlight, выполняли Ваш запрос и использовали Ваш любимый компонент поколения файла Excel для генерации файла на лету. Перенаправление к нему и это загрузит на систему пользователей.

2
ответ дан Dave Swersky 29 November 2019 в 05:13
поделиться

Первое, что пришло на ум я сказал бы, что можно добавить кнопку экспорта с помощью ControlTemplate и затем выполнить итерации по каждому объекту в эти DataSource и затем использовать каждый столбец в Columns, чтобы получить содержание каждой ячейки с помощью GetCellContent метод или использовать информацию о привязке DataGridColumn для получения соответствующего значения ячейки. Можно затем получить отображенное значение этого содержания и записать это в отчет.

Что-то как...

foreach (YourType item in grid.DataSource)
{
   foreach (DataGridColumn column in grid.Columns)
   {
      FrameworkElement cellContent = column.GetCellContent(item);

      // Now, determine the type of cell content and act accordingly.
      TextBlock block = cellContent as TextBlock;
      if (block != null)
      {
         // Report text value...
      }

      // ...etc...

   }
}

Или использование информации о привязке, как описано DaniCE.

1
ответ дан Community 29 November 2019 в 05:13
поделиться

Silverlight 3 изменяет ответ на этот вопрос, поскольку дает пользователю возможность создать файл на рабочем столе пользователя в указанном им месте. Я адаптировал код, представленный DaniCE, разделил все на несколько методов для удобства чтения и использую свободно определенный формат CSV, который должен распознавать Excel.

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<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 (Object 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)
        {
            csvRow.Add(FormatCSVField(propInfo.GetValue(data, null).ToString()));
        }
        }
    }
    strBuilder
        .Append(String.Join(",", csvRow.ToArray()))
        .Append("\r\n");
    }


    return strBuilder.ToString();
}
21
ответ дан 29 November 2019 в 05:13
поделиться

Ознакомьтесь с решением Райана. Выглядит неплохо, но не могу поручиться, потому что я только что нашел. Райан делает то, о чем просила DLL выше.

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

Дэвид в приведенном выше решении Дакоты выглядит немного проще. реализовать, и всегда есть перенаправление на классическую страницу asp.net с сеткой данных на ней и типом контента, установленным на excel, но тогда у вас будет больше кода для поддержки, и этот способ может не работать для решений вне браузера, которые офлайн (на самом деле не будет работать).

В любом случае, это обычная задача. Я надеюсь, что некоторые люди здесь или в Microsoft придумают решение «plug and play» для Mort :)

Я нашел метод расширения для экспорта CVS из Silverlight datagrid-

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

Он потенциально может работать по принципу plug and play, но мне пришлось немного подправить его, чтобы заставить его работать с таблицами данных с источниками данных элементов (см. комментарии в публикации). Кто-то более умный и опытный, чем я, должен быть в состоянии довести до совершенства. Проверьте это, это должно приблизить вас к тому, что вам нужно.

1
ответ дан 29 November 2019 в 05:13
поделиться

Вот хороший подход, который сработал для меня http://forums.silverlight.net/forums/p/179321/404357.aspx

0
ответ дан 29 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: