C# EPPlus如何获取多组不连续列?替代硬编码方式
在EPPlus中程序化获取多组不连续列的方法
除了硬编码单元格范围字符串,你可以通过以下几种程序化方式实现:
1. 动态拼接单元格范围字符串
利用EPPlus支持的范围语法,将变量中的列数组转换成对应的列字母范围,再拼接成完整的范围字符串:
首先实现一个列号转列字母的辅助方法:
private static string GetColumnLetter(int columnNumber) { var columnLetter = string.Empty; while (columnNumber > 0) { var remainder = (columnNumber - 1) % 26; columnLetter = Convert.ToChar('A' + remainder) + columnLetter; columnNumber = (columnNumber - 1) / 26; } return columnLetter; }
然后遍历你的列集合拼接范围:
var columns = new List<int[]> { new[] { 1, 2 }, new[] { 5, 6 } }; var rangeParts = new List<string>(); foreach (var colRange in columns) { var startCol = GetColumnLetter(colRange[0]); var endCol = GetColumnLetter(colRange[1]); rangeParts.Add($"{startCol}:{endCol}"); } var rangeString = string.Join(",", rangeParts); var range = sheet.Cells[rangeString];
2. 使用Range.Union合并多个列范围
逐个创建每组列对应的Range,再通过Union方法合并成一个完整的不连续范围:
var columns = new List<int[]> { new[] { 1, 2 }, new[] { 5, 6 } }; ExcelRange range = null; foreach (var colRange in columns) { // 获取当前列组的完整范围(从第1行到最后一行) var currentRange = sheet.Cells[1, colRange[0], sheet.Dimension.End.Row, colRange[1]]; range = range == null ? currentRange : range.Union(currentRange); }
3. 正确使用TakeColumns方法
TakeColumns需要传入要保留的列索引集合,你需要先把多组连续列转换成单个列索引的集合,再传入方法:
var columns = new List<int[]> { new[] { 1, 2 }, new[] { 5, 6 } }; var targetColumns = new List<int>(); // 将连续列展开为单个列索引 foreach (var colRange in columns) { targetColumns.AddRange(Enumerable.Range(colRange[0], colRange[1] - colRange[0] + 1)); } // 获取整个工作表的范围,再提取目标列 var fullRange = sheet.Cells[sheet.Dimension.Address]; var range = fullRange.TakeColumns(targetColumns.ToArray());
注意:如果工作表数据量很大,TakeColumns基于全表范围操作可能会有性能损耗,此时前两种方法更高效。
内容的提问来源于stack exchange,提问作者UndeadBob
相关产品推荐
相关产品推荐

