C#使用EPPlus读取Excel时for循环break致程序冻结求助
问题分析与修复方案
核心问题:无限循环
你的代码里多个for循环缺少迭代器(比如row++、col++),比如最外层的for (int row = 2; row <= end.Row;),没有写row++,导致循环永远停在初始值,程序直接卡死。不管加不加break,只要循环没迭代,就会无限运行。
代码重构与修复
先给所有循环补上迭代器,再简化冗余的嵌套逻辑(原代码多层嵌套完全没必要,只会增加复杂度)。以下是修复后的代码,保留你要实现的核心逻辑:找到文本为"Номер Машины"的单元格后,读取它下一行同列的内容,再读取再下一行同列的首个非空内容:
// 遍历行,从第2行开始 for (int row = 2; row <= end.Row; row++) { // 遍历当前行的列 for (int col = start.Column; col <= end.Column; col++) { string cellValue = ws.Cells[row, col].Text; // 找到目标单元格 if (string.Compare(cellValue, "Номер Машины", true) == 0) { // 读取下一行同列的内容 if (row + 1 <= end.Row) { string nextRowCell = ws.Cells[row + 1, col].Text; MessageBox.Show(nextRowCell); } // 读取再下一行同列的第一个非空内容 for (int row__ = row + 2; row__ <= end.Row; row__++) { string cellValue__ = ws.Cells[row__, col].Text; if (!string.IsNullOrEmpty(cellValue__)) { MessageBox.Show(cellValue__); break; // 找到非空内容就退出循环 } } // 找到目标后退出列循环,避免继续查找其他列 break; } } // 找到目标后退出行循环,避免继续查找其他行 break; }
关键优化点
- 给所有for循环补上迭代器,确保循环能正常结束。
- 去掉不必要的多层嵌套,把逻辑扁平化,更易维护和调试。
- 添加边界判断(比如
row + 1 <= end.Row),避免越界访问Excel单元格。 - 只在需要的地方使用break,比如找到目标内容后退出循环,减少无效遍历。
内容的提问来源于stack exchange,提问作者deinmar_krain
相关产品推荐
相关产品推荐

