Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要在C中查找Excel范围的起点和终点#_C#_Excel_Com_Import - Fatal编程技术网

C# 需要在C中查找Excel范围的起点和终点#

C# 需要在C中查找Excel范围的起点和终点#,c#,excel,com,import,C#,Excel,Com,Import,我正在尝试使用COM从C#读取一个excel文件,可以很好地打开和加载它。但是,我不想使用工作表上的所有数据(它每月扩展一次),只想使用从工作表顶部(第3行表示标题,第4行表示数据)开始到结尾的某个子集。目前,我可以获得一个表示整个数据集的范围,即Excel.Worksheet.UsedRange,但接下来我需要将其向下操作到所需的范围,或者(最好)找到终点,以便传递到另一个范围,以便实际检索数据。有人能告诉我怎么做这两件事吗?谢谢。发件人: 使用End属性以及XlDirection枚举(xlU

我正在尝试使用COM从C#读取一个excel文件,可以很好地打开和加载它。但是,我不想使用工作表上的所有数据(它每月扩展一次),只想使用从工作表顶部(第3行表示标题,第4行表示数据)开始到结尾的某个子集。目前,我可以获得一个表示整个数据集的范围,即
Excel.Worksheet.UsedRange
,但接下来我需要将其向下操作到所需的范围,或者(最好)找到终点,以便传递到另一个范围,以便实际检索数据。有人能告诉我怎么做这两件事吗?谢谢。

发件人:

使用End属性以及XlDirection枚举(xlUp、xlToRight、xlToLeft、xlDown)中的值检索表示区域末尾单元格的范围,就像您按下了枚举值所描述的键一样


您应该能够使用、、和属性获取范围的开始和结束,如下所示:

Dim used As Range, first As Range, last As Range
Set used = Sheet1.UsedRange
Set first = Sheet1.Cells(used.Row, used.Column)
Set last = Sheet1.Cells(used.Row + used.Rows.Count, used.Column + used.Columns.Count)

MsgBox ("First: " + first.Address + " Last: " + last.Address)
示例代码在VBA中,但所有这些函数都应该在C#with COM中可用。

好的,找到了答案(总共搜索了近3个小时,在这里询问了2个小时),因此将在这里为其他人发布

Excel.Range urange = (Excel.Range)xlWorkSheet.UsedRange; // gives us the actual range<br>
string used = urange.get_Address(false, false, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

前两个显然是真/假标志,下一个定义为
Microsoft.Office.Interop.Excel.XlReferenceStyle
对象,我猜外部是对外部文件的引用,或者某种标志。相对而言,我只能猜测它指的是定义的任意位置,可能是范围对象,可能是字符串。不幸的是,MSDN在这个主题上非常稀少,所以我只是在这里猜测并发表我的猜测。但是,使用我发布的代码,我能够检索“A1:B245”使用的总数,这正好是我想要的,然后我可以通过提取第二部分创建一个新范围,然后继续。

我不确定您要做什么。但这里有一些例子

假设我有以下范围:

Excel.Worksheet sheet = this.Application.ActiveSheet as Excel.Worksheet;
Excel.Range range = sheet.get_Range("A1", "B5") as Excel.Range;
要将范围向下移动
n
-行数:

int n = 1;
int rows = range.Rows.Count;
int cols = range.Columns.Count;

Excel.Range newRange = range.get_Offset(n, 0).get_Resize(rows-n,cols);
newRange.Select(); //will select the new range will be 1 row lower
把你的下一排往上移动

Excel.Range newRange = range.get_Resize(rows-n,cols);
newRange.Select(); //will select the new range will be 1 row higher
我想你能想出如何把它左右移动

get_Offset()
将移动整个范围,然后需要调整范围大小

编辑:现在我知道你想要什么了。

要选择最后一个单元格,请执行以下操作:

Excel.Range lastCell = range.Cells[rows, cols] as Excel.Range;
lastCell.Select();
现在,您可以使用自己的起点,如下所示:

Excel.Range newRange = sheet.get_Range("B1", lastCell);
newRange.Select();

如果您需要更多帮助来回答我的问题,请告诉我,我不确定您是否有丰富的Excel经验。您可以更具体地回答问题,您到底需要什么?UsedRange是否返回正确的范围,而您只是想调整其大小?Stan,完全正确。我不想要整个范围,只想要结束点,这样我就可以使用我自己的开始点。看看我更新的答案。没有这样的方法,我想你是在想得到结束。当我尝试这个方法时,它返回了包含表单的结尾(第65536行),而不是UsedRange的结尾。@Stan,是的你是对的那是MS网站上的一个印刷错误,thanks@Joseph,MS网站上有一个打印错误,请使用get_End代替。请确保您先选择一个单元格,或者在联合表格中使用它。您回答了自己的问题,但是我仍然认为这个答案从长远来看对您有用。是的,当我知道我想去的职位时,这很好,但我正在试图找到最后一个数据职位,而我不知道它将是什么。@Tom,请看我更新的答案,它将显示如何做你想做的事情,而无需获得地址。是的,我非常喜欢你的答案。我只是被一些客户的问题转移了注意力。我会研究使用这个。谢谢。这个很好用!不知道为什么更多的人没有看到这一点。
Excel.Range lastCell = range.Cells[rows, cols] as Excel.Range;
lastCell.Select();
Excel.Range newRange = sheet.get_Range("B1", lastCell);
newRange.Select();