使用 C# 在 Excel 自动化函数中检索单个单元格值

发布于 2024-09-27 04:28:52 字数 239 浏览 1 评论 0原文

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

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

有什么想法吗?

i need to retrieve a single cell instead of Excel.Range in my method.

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

any idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

自此以后,行同陌路 2024-10-04 04:28:52

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

希望这有帮助!

麦克风

The Excel.Range.Count property reports how many cells are in the range. For example:

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

The Excel.Range.Cells[,] indexer returns any cells from the first area of the range. But note that Excel uses base 1 indexing (not base 0). So to access the top-left cell of the range, you could use:

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

Note that you have to cast to Excel.Range in the above because the Excel.Range.Cells[,] indexer returns an Excel.Range object cast as System.Object.

You should also beware that the Excel.Range.Value property will return an atomic value such as a double, string, boolean, etc. when the range consists of a single cell. It will return a two-dimensional base 1 array, however, if the first area of the range consists of more than one cell. For example:

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

Hope this helps!

Mike

月亮是我掰弯的 2024-10-04 04:28:52
// 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;
}
// 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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文