我有在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