2008-11-20 12 views
22

पर निर्यात करें क्या कोई तरीका है कि मैं अपने सिल्वरलाइट डेटाग्रिड डेटा को एक्सेल या सीएसवी में निर्यात कर सकता हूं?सिल्वरलाइट डेटाग्रिड: एक्सेल या सीएसवी

मैंने वेब की खोज की लेकिन मुझे कोई उदाहरण नहीं मिला!

धन्यवाद एक बहुत

उत्तर

2

मैं सिल्वरलाइट फ़ाइलों को डाउनलोड करने के लिए एक तरीका प्रदान करता है नहीं लगता। आप अपने ऐप में एक बटन जोड़ सकते हैं जो यूआरएल को कॉल करता है- यानी http://www.mysite.com/generateexcelfile.aspx। Querystring मानों को अपने सिल्वरलाइट ऐप में प्रदर्शित डेटा जेनरेट करने के लिए उपयोग किए गए पैरामीटर के रूप में शामिल करें, अपनी क्वेरी चलाएं और फ्लाई पर फ़ाइल जेनरेट करने के लिए अपनी पसंदीदा एक्सेल फ़ाइल जनरेशन घटक का उपयोग करें। इसे रीडायरेक्ट करें और यह उपयोगकर्ताओं के सिस्टम में डाउनलोड होगा।

+3

"फ़ाइल बनाएं और फिर इसे रीडायरेक्ट करें" से सावधान रहें - आपको किसी भी समय इन फ़ाइलों को हटाना होगा। करने के लिए बेहतर काम एक्सेल को सही माइम प्रकार के साथ .aspx पृष्ठ की आउटपुट स्ट्रीम में सहेजना होगा, ताकि ब्राउज़र देख सके कि यह एक एक्सेल फ़ाइल है, न कि HTML पृष्ठ, और उपयोगकर्ता को इसे सहेजने का विकल्प दें । – user8032

4

मुझे क्लिपबोर्ड का उपयोग करके this मिला है।

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(); 
} 
निश्चित रूप से

, यह केवल काम करता है जब बंधन का मार्ग है:

कोड जेनेरिक आप स्तंभ बाइंडिंग पढ़ सकते हैं और प्रतिबिंब का उपयोग आंकड़ों के वे लागू करने के लिए पहले उदाहरण संशोधित कर सकते हैं बनाने के लिए सम्पत्ति का नाम। अधिक उन्नत पथों के लिए आपको डेटा पर बाध्यकारी लागू करना होगा (मुझे लगता है कि यह एक बेहतर समाधान होगा, लेकिन मुझे यकीन नहीं है कि यह कैसे करें)।

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 द्वारा वर्णित का उपयोग कर।

21

सिल्वरलाइट 3 इस प्रश्न का उत्तर बदलता है क्योंकि यह उपयोगकर्ता को उस स्थान पर उपयोगकर्ता के डेस्कटॉप पर फ़ाइल बनाने की क्षमता देता है जो वे निर्दिष्ट करते हैं। मैंने डेनसीई द्वारा सबमिट किए गए कोड को अनुकूलित किया, चीजों को पठनीयता के लिए कुछ तरीकों से विभाजित किया और एक्सेल को पहचानने के लिए एक कम परिभाषित सीएसवी प्रारूप का उपयोग कर रहा हूं।

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

क्या यह काम करता है ?! – Goober

+1

यह कुछ हद तक हाथ से करता है; यह एक सीएसवी फ़ाइल बनाता है, एक्सएलएस नहीं। यदि किसी व्यक्ति को एक्सेल इंस्टॉल किया गया है तो यह एक्सेल में मैप किए गए एक्सटेंशन के आधार पर इसे खोलता है। – t3rse

+1

यदि आपको बाध्यकारी रेखा पर कोई त्रुटि मिलती है, तो इस तरह कास्टिंग करने का प्रयास करें: बाध्यकारी = (System.Windows.Data. बाइंडिंग) ((माइक्रोसॉफ्ट.Windows.Controls.DataGridBoundColumn) col)। बाइंडिंग; – proudgeekdad

1

रयान के समाधान की जांच करें। अच्छा लग रहा है, इसके लिए झुकाव नहीं कर सकता है क्योंकि मुझे अभी यह मिला है। रायन ने अनुरोध किया कि डीएलएल क्या अनुरोध करता है।

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

डेविड डकोटा समाधान में ऊपर लागू करने के लिए थोड़ा आसान लग रहा है, और वहाँ हमेशा उस पर एक डेटा ग्रिड और उत्कृष्टता प्राप्त करने के लिए सेट सामग्री प्रकार के साथ एक क्लासिक asp.net पृष्ठ करने के लिए रीडायरेक्ट है, लेकिन फिर आपके पास समर्थन करने के लिए और कोड है और इस तरह ऑफ़लाइन ब्राउज़र समाधानों के लिए काम नहीं कर सकता है (वास्तव में काम नहीं करेगा)।

वैसे भी, यह एक आम काम है।मैं कुछ लोगों को उम्मीद है कि यहाँ या माइक्रोसॉफ्ट में प्लग एक मोर्ट साथ आते हैं और खेलने के समाधान :)

मैं एक Silverlight datagrid-

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

यह क्षमता के लिए है से सीवीएस निर्यात के लिए एक विस्तार विधि पाया प्लग और प्ले करें, लेकिन मुझे इसे डेटा डेटा स्रोतों के साथ डेटाग्रिड्स के साथ काम करने के लिए थोड़ा सा tweek करना था (पोस्ट में टिप्पणियां देखें)। किसी से उज्ज्वल और अधिक अनुभवी खुद को पूर्णता में बदलने में सक्षम होना चाहिए। इसे देखें, इसे आपको जो चाहिए उसे बंद कर देना चाहिए।

2

के लिए काम किया मुझे पता है यह एक पुरानी पोस्ट है, लेकिन यह मेरी मदद किया है। मैंने चांदी के प्रकाश 4, रूपांतरित और उत्कृष्टता के साथ काम करने के लिए कुछ संपादन किए हैं। मैं तेज़ निर्यात चाहता था इसलिए मैं पहले सीएसवी का उपयोग करता हूं और फिर एक्सेल के साथ खोलता हूं। यह कोड चांदी की रोशनी वेब और ओब उन्नत ट्रस्ट काम करता है। वेब में एक्सेल में नहीं खुल जाएगा।

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

धन्यवाद यह एक कोशिश देने के लिए अच्छा लग रहा है। कृपया अपना ऐड हटाएं, यहां देखें http://stackoverflow.com/faq#signatures –

+0

बस यह कहने के लिए एक नोट है कि इंटरऑप के माध्यम से एक्सेल को इस तरह से नियंत्रित करने के लिए उपयोगकर्ता को ब्राउज़र से बाहर चलने की आवश्यकता होती है (ओओबी)। आपको अपना ऐप भी बनाना होगा जैसे कि यह उन्नत अनुमतियों (परियोजना के प्रॉपर्टी पेजों के माध्यम से) का अनुरोध करता है। –

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

मैं एक ही बात करने के लिए की जरूरत है। मैंने t3rse द्वारा कार्यान्वयन का उपयोग किया, लेकिन कुछ बदलाव करना पड़ा। मैं उसका जवाब पर एक टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, तो मैं उन्हें यहाँ सूचीबद्ध होगा:

  • लाइन है कि propInfo.GetValue (डेटा, नल) कहते हैं .ToString() के लिए, मैं करने के लिए जाँच की देखें कि GetValue द्वारा लौटाया गया मान उस पर ToString() को कॉल करने से पहले शून्य है या नहीं।

  • विधि स्वरूप VVield() विधि में, यह तीन डबल कोट्स के साथ एक डबल कोट को प्रतिस्थापित किया गया। इसे केवल दो डबल कोट्स के साथ बदलना चाहिए।

  • कार्यान्वयन केवल डेटाग्रिडबाउंड कॉलम के कॉलम का उपयोग करता है और दूसरों को अनदेखा करता है। मेरे पास ऐसे कॉलम हैं जो DataGridBoundColumn नहीं हैं जिन्हें मैं शामिल करना चाहता था, इसलिए मुझे उन कॉलम के लिए डेटा स्रोत का संपत्ति नाम मिला। ColMemberPath।

संबंधित मुद्दे