2016-06-14 121 views
0

我正在用C#中的Microsoft.Office.Interop.Excel以編程方式讀取Excel工作表。 我能夠逐行讀取它並將每行轉換爲字符串arrray。然後,我將這些行添加到DataTable中。 除了Excel中的列包含Date值之外,每件事情都可以正常工作,並且當我從Excel Range對象中獲取並將其轉換爲字符串數組時,日期值將轉換爲某種十進制數。 對於EG-如何在C#Interop中保留Excel單元格格式?

  • 如果日期值是「2016年6月4日下午8時十四分39秒」,我得到的值作爲「42522.5224305556」
  • 如果日期值爲「5月27日/ 2016下午一點十分12秒」,我得到的數值爲 '42517.54875'

下面是我的代碼 -

private System.Data.DataTable GetTicketsFromExcel(string excelFilePath) 
    { 
     System.Data.DataTable dtblTickets = new System.Data.DataTable(); 
     Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 
     Worksheet ws = new Worksheet(); 
     Workbook wb = null; 

     try 
     { 
      wb = excelApp.Workbooks.Open(excelFilePath, Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing, 
               Type.Missing, Type.Missing); 

      ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Sheets.get_Item(1); 
      Range usedRange = ws.UsedRange; 
      Range rowRange; 
      string[] lsRow = null; 

      for (int i = 1; i <= usedRange.Columns.Count; i++) 
      { 
       dtblTickets.Columns.Add(usedRange.Cells[5, i].Value.ToString()); 
      } 

      string sortColumn = "Reported On"; 
      string sortDirection = "DESC"; 
      dtblTickets.Columns[sortColumn].DataType = typeof(DateTime); 

      for (int row = 6; row <= usedRange.Rows.Count; row++) 
      { 
       //dtblTickets.Columns.Add() 
       rowRange = usedRange.Rows[row]; 
       object[,] cellValues = (object[,])rowRange.Value2; 
       lsRow = cellValues.Cast<object>().Select(o => Convert.ToString(o)).ToArray<string>(); 
       dtblTickets.Rows.Add(lsRow.ToArray()); 
      } 
      dtblTickets.DefaultView.Sort = sortColumn + " " + sortDirection; 
      dtblTickets = dtblTickets.DefaultView.ToTable(); 
     } 
     catch (Exception ex) 
     { 

     } 
     finally 
     { 
      wb.Close(); 
      excelApp.Quit(); 
      Marshal.ReleaseComObject(ws); 
      Marshal.ReleaseComObject(wb); 
      Marshal.ReleaseComObject(excelApp); 
      ws = null; 
      wb = null; 
      excelApp = null; 
     } 
     return dtblTickets; 
    } 

請注意 -

  • 我不想用OLEDB讀取和導出此
  • 我希望能夠讀取行Excel的行(無需提取每個單元格的值並將其轉換)
  • 我不想轉換/格式化原始Excel文檔數據

有人可以幫我這個嗎?

+0

可以請你發佈你的excel文件演示 –

+1

感謝您的回覆。其實現在我可以做到了 - lsRow [8] = DateTime.FromOADate(double.Parse(lsRow [8]))。ToString(); –

回答

0

不太確定,如果您想以這種方式解決問題,但一種方法是在Excel中更改單元格(或整行或列)的屬性。

  • 在Cell右擊
  • 單元格格式
  • 在「數字」選擇分類「文本」的細胞。

我測試過它,它工作。

+0

對不起,我其實提到我不想手動格式化Excel文件。 –