C# 如何最好地使用VSTO从excel中获取单元格值?

C# 如何最好地使用VSTO从excel中获取单元格值?,c#,excel,vsto,C#,Excel,Vsto,我正在尝试将excel中的单元格输入csharp,但不确定读取它的最佳变量类型 如果我将变量设为字符串,而单元格值为双精度,则会出现解析错误。如果我使变量加倍,那么当单元格是字符串时,它就不能工作 以下是我正在运行的代码: try { string i = Globals.Sheet1.Cells[7, 7].Value; double num; if (i == null) return; if (double.TryPar

我正在尝试将excel中的单元格输入csharp,但不确定读取它的最佳变量类型

如果我将变量设为字符串,而单元格值为双精度,则会出现解析错误。如果我使变量加倍,那么当单元格是字符串时,它就不能工作

以下是我正在运行的代码:

 try
 {
        string i = Globals.Sheet1.Cells[7, 7].Value;
        double num;
        if (i == null) return;

        if (double.TryParse(i, out num)) 
        {
             ...
        }
}
catch (Exception e)
{
       MessageBox.Show(e.ToString());
}

将其设置为对象,然后在从单元格中获取值后找到正确的类型


我不知道VSTO,但在Excel互操作程序集中,有一个
Value2
和一个Text属性,它们都返回了object,并且可以通过多态性转换为正确的类型。VS不提供这些吗?

您可以对对象调用ToString(),然后执行double.TryParse()以查看值是数字还是文本

double x = (double)Globals.Sheet1.Cells[7, 7].Value;

将获取双精度值或引发异常(无需捕获它,如果上游没有任何内容捕获它,它将正确显示在Excel的对话框中)。

我更喜欢直接获取文本值,并且不希望在大多数情况下处理基础数据类型。我得到的文本值如TravisWhidden注释所述,这里是我的VSTO C代码,用于实现从单元格读取并返回文本值,而不管基对象是什么

这是我的扩展方法,它在工作表页面之外工作:

using Excel = Microsoft.Office.Interop.Excel;

...

public static string CellGetStringValue(this Excel.Worksheet theSheet,
                                        int row, int column)
{
    var result = string.Empty;

    if (theSheet != null)
    {
        var rng = theSheet.Cells[row, column] as Excel.Range;
                
        if (rng != null)
            result = (string) rng.Text;
    }

    return result;
}

相同,但使用空传播和模式匹配

public static string CellGetStringValue(this Excel.Worksheet theSheet, 
                                        int row, int column)
{
    var result = string.Empty;

    if (theSheet?.Cells[row, column] is Excel.Range rng)
         result = (string)rng.Text;

    return result;
}

字符串foo=((范围)MyWorksheet.Cells[2,3]).Value2.ToString();虽然由于同样的问题,我没有读到这篇SO文章,.Text问题解决了我在单元格中存储日期时间的Value2问题。相反,它返回一个双精度值,并使用.Text.ToString()返回我想要的字段的文本值。我不知道.Text属性。谢谢。@traviswhiden我把你的评论作为建议,创建了一个扩展,用
文本
获取值;然后把它贴出来作为问题的答案。
 try
 {

    dynamic mycell = Globals.Sheet1.Cells[7, 7];
    double num;
    if (mycell.Value == null) return; //you can use mycell.Text too.

    if (double.TryParse(mycell.Text, out num)) 
    {
          .
          .
          .
    }
}
catch (Exception e)
{
       MessageBox.Show(e.ToString());
}