2011-09-20 103 views
1

我使用C#中的互操作從Excel電子表格提取數據,並且我有一個小問題,我不能想到答案。將提取的日期從excel轉換爲SQL日期

當我提取使用此代碼對日期單元格中的數據:

string _date = xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim(); 

我得到的40694的值不會用我的插入statemwnt直接進入到SQL。

我也曾嘗試:

DateTime _date = Convert.ToDateTime(xlWorksheet.get_Range("B3", "B3").Value2.ToString().Trim()); 

但是,這與一個錯誤說,它不能將其轉換回來。

任何人都可以告訴我如何做到這一點?

+0

你可以張貼在字符串格式的日期? – JNK

+0

你從.Value得到了什麼(即不是Value2)?甚至可能是.Text? – Rup

回答

0

使用DateTime.FromOADate()

使用你的例子: DateTime _date = DateTime.FromOADate(Double.Parse(xlWorksheet.get_Range("B3", "B3").Value2))

+0

投射到兩倍將無法正常工作。 – phoog

+0

好抓!我將其更改爲Double.Parse() – Keith

+0

我越來越 - 無法將類型'字符串'轉換爲'雙'?我錯過了什麼? –

2

Excel的內部日期值是「自紀元以來的天數」,這取決於它是在PC還是Mac模式(PC版本使用1/1/1900,Mac版本使用1/1/1904),然後有一個額外的設置與Lotus 1-2-3存在一些閏年問題的bug兼容。可以可靠地轉換此數字要求您檢查電子表格是基於Windows還是Mac,以及1-2-3 compat標誌是否打開。

將Excel格式化爲明確的字符串(如1-jan-1904),然後將其解析爲SQL服務器中的日期時間值,而不是試圖複製Excel複雜的日期處理邏輯,可能會更好。

+0

自「時代以來的日子」 - 從來不知道這一點 - 總是想知道那個隨機數字意味着什麼。謝謝(你的)信息! –

0

使用DateTime.FromOADate(雙d):

DateTime.FromOADate((double)(xlWorksheet.get_Range("B3", "B3").Value2)) 
0

遇到同樣的事情,這裏的轉換

/// <summary> 
    /// Seriously? For the loss 
    /// <see cref="http://www.debugging.com/bug/19252"></see> 
    /// </summary> 
    /// <param name="excelDate">Number of days since 1900-01-01</param> 
    /// <returns>The converted days to date</returns> 
    public static DateTime ConvertXlsdtToDateTime(int excelDate) 
    { 
     DateTime dt = new DateTime(1899, 12, 31); 

     // adjust for 29 Feb 1900 which Excel considers a valid date 
     if (excelDate >= 60) 
     { 
      excelDate--; 
     } 

     return dt.AddDays(excelDate); 
    } 
0

Excel存儲da以浮點數計算1900-01-01(或Mac 1904-01-01)前一天的天數。如果日期在1900-03-01之前,你還必須考慮閏年問題。

下面的代碼會進行轉換:

DateTime ConvertToDateTime(Double date) { 
    if (date < 1) 
    throw new ArgumentException("Excel dates cannot be smaller than 1."); 
    var epoch = new DateTime(1900, 1, 1); 
    if (date > 60D) 
    date -= 2; 
    else 
    date -= 1; 
    return epoch.AddDays(date); 
}