2014-01-30 5 views
0

Я использую следующий код для экспорта в excel, он отлично работает, но как я могу изменить его на xport непосредственно в файл .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 XlsIo и Infragistics, и Telerik (похоже, они имеют только .xls).

Если финансовые затраты слишком велики, вы можете рассмотреть OpenXml. Кривая обучения будет немного круче, и вы не сможете использовать ее непосредственно из Silverlight - вам нужно заставить сервер преобразовать ваши данные в файл .xlsx, а затем ваш клиент сохранит результаты. Кроме того, вам необходимо знать this issue.

Но, это бесплатно. У меня был некоторый успех с чтением файлов Excel. Я думаю, это может быть NuGet package вам нужно, или вы можете скачать installer.

К счастью для меня, мой работодатель заплатил за первый вариант выше, когда нам нужно было создать файл .xlsx. :-)

+0

Я не хочу, чтобы использовать эти компоненты, и я не хочу использовать способ автоматизации, поскольку он работает медленно, есть ли способ, что я могу изменить мой код для экспорта напрямую в файл xlsx или xls? – Angela

Смежные вопросы