22

Silverlight DataGrid データを Excel または CSV にエクスポートする方法はありますか?

Web を検索しましたが、例が見つかりません。

どうもありがとう

4

9 に答える 9

4

クリップボードを使用してこれを見つけました。

コードを汎用的にするには、最初の例を変更して、列バインディングを読み取り、リフレクションを使用してそれらをデータに適用します。

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

もちろん、バインディングのパスがプロパティ名である場合にのみ機能します。より高度なパスについては、バインディングをデータに適用する必要があります (それがより良い解決策になると思いますが、これを行う方法がわかりません)。

于 2008-12-09T18:02:15.307 に答える
2

Silverlight がファイルをダウンロードする方法を提供しているとは思いません。URL、つまりhttp://www.mysite.com/generateexcelfile.aspxを呼び出すボタンをアプリに追加できます。Silverlight アプリに表示されるデータを生成するために使用されるパラメーターをクエリ文字列値として含め、クエリを実行し、お気に入りの Excel ファイル生成コンポーネントを使用してその場でファイルを生成します。それにリダイレクトすると、ユーザーのシステムにダウンロードされます。

于 2008-11-20T04:27:46.660 に答える
2

これは古い投稿であることは知っていますが、役に立ちました。Silverlight 4、変換、および Excel で動作するようにいくつかの編集を行いました。高速エクスポートが必要だったので、最初に CSV を使用してから、Excel で開きます。このコードは、Silverlight Web および oob の昇格された信頼で機能します。Web では 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();
    }
于 2010-11-20T21:30:25.713 に答える
1

これらの解決策は私にはうまくいかなかったので、うまくいくものに修正しました。(私のソリューションではフィールドを引用符で囲む必要がないため、FormatCSVField 関数を省略しました)

    public void SaveAs(string csvPath)
    {
        string data = ExportDataGrid(true, _flexGrid);
        StreamWriter sw = new StreamWriter(csvPath, false, Encoding.UTF8);
        sw.Write(data);
        sw.Close();
    }

    public string ExportDataGrid(bool withHeaders, Microsoft.Windows.Controls.DataGrid grid) 
    {
        System.Text.StringBuilder strBuilder = new System.Text.StringBuilder();
        System.Collections.IEnumerable source = (grid.ItemsSource as System.Collections.IEnumerable);

        if (source == null) return "";

        List<string> headers = new List<string>();

        grid.Columns.ToList().ForEach(col =>
        {
            if (col is Microsoft.Windows.Controls.DataGridBoundColumn)
            {
                headers.Add(col.Header.ToString());
            }
        });

        strBuilder.Append(String.Join(",", headers.ToArray())).Append("\r\n");
        foreach (Object data in source)
        {
            System.Data.DataRowView d = (System.Data.DataRowView)data;
            strBuilder.Append(String.Join(",", d.Row.ItemArray)).Append("\r\n");
        }

        return strBuilder.ToString();
    }
于 2011-03-07T16:43:10.410 に答える
1

頭のてっぺんから、 を使用してエクスポート ボタンを追加し、 の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で説明されているバインディング情報を使用します。

于 2009-02-04T15:08:14.257 に答える
1

Ryan のソリューションを確認してください。良さそうですが、見つけたばかりなので保証できません。Ryan は、上記の DLL が要求したことを行います。

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

上記のダコタのソリューションの David は、実装が少し簡単に見えます。また、データ グリッドがあり、コンテンツ タイプが Excel に設定されている従来の asp.net ページへのリダイレクトが常にありますが、サポートするコードが増え、そのようになります。オフラインのブラウザー ソリューション以外では機能しない場合があります (実際には機能しません)。

とにかく、これは一般的なタスクです。ここまたはマイクロソフトの何人かの人々がモートプラグアンドプレイソリューションを考え出すことを願っています:)

Silverlight データグリッドからの CVS エクスポートの拡張メソッドを見つけました。

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

プラグ アンド プレイになる可能性がありますが、アイテム データソースを使用してデータグリッドで動作するようにするには、少し調整する必要がありました (投稿のコメントを参照してください)。私より聡明で経験豊富な人なら、完璧に微調整できるはずです。それをチェックしてください、それはあなたが必要なものに近づくはずです。

于 2009-12-02T22:16:19.420 に答える
0

私は同じことをする必要がありました。t3rse による実装を使用しましたが、いくつかの変更を加える必要がありました。彼の答えについてコメントするほどの評判はないので、ここにリストします。

  • propInfo.GetValue(data, null).ToString() という行については、ToString() を呼び出す前に、GetValue によって返される値が Null かどうかを確認しました。

  • メソッド FormatCSVField() で、二重引用符を 3 つの二重引用符に置き換えました。2 つの二重引用符でのみ置き換える必要があります。

  • 実装では、DataGridBoundColumn 型の列のみを使用し、その他は無視します。含めたい DataGridBoundColumn ではない列があるため、それらの列のデータ ソースのプロパティ名を col.SortMemberPath で取得しました。

于 2013-10-23T15:59:14.453 に答える
0

これは私にとってうまくいった素晴らしいアプローチです http://forums.silverlight.net/forums/p/179321/404357.aspx

于 2010-05-24T12:39:52.217 に答える