C#控制台读取Excel文件时指定代码行未执行问题求助
问题:C#读取Excel时指定代码行未执行
我按照视频教程编写C#代码读取Excel文件,代码与教程一致,但运行时以下代码行未执行:
excelTable[rowIndex - 1, i] = Convert.ToDouble(list[i].Replace('.', ','));
完整代码片段:
double[,]? excelTable; int totalRows = 0; int totalColumns = 0; ExcelPackage excelFile = new ExcelPackage(@"D:\telegram bot_d\Excel_Ankets.xlsx"); List(); async Task List() { ExcelWorksheet worksheet = excelFile.Workbook.Worksheets[1]; totalRows = worksheet.Dimension.End.Row; totalColumns = worksheet.Dimension.End.Column; excelTable = new double[totalRows, totalColumns]; for (int rowIndex = 1; rowIndex <= totalRows; rowIndex++) { IEnumerable<string> row = worksheet.Cells[rowIndex, 1, rowIndex, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString()); List<string> list = row.ToList<string>(); Console.WriteLine(list); for (int i = 0; i < list.Count; i++) { Console.WriteLine("1"); excelTable[rowIndex - 1, i] = Convert.ToDouble(list[i].Replace('.', ',')); Console.WriteLine("2"); } } for (int i = 0; i < totalRows; i++) { for (int j = 0; j < totalColumns; j++) { Console.WriteLine(Convert.ToString(excelTable[i, j])); } Console.WriteLine("\n"); } return; }
后续计划通过Telegram Bot展示变量特定值并写入表格,已核对教程、搜索论坛仍未解决。
分析与解决方案
1. 异步方法未等待是核心问题
直接调用List();但未使用await,异步方法会在后台执行,程序主线程可能在List()执行完成前就退出,导致代码没跑完。
修复方式:
- 确保入口方法为异步(比如Main方法改为
async Task Main(),需C# 7.1及以上版本支持) - 调用时添加
await:
await List();
2. 未捕获的转换异常导致代码中断
Convert.ToDouble可能因字符串格式不合法抛出异常,一旦抛出,当前循环直接中断,后续代码不执行,但无异常捕获无法看到报错。
修复方式:在转换代码块添加try-catch捕获异常,输出错误详情:
for (int i = 0; i < list.Count; i++) { Console.WriteLine("1"); try { // 注意:若系统区域用.作为小数点,替换成,反而会导致转换失败,需根据实际情况调整 excelTable[rowIndex - 1, i] = Convert.ToDouble(list[i].Replace('.', ',')); Console.WriteLine("2"); } catch (Exception ex) { Console.WriteLine($"第{rowIndex}行第{i+1}列转换失败:{ex.Message},内容为「{list[i]}」"); } }
3. 调试输出无效,无法排查内容问题
Console.WriteLine(list)输出的是List类型名称,看不到实际单元格内容,无法判断转换失败原因。
优化方式:修改输出语句,打印实际行内容:
Console.WriteLine($"第{rowIndex}行内容:{string.Join(" | ", list)}");
4. 额外检查点
- 确认Excel对应单元格内容是可转换为double的数值,无空字符串、中文、特殊符号等无效内容
- 检查系统区域小数点分隔符:若系统默认用
.作为小数点,替换成,会导致转换失败,可去掉Replace('.', ','),或指定转换格式:
excelTable[rowIndex - 1, i] = Convert.ToDouble(list[i], new CultureInfo("ru-RU")); // 俄语区域用,做小数点
内容的提问来源于stack exchange,提问作者illuha
相关产品推荐
相关产品推荐

