You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:52:11