我有在Excel中一列具有格式:[H]:MM:SS表示小時可超過時鐘小時,使裝置有可能是e.g 783:34:12。當我嘗試使用格式化例如:NumberFormat =「@」或其他任何我總是得到錯誤的結果。
基於該描述,我將假設該值以數字Double形式輸入Excel。即:783:34:13等於32.64875。
在VB.Net中,您可以生成TimeSpan結構以生成結果的日,時,分和秒組件。在下文中,rng
是代表單個單元的Excel.Range
。
Dim val As Double = CDbl(rng.Value2)
Dim ts As TimeSpan = DateTime.FromOADate(val) - DateTime.FromOADate(0)
現在,如果你想格式化類似於Excel中顯示這個時間跨度爲一個字符串,你可以做這樣的事情:
Dim s As String = String.Format("{0}:{1:00}:{2:00}", (ts.Days * 24) + ts.Hours, ts.Minutes, ts.Seconds)
的原因,我建議這種技術在得到Text
Excel.Range
的屬性是Text
屬性將返回到您在Excel中看到的內容,包括列不足以顯示格式化值時有用的「###」。
編輯要地址評論:
你能解釋一下你爲什麼這樣做: - DateTime.FromOADate(0)?
Excel將日期時間值編碼爲指定日期時間的值爲零的24小時時間段(天)的十進制數。你的數據顯然是利用這個事實來讓你的單元格的值爲783:34:12(783小時,34分,12秒)或32.64875作爲十進制值。
爲了檢索(天,小時,分鐘,秒)原始值的偏移量,您需要減去由其基準值(零)表示的日期時間。
我看到不匹配例如:在excel:0:04:07(實際值在後面是:12:04:07 AM)在你的函數後我得到這個:0:04:06(所以1秒差異爲什麼是什麼?
我不能重現這個問題,這可能是由於浮點值表示的太侷限一個四捨五入的問題。
另外,注意,Excel支持兩個不同的日期基礎系統; 1900年日期系統(默認)和1904年日期系統。DateTime.FromOADate
函數根據1900日期系統進行轉換。這兩個系統之間的區別是被視爲零的日期。您應該檢查WorkBook.Date1904
屬性,以查看在轉換爲.Net DateTime時是否需要將添加天數(1462天)添加到從Excel中檢索的值。
這可能影響該代碼的結果:
Dim dattime As DateTime = DateTime.FromOADate(data(row, 11))
參見:Differences between the 1900 and the 1904 date system in Excel以獲取更多信息。
你可以在這裏找到有關Excel格式的信息http://vb.net-informations.com/excel-2007/vb.net_excel_page_format.htm – David
@大衛我有一列在Excel中有格式:[h]: mm:ss表示小時數可能超過時鐘小時數,因此意味着可能有例如783:34:12。當我嘗試使用格式化例如:NumberFormat =「@」或其他任何我總是得到錯誤的結果。在小時真正超過的時候,我重申了從單元格獲得正確值的唯一方法是獲取該列的單元格的文本。因此,我要求使用.Text作爲列中的一個而不是.Value2。希望你明白我的觀點。 – dev