我正在尝试从Excel中获取一个范围,其中指定了多个区域,基本上我已经...
int StartColumn
int EndColumn
int [] ColumnsToSkip
组合这些时,可以生成具有非连续区域的范围。不幸的是我无法弄清楚这个问题...... MSDN不是很有用......
工作表单;
sheet.get_Range( what goes in here??? );
有人提供任何帮助吗?欢呼声。
答案 0 :(得分:10)
一个非常简单的解决方案是以逗号分隔的形式指定不同的区域:
sheet.get_Range( "A1:B1,E1:G1");
对于程序化范围组合,还有ExcelApplication对象的Union
和Intersection
方法。由于许多可选参数,在C#中使用它们有点笨拙。见这里
例如。
编辑:一些额外的提示:
在您的情况下,您首先应该转换“ColumnsToKeep”中的“ColumnsToSkip”,因为这是您需要的任何类型的细胞联合。这是一个Linq解决方案:
int[] ColumnsToKeep = Enumerable.Range(StartColumn, EndColumn -StartColumn + 1)
.Except(ColumnsToSkip)
.ToArray();
然后,您可以在此示例的行中创建一些内容:
Excel.Range totalRange = null;
foreach(int col in ColumnsToKeep)
{
totalRange = Union(excelApp,totalRange,(Excel.Range)sh.Cells[row, col]);
}
其中定义了“Union”,例如:
static Excel.Range Union(Excel.Application app, Excel.Range r1, Excel.Range r2)
{
if (r1 == null && r2 == null)
return null;
if (r1 == null)
return r2;
if (r2 == null)
return r1;
return app.Union(r1, r2,
null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null);
}
答案 1 :(得分:0)
使用非连续范围的另一种方法是使用命名范围在Excel中将它们组合在一起,例如:
=CHOOSE({1;2;3},RANGE1,RANGE2,RANGE3)
这将生成一个由范围"堆叠"组成的数组。在彼此之上。将此公式分配给命名范围,您可以像任何其他Range
对象一样以编程方式使用它。
答案 2 :(得分:0)
尝试一下:
using Excel = Microsoft.Office.Interop.Excel;
Excel.Range[] ranges = new Excel.Range[] {yourRange1, yourRange2, ... };
string multiRangeStr = "";
foreach (Excel.Range range in ranges)
{
string address = range.Address[true, true, Excel.XlReferenceStyle.xlA1];
multiRangeStr += (multiRangeStr == "" ? "" : ";") + address;
}
//output: multiRangeStr: "A1:A3;B1:B3"
Excel.Range multiRange = wsheet.Range(multiRangeStr);