如何将Excel工作表字符串转为hh:mm时间格式?DateTime转换报错求助
问题解答:解析Excel时间字符串并写入新工作表
针对你提出的两个问题,我来一步步帮你解决:
问题1:解析Excel字符串为hh:mm时间并写入新工作表
核心要点是:Excel的时间本质是带日期的DateTime值(或代表一天比例的小数),所以你需要先把纯时分字符串转换为有效的DateTime/TimeSpan对象,再赋值给Excel单元格,同时设置单元格格式为hh:mm。
问题2:DateTime.Parse抛出FormatException的原因和解决
你遇到的异常是因为DateTime.Parse默认需要能解析为完整日期时间的字符串,如果你的in0只是类似"08:30"的纯时分格式,系统默认的解析规则可能无法识别(尤其是不同区域文化的格式差异)。以下是具体的修正方案:
步骤1:安全解析时间字符串
不要用DateTime.Parse,改用指定格式解析的方式,彻底避免文化差异导致的失败:
- 如果你只需要时分,用
DateTime.ParseExact指定"hh:mm"格式 - 或者用
TimeSpan.Parse解析为时间跨度,再结合基准日期生成DateTime
步骤2:修正你的代码
这里是修改后的完整代码,我标注了关键修改点:
// 记得引入必要的命名空间 using System.Globalization; // 建议把DateandTime类的属性改成TimeSpan/DateTime类型,更贴合语义 public class DateandTime { public TimeSpan In0 { get; set; } public TimeSpan Out0 { get; set; } // ... 其他属性同理修改 public TimeSpan break_time { get; set; } } // 处理Excel的循环逻辑 for (int row = 2; row <= rw; row++) { // 你的cCnt循环范围是6-6,可以直接去掉内层循环,简化代码 var in0Str = (string)(xlworkSheet.Cells[row, 7] as Excel.Range).Value; if (string.IsNullOrWhiteSpace(in0Str)) { // 处理空值,避免后续解析出错 xlNewSheet.Cells[row, 7].Value = null; continue; } // 关键:指定格式解析时间字符串,避免FormatException if (TimeSpan.TryParseExact(in0Str, "hh:mm", CultureInfo.InvariantCulture, out TimeSpan in0Time)) { // 把TimeSpan赋值给你的类(如果修改了属性类型) Time.In0 = in0Time; Console.WriteLine(Time.In0.ToString(@"hh\:mm")); // Excel需要DateTime类型,结合当天日期生成时间点 DateTime dtnew = DateTime.Today.Add(in0Time); // 设置单元格格式并赋值 Excel.Range formatRange = xlNewSheet.Cells[row, 7]; formatRange.NumberFormat = "hh:mm"; // 赋值DateTime对象,而不是原字符串,这样Excel才会识别为时间 formatRange.Value = dtnew; } else { // 处理解析失败的情况,比如日志提示或者标记错误 Console.WriteLine($"无法解析时间字符串:{in0Str}"); xlNewSheet.Cells[row, 7].Value = "无效时间"; } }
关键修改说明:
- 类型优化:把
DateandTime类的字符串属性改成TimeSpan,更贴合时间跨度的语义,避免存储原始字符串带来的解析问题 - 安全解析:用
TimeSpan.TryParseExact代替DateTime.Parse,指定格式和不变文化,彻底避免格式异常,同时还能处理解析失败的情况 - Excel赋值正确类型:给Excel单元格赋值
DateTime对象(而不是字符串),这样设置NumberFormat="hh:mm"后,Excel会正确识别为时间类型,而非文本 - 空值处理:增加了空值判断,避免空字符串导致的解析错误
额外提示
- 如果你的时间字符串是24小时制(比如
"14:30"),记得把解析格式改成"HH:mm" - 如果你不需要日期部分,直接赋值
TimeSpan给Excel单元格也可以,但Excel会自动把它转换为当天的时间(因为Excel的时间存储是从1900-01-01开始的小数)
内容的提问来源于stack exchange,提问作者Gerald
相关产品推荐
相关产品推荐

