我想从Excel中获取指定多个区域的范围,基本上我有:
int StartColumn
int EndColumn
int[] ColumnsToSkip
当它们结合在一起时,可以生成具有非连续区域的范围。不幸的是,我无法弄清如何调用此功能...MSDN并没有什么用...
工作表 sheet;
sheet.get_Range( what goes in here??? );
有人能提供帮助吗?谢谢。
我想从Excel中获取指定多个区域的范围,基本上我有:
int StartColumn
int EndColumn
int[] ColumnsToSkip
当它们结合在一起时,可以生成具有非连续区域的范围。不幸的是,我无法弄清如何调用此功能...MSDN并没有什么用...
工作表 sheet;
sheet.get_Range( what goes in here??? );
有人能提供帮助吗?谢谢。
一个非常简单的解决方案是以逗号分隔的形式指定不同的区域:
sheet.get_Range( "A1:B1,E1:G1");
对于编程范围的组合,ExcelApplication 对象还有 Union
和 Intersection
方法。在 C# 中使用这些方法比较笨拙,因为有很多可选参数。可以查看这里的例子:http://codeidol.com/csharp/c-sharp-in-office/Working-with-Excel-Objects/Working-with-the-Range-Object/
编辑:一些额外的提示:
在你的情况下,你首先应该将 "ColumnsToSkip" 转换为 "ColumnsToKeep",因为这是任何单元格联合所需的。以下是一个 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);
}
试试这个:
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);
处理非连续区域的另一种方法是在Excel中使用命名区域将它们组合在一起,例如:
=CHOOSE({1;2;3},RANGE1,RANGE2,RANGE3)
这将生成一个由“堆叠”在一起的区域组成的数组。将此公式分配给命名区域,您可以像任何其他Range
对象一样在程序中使用它。