获取UsedRange的绝对偏移量

时间:2013-06-25 19:29:18

标签: c# excel automation

我对C#的Excel自动化有疑问,希望你能帮助我。

描述:
我必须在当前工作表中的UsedRange中找到具有特定值的特定单元格。因此,我写了两种方法。第一个从excel工作表中获取UsedRange,第二个存储在一个列表中的founds的位置,其中row / col与UsedRange相关。

问题:
如果文件有excel工作表开头的空行或列,那么我知道工作表中这个特定值的绝对位置...我怎么得到那个位置?

public object[,] GetUsedRangeFromWorksheet(Worksheet worksheet)
{
  if (worksheet == null)
    throw new ArgumentNullException();

  Range usedRange = null;
  object[,] usedRangeValues = null;

  usedRange = worksheet.UsedRange;
  usedRangeValues = (object[,])usedRange.get_Value(XlRangeValueDataType.xlRangeValueDefault);

  return usedRangeValues;
}

public IList<Tuple<int, int>> FindPositionsOfValue(string name, object[,] usedRange) 
{
  if (name == null || name == string.Empty)
    throw new ArgumentNullException();
  if (usedRange == null)
    throw new ArgumentNullException();

  int iRowMax = usedRange.GetLength(0);
  int iColumnMax = usedRange.GetLength(1);
  IList<Tuple<int, int>> lFounds = new List<Tuple<int, int>>();

  for (int iRow = 1; iRow < iRowMax; iRow++)
  {
    for (int iColumn = 1; iColumn < iColumnMax; iColumn++)
      if(usedRange[iRow, iColumn] != null)
        if (usedRange[iRow, iColumn].ToString() == name)
          lFounds.Add(Tuple.Create(iRow, iColumn));
  }

  return lFounds;
}

1 个答案:

答案 0 :(得分:1)

我在以下代码中使用ActiveSheet,因为我不喜欢参数名称worksheet - 这只会引起混淆,并且可能会发生冲突(如果您使用错误的情况键入错误)。组成一个更明智的名字;)

ActiveSheet.UsedRange.Row
ActiveSheet.UsedRange.Column

这些将返回UsedRange中第一个单元格的行号和列号。这些是您正在寻找的补偿。将它们存储在变量中,并根据需要添加或减去它们。

解释UsedRange按预期返回工作表中的used-range。但是,如果包含任何内容的第一个单元格是D4,则UsedRange将从此单元格开始,而不是从A1开始。