我正在编写一个Excel应用程序,它将从Excel文件读取和写入指定的值,并将其显示给用户。但是,当我尝试从具有Number Format
或函数类型'hh:min' (Hour:Min)
的单元格中读取时,我无法获得该值的确切要求。
这是我的代码......
ws[dateTimePicker1.Value.Day + 1].get_Range("F" + i.ToString(), Type.Missing);
if (range.Value2 != null)
val += " - " + range.Value2.ToString(); //Sets FXX to val
lbHK1.Items.Add(val);
WHERE ...
ws
=我的工作表dateTimePicker1
=我的日期时间选择器可帮助我决定打开哪个文件i
=是一个整数,可帮助我确定该单元格的行号range
=是从Microsoft.Office.Interop.Excel.Range 在我的示例中,当i = 11
时,F11
是包含时间值06:30
的单元格(在Excel中,fx : 06:30:00
)。但是,当我尝试获取该值时,会返回double
类型,例如0.263888888888889
如何在Excel中显示格式正确的值,而不是无意义的双值?
答案 0 :(得分:5)
Excel将内部时间存储为包含24小时日的小数部分的双倍:所以6:30 AM将是0.2708333
答案 1 :(得分:3)
处理Excel日期时,日期可以存储为日期的字符串表示形式,也可以是OA date(OLE自动化日期)。我发现在解析Excel日期时检查这两种类型是最安全的路径。
这是我为转换编写的扩展方法:
/// <summary>
/// Sometimes the date from Excel is a string, other times it is an OA Date:
/// Excel stores date values as a Double representing the number of days from January 1, 1900.
/// Need to use the FromOADate method which takes a Double and converts to a Date.
/// OA = OLE Automation compatible.
/// </summary>
/// <param name="date">a string to parse into a date</param>
/// <returns>a DateTime value; if the string could not be parsed, returns DateTime.MinValue</returns>
public static DateTime ParseExcelDate( this string date )
{
DateTime dt;
if( DateTime.TryParse( date, out dt ) )
{
return dt;
}
double oaDate;
if( double.TryParse( date, out oaDate ) )
{
return DateTime.FromOADate( oaDate );
}
return DateTime.MinValue;
}
在您的示例中,用法为:
TimeSpan time = f11Value.ParseExcelDate().TimeOfDay;
答案 2 :(得分:2)
Excel将时间存储在一天中的几分之一,自12/24 = 1/2 = 0.5后,将存储为0。0
要获得小时数,必须将excel时间乘以24,然后将结果四舍五入为整数。
要获得分钟(因为一天有1440分钟),您必须将该值乘以1440,这将给出自00:00以来经过的分钟,您需要除以60并完成剩余的操作是以分钟为单位获得时间。
这是一个片段:
string parseExcelHour(string cellInput){
double excelHour = 0;
try{
excelHour = Double.Parse(cellInput);
}catch { }
int hour = (int) (excelHour * 24);// with the int cast you get only an integer.
int min = (int) (excelHour * 1440 % 60); //mod (%) takes only the remainder and then the cast to int will round the number
return (hour < 10? "0":"") + hour + ":" + (min < 10? "0":"") + min; //will print HH:mm
}