2016-06-14 123 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文件。 –