【问题标题】:Need to find beginning and ending points of an Excel Range in C#需要在 C# 中找到 Excel 范围的起点和终点
【发布时间】:2011-01-18 10:54:39
【问题描述】:

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

【问题讨论】:

  • 如果您需要更多关于我的回答的帮助,请告诉我,我不确定您的 Excel 经验深度
  • 您能否更具体地回答您的问题,您到底需要什么? UsedRange 是否返回正确的范围,而您只想调整它的大小?
  • 斯坦,完全正确。我不想要整个范围,只想要终点,这样我就可以使用自己的起点。
  • 看看我更新的答案。

标签: c# excel com import


【解决方案1】:

好的,找到了答案(经过近 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);

来自 MSDN:

public string get_Address (
    [OptionalAttribute] Object RowAbsolute,
    [OptionalAttribute] Object ColumnAbsolute,
    [OptionalAttribute] XlReferenceStyle ReferenceStyle,
    [OptionalAttribute] Object External,
    [OptionalAttribute] Object RelativeTo)

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

【讨论】:

  • 这很完美!不知道为什么没有更多的人看过这个。
【解决方案2】:

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

假设我有以下范围:

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();

【讨论】:

  • 你回答了你自己的问题,但我仍然认为这个答案对你长期有用。
  • 是的,当我知道我想去的位置时这很好,但是当我不知道它会是什么时我试图找到最后一个数据位置..跨度>
  • @Tom,请看看我更新的答案,它将显示如何做你想做的事,没有 get_Address。
  • 是的,我非常喜欢你的回答。我只是被一些客户问题所困扰。会考虑使用这个。谢谢。
【解决方案3】:

来自MSDN

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

rngDown = rng.get_End(Excel.XlDirection.xlDown);

【讨论】:

  • 没有这样的方法可用,我想你在考虑get_End
  • 当我尝试这个时,它返回了包含表的结尾(第 65536 行),而不是 UsedRange 的结尾。
  • @Stan,是的,你是对的,这是 MS 网站上的印刷错误,谢谢
【解决方案4】:

您应该能够使用Range.RowRange.Rows.CountRange.ColumnRange.Columns.Count 属性来获取范围的开始和结束,如下所示:

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 中,但所有这些函数都应该在带有 COM 的 C# 中可用。

【讨论】:

  • @Joseph,MS 网站上出现打印错误,请改用 get_End
  • 确保您先选择一个单元格,或者以联合形式使用它
猜你喜欢
  • 1970-01-01
  • 2017-08-25
  • 2021-09-19
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多