2014-10-20 4 views
2

Почему мои ценности меняются, когда я экспортировать свою DataGrid в ExcelЭкспорт WPF DataGrid в Excel

строка 351732051316944 становится 3,51732E + 14

и мои DateTimes: 2014-01-01 02:09: 29.942 становится 41641,09035

и как мне его остановить?

Класс Я использую ExportToExcel

public class ExportToExcel<T> 
{ 
    public List<T> dataToPrint; 
    // Excel object references. 
    private Microsoft.Office.Interop.Excel.Application excelApp = null; 
    private Workbooks books = null; 
    private Workbook book = null; 
    private Sheets sheets = null; 
    private Worksheet sheet = null; 
    private Range range = null; 
    private Font font = null; 
    // Optional argument variable 
    private object optionalValue = Missing.Value; 


    /// Generate report and sub functions 
    public void GenerateReport() 
    { 
     try 
     { 
      if (dataToPrint != null) 
      { 
       if (dataToPrint.Count != 0) 
       { 
        Mouse.SetCursor(Cursors.Wait); 
        CreateExcelRef(); 
        FillSheet(); 
        OpenReport(); 
        Mouse.SetCursor(Cursors.Arrow); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show("Error while generating Excel report"); 
     } 
     finally 
     { 
      ReleaseObject(sheet); 
      ReleaseObject(sheets); 
      ReleaseObject(book); 
      ReleaseObject(books); 
      ReleaseObject(excelApp); 
     } 
    } 
    /// Make Microsoft Excel application visible 
    private void OpenReport() 
    { 
     excelApp.Visible = true; 
    } 
    /// Populate the Excel sheet 
    private void FillSheet() 
    { 
     object[] header = CreateHeader(); 
     WriteData(header); 
    } 
    /// Write data into the Excel sheet 
    private void WriteData(object[] header) 
    { 
     object[,] objData = new object[dataToPrint.Count, header.Length]; 

     for (int j = 0; j < dataToPrint.Count; j++) 
     { 
      var item = dataToPrint[j]; 
      for (int i = 0; i < header.Length; i++) 
      { 
       var y = typeof(T).InvokeMember 
     (header[i].ToString(), BindingFlags.GetProperty, null, item, null); 
       objData[j, i] = (y == null) ? "" : y.ToString(); 
      } 
     } 
     AddExcelRows("A2", dataToPrint.Count, header.Length, objData); 
     AutoFitColumns("A1", dataToPrint.Count + 1, header.Length); 
    } 
    /// Method to make columns auto fit according to data 
    private void AutoFitColumns(string startRange, int rowCount, int colCount) 
    { 
     range = sheet.get_Range(startRange, optionalValue); 
     range = range.get_Resize(rowCount, colCount); 
     range.Columns.AutoFit(); 
    } 
    /// Create header from the properties 
    private object[] CreateHeader() 
    { 
     PropertyInfo[] headerInfo = typeof(T).GetProperties(); 

     // Create an array for the headers and add it to the 
     // worksheet starting at cell A1. 
     List<object> objHeaders = new List<object>(); 
     for (int n = 0; n < headerInfo.Length; n++) 
     { 
      objHeaders.Add(headerInfo[n].Name); 
     } 

     var headerToAdd = objHeaders.ToArray(); 
     AddExcelRows("A1", 1, headerToAdd.Length, headerToAdd); 
     SetHeaderStyle(); 

     return headerToAdd; 
    } 
    /// Set Header style as bold 
    private void SetHeaderStyle() 
    { 
     font = range.Font; 
     font.Bold = true; 
    } 
    /// Method to add an excel rows 
    private void AddExcelRows(string startRange, int rowCount, int colCount, object values) 
    { 
     range = sheet.get_Range(startRange, optionalValue); 
     range = range.get_Resize(rowCount, colCount); 
     range.set_Value(optionalValue, values); 
    } 

    /// Create Excel application parameters instances 
    private void CreateExcelRef() 
    { 
     excelApp = new Microsoft.Office.Interop.Excel.Application(); 
     books = (Workbooks)excelApp.Workbooks; 
     book = (Workbook)(books.Add(optionalValue)); 
     sheets = (Sheets)book.Worksheets; 
     sheet = (Worksheet)(sheets.get_Item(1)); 
    } 

    /// Release unused COM objects 
    private void ReleaseObject(object obj) 
    { 
     try 
     { 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
      MessageBox.Show(ex.Message.ToString()); 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
    } 
} 

Я понятия не имею, где начать с этой проблемой, но любая помощь ценится

+0

Не следует использовать автоматизацию Excel, использовать библиотеку вместо этого, есть много на NuGet. – DavidG

+0

У вас есть библиотека для этого? – Simon

+0

Я использую EPPlus http://epplus.codeplex.com/ – blindmeis

ответ

2

Если вы должны использовать автоматизацию Excel, как это, то вам необходимо убедиться, правильное форматирование применяется к ячейкам. Итак, после того, как вы установили значение, также задайте формат. Например, дата может быть такой:

range.set_Value(optionalValue, values); 
range.NumberFormat = "dd-mmm-yyyy"; 

И предотвратить номера, показывающие, используя формат, который вы упоминаете:

range.set_Value(optionalValue, values); 
range.NumberFormat = "0"; 
Смежные вопросы