使用OpenXML读取Excel跳过空单元格并兼容26列以上的方案咨询
修复后兼容任意列数的实现代码
private static int CellReferenceToIndex(Cell cell) { int index = 0; string reference = cell.CellReference?.ToString().ToUpper() ?? string.Empty; foreach (char ch in reference) { if (char.IsLetter(ch)) { // 适配Excel无0值的26进制列名规则 index = index * 26 + (ch - 'A' + 1); } else { // 遇到行号数字就终止遍历,转成0基索引返回 return index - 1; } } // 兼容无行号的异常引用场景 return index - 1; }
代码说明
原有代码的进位逻辑在处理3位及以上列名(比如AAA、XFD这类超过2位字母的列名)时会出现计算偏差,上述实现采用了标准的Excel列名转换规则,兼容Excel支持的最大16384列(对应列名XFD)的所有场景,不会出现超过26列后索引错位的问题。
配套读取逻辑参考
配合该方法读取行数据时无需按位置取单元格,直接按索引赋值即可自动跳过空单元格,避免错位:
// 已提前按Excel最大列数初始化好DataTable DataRow dataRow = dataTable.NewRow(); foreach (Cell cell in row.Descendants<Cell>()) { int colIndex = CellReferenceToIndex(cell); if (colIndex >= 0 && colIndex < dataTable.Columns.Count) { // 此处替换为你自己的单元格值读取逻辑 dataRow[colIndex] = GetCellValue(cell); } } dataTable.Rows.Add(dataRow);
内容的提问来源于stack exchange,提问作者Tech Learner
相关产品推荐
相关产品推荐

