2011-11-25 28 views
2

可能重複:
Reading Datetime value From Excel sheet如何DateTime讀取Excel中的互操作C#

我想從C#中使用互操作的Excel電子表格中的日期時間值讀取。我的所有時間都在我的工作表的'C'欄中。我的代碼如下:

public void addTime(Microsoft.Office.Interop.Excel.Workbook workbook) 
    { 

     Excel.Worksheet ws = (Excel.Worksheet)workbook.Worksheets.get_Item("Time Series"); 
     Excel.Range range = ws.UsedRange; 
     int num = 0; 
     for (int row = 1; row <= range.Rows.Count; row++) 
     { 
      String dtString = ((Excel.Range)ws.Cells[row, "C"]).Value2.ToString(); 
      DateTime dt = Convert.ToDateTime(dtString); 

      this.addEdgeInstance(dt); 
     } 
    } 

然而這並沒有在時間讀取。讀取字符串的工作,但轉換功能不起作用。我是否以不同的方式閱讀了價值觀?數值可以變化嗎? (IE:我可以輸入'11/11'還是'11/11/2011',因爲在Excel中工作時,Excel將這兩個條目都識別爲valie DateTime值?)

+0

你能給出一個dtString在轉換之前的例子嗎? –

+0

Excel接受的任何有效日期/時間格式。例如:11/25/2011 5:47:47 PM或11/11/2011或11/11等.... – WildBill

回答

8

有喲發芽。我稍微修改了一下代碼,以反映幫助程序轉換函數的用法。轉換髮生在這一行:DateTime dt = DateTime.Parse(ConvertToDateTime(dtString));隨意根據需要修改helper函數來返回DateTime變量而不是字符串,但這基本上是一回事。希望這可以幫助!

public void addTime(Microsoft.Office.Interop.Excel.Workbook workbook) 
{ 
Excel.Worksheet ws = (Excel.Worksheet)workbook.Worksheets.get_Item("Time Series"); 
Excel.Range range = ws.UsedRange; 
int num = 0; 
for (int row = 1; row <= range.Rows.Count; row++) 
{ 
    String dtString = ((Excel.Range)ws.Cells[row, "C"]).Value2.ToString(); 
    DateTime dt = DateTime.Parse(ConvertToDateTime(dtString)); 

    this.addEdgeInstance(dt); 
} 
} 


public static string ConvertToDateTime(string strExcelDate) 
{ 
    double excelDate; 
    try 
    { 
     excelDate = Convert.ToDouble(strExcelDate); 
    } 
    catch 
    { 
     return strExcelDate; 
    } 
    if (excelDate < 1) 
    { 
     throw new ArgumentException("Excel dates cannot be smaller than 0."); 
    } 
    DateTime dateOfReference = new DateTime(1900, 1, 1); 
    if (excelDate > 60d) 
    { 
     excelDate = excelDate - 2; 
    } 
    else 
    { 
     excelDate = excelDate - 1; 
    } 
    return dateOfReference.AddDays(excelDate).ToShortDateString(); 
}