2014-01-30 44 views
0

我使用下面的代碼導出爲Excel,它工作正常,但我怎麼能改變它直接到XLSX文件而不是XML文件,我也不想使用自動化,因爲它工作非常緩慢。導出到Excel中的Silverlight 5

謝謝。

public static class DataGridxtensions 
{ 
    public static void Export(this DataGrid dg) 
    { 
    ExportDataGrid(dg); 
    } 

    public static void ExportDataGrid(DataGrid dGrid) 
    {  
    SaveFileDialog objSFD = new SaveFileDialog() { DefaultExt = "xml", Filter = "Excel XML (*.xml)|*.xml", FilterIndex = 1 }; 

    if (objSFD.ShowDialog() == true) 
    { 
     string strFormat = objSFD.SafeFileName.Substring(objSFD.SafeFileName.IndexOf('.') + 1).ToUpper(); 
     StringBuilder strBuilder = new StringBuilder(); 
     if (dGrid.ItemsSource == null) return; 
     List<string> lstFields = new List<string>(); 

     if (dGrid.HeadersVisibility == DataGridHeadersVisibility.Column || dGrid.HeadersVisibility == DataGridHeadersVisibility.All) 
     { 
     foreach (DataGridColumn dgcol in dGrid.Columns) 
      lstFields.Add(FormatField(dgcol.Header.ToString(), strFormat, false)); 
     BuildStringOfRow(strBuilder, lstFields, strFormat); 
     } 

     foreach (object data in dGrid.ItemsSource) 
     { 
     lstFields.Clear(); 
     foreach (DataGridColumn col in dGrid.Columns) 
     { 
      string strValue = ""; 
      Binding objBinding = null; 

      if (col is DataGridBoundColumn) 
      objBinding = (col as DataGridBoundColumn).Binding; 

      if (col is DataGridTemplateColumn) 
      { 
      //This is a template column... let us see the underlying dependency object 
      DependencyObject objDO = (col as DataGridTemplateColumn).CellTemplate.LoadContent(); 
      FrameworkElement oFE = (FrameworkElement)objDO; 
      FieldInfo oFI = oFE.GetType().GetField("TextProperty"); 

      if (oFI != null) 
      { 
       if (oFI.GetValue(null) != null) 
       { 
       if (oFE.GetBindingExpression((DependencyProperty)oFI.GetValue(null)) != null) 
        objBinding = oFE.GetBindingExpression((DependencyProperty)oFI.GetValue(null)).ParentBinding; 
       } 
      } 
      } 

      if (objBinding != null) 
      { 
      if (objBinding.Path.Path != "") 
      { 
       PropertyInfo pi = data.GetType().GetProperty(objBinding.Path.Path); 
       if (pi != null) strValue = pi.GetValue(data, null).ToString(); 
      } 

      if (objBinding.Converter != null) 
      { 
       if (strValue != "") 
       strValue = objBinding.Converter.Convert(strValue, typeof(string), objBinding.ConverterParameter, objBinding.ConverterCulture).ToString(); 
       else 
       strValue = objBinding.Converter.Convert(data, typeof(string), objBinding.ConverterParameter, objBinding.ConverterCulture).ToString(); 
      } 
      } 

      lstFields.Add(FormatField(strValue, strFormat, true)); 
     } 

     BuildStringOfRow(strBuilder, lstFields, strFormat); 
     } 

     StreamWriter sw = new StreamWriter(objSFD.OpenFile()); 
     if (strFormat == "XML") 
     { 
     //Let us write the headers for the Excel XML 
     sw.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
     sw.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>"); 
     sw.WriteLine("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\">"); 
     sw.WriteLine("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">"); 
     sw.WriteLine("<Author>Arasu Elango</Author>"); 
     sw.WriteLine("<Created>" + DateTime.Now.ToLocalTime().ToLongDateString() + "</Created>"); 
     sw.WriteLine("<LastSaved>" + DateTime.Now.ToLocalTime().ToLongDateString() + "</LastSaved>"); 
     sw.WriteLine("<Company>Atom8 IT Solutions (P) Ltd.,</Company>"); 
     sw.WriteLine("<Version>12.00</Version>"); 
     sw.WriteLine("</DocumentProperties>"); 
     sw.WriteLine("<Worksheet ss:Name=\"Export\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">"); 
     sw.WriteLine("<Table>"); 
     } 

     sw.Write(strBuilder.ToString()); 

     if (strFormat == "XML") 
     { 
     sw.WriteLine("</Table>"); 
     sw.WriteLine("</Worksheet>"); 
     sw.WriteLine("</Workbook>"); 
     } 

     sw.Close(); 
    } 
    } 

    private static void BuildStringOfRow(StringBuilder strBuilder, List<string> lstFields, string strFormat) 
    { 
    switch (strFormat) 
    { 
     case "XML": 
     strBuilder.AppendLine("<Row>"); 
     strBuilder.AppendLine(String.Join("\r\n", lstFields.ToArray())); 
     strBuilder.AppendLine("</Row>"); 
     break; 
     case "CSV": 
     strBuilder.AppendLine(String.Join(",", lstFields.ToArray())); 
     break; 
    } 
    } 

    private static string FormatField(string data, string format, bool isNumber) 
    { 
    switch (format) 
    { 
     case "XML": 

     if (isNumber) 
     { 
      return String.Format("<Cell><Data ss:Type=\"Number\">{0}</Data></Cell>", data); 
     } 
     else 
     { 
      return String.Format("<Cell><Data ss:Type=\"String\">{0}</Data></Cell>", data); 
     } 
     case "CSV": 
     return String.Format("\"{0}\"", data.Replace("\"", "\"\"\"").Replace("\n", "").Replace("\r", "")); 
    } 
    return data; 
    } 
} 

回答

0

我可以想到兩個選項。

首先,有幾個組件供應商已經解決了這個問題。有SyncFusion's XlsIoInfragisticsTelerik(看起來像他們只有.xls)。

如果財務成本太高,那麼你可以考慮OpenXml。學習曲線會更加陡峭,您無法直接從Silverlight中使用它 - 您必須讓服務器將數據轉換爲.xlsx文件,然後客戶端才能保存結果。此外,您需要注意this issue

但是,它是免費的。我用它讀取Excel文件已經取得了一些成功。我認爲這可能是您需要的NuGet package,或者您可以下載installer

對我來說幸運的是,當我們需要創建一個.xlsx文件時,我的僱主支付了上面的第一個選項。 :-)

+0

代碼,我不想使用這些組件,我也不想用自動化的方式,因爲它的工作速度慢,是有辦法,我可以改變我的代碼直接導出到xlsx或xls文件? – Angela