【问题标题】:retrieve single cell value in Excel automation function with c#使用 C# 在 Excel 自动化函数中检索单个单元格值
【发布时间】:2011-04-25 13:47:37
【问题描述】:

我需要在我的方法中检索单个单元格而不是 Excel.Range。

using Excel = Microsoft.Office.Interop.Excel;
...
public object vReadNumber(Excel.Range targetRange)
{
    ...
    Doing Something With targetRange
    ...
}

有什么想法吗?

【问题讨论】:

  • 单元格仍然是一个范围,范围对象是您访问它的方式。

标签: c# .net excel automation ms-office


【解决方案1】:

Excel.Range.Count 属性报告区域中有多少单元格。例如:

if (targetRange.Count > 1) 
{
   throw new ArgumentException(...);
}

Excel.Range.Cells[,] 索引器从范围的第一个区域返回任何单元格。但请注意,Excel 使用以 1 为基数的索引(不是以 0 为基数)。因此,要访问范围的左上角单元格,您可以使用:

Excel.Range topLeftCell = (Excel.Range)targetRange.Cells[1,1];

请注意,您必须在上面转换为 Excel.Range,因为 Excel.Range.Cells[,] 索引器返回一个转换为 System.Object 的 Excel.Range 对象。

您还应该注意,当范围包含单个单元格时,Excel.Range.Value 属性将返回一个原子值,例如双精度、字符串、布尔值等。但是,如果范围的第一个区域包含多个单元格,它将返回一个以 1 为基数的二维数组。例如:

if (targetRange.Count = 1) 
{
   object myValue = targetRange.get_Value(Type.Missing);
   MessageBox.Show(myValue.ToString());
}
else
{
    object[,] myArray = targetRange.get_Value(Type.Missing);
    for(int row = 1; row <= myValue.GetLength(0); row++)
    {
        for(int column = 1; column <= myValue.GetLength(1); column++)
        {
            MessageBox.Show(myArray[row, column].ToString());
        }
    }
}

希望这会有所帮助!

迈克

【讨论】:

    【解决方案2】:
    // n.b. cell is derived from a WorkSheet object xlSheet
    // by cell = xlSheet.Cells[row, col]
    
    public T CellValue<T>(object cell)
    {
        T result = default(T);
        try
        {
            Range rg = (Range)cell;
            object value = rg.Value2;
            if (value != null)
            {
                if (typeof(T) == typeof(DateTime))
                {
                    DateTime dateValue;
                    if (value is double)
                    {
                        dateValue = DateTime.FromOADate((double)value);
                    }
                    else
                    {
                        DateTime.TryParse((string)value, out dateValue);
                    }
                    result = (T)Convert.ChangeType(dateValue, typeof(T));
                }
                else
                    result = (T)Convert.ChangeType(value, typeof(T));
            }
        }
        catch
        {
            result = default(T);
        }
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 1970-01-01
      相关资源
      最近更新 更多