2010-12-03 64 views
3

我想从Excel中获取单元格到csharp,但不知道什么是最好的变量类型来读取它。如何使用VSTO从excel中获取单元格值?

如果我让变量为字符串,单元格值为双精度型,我会得到一个解析错误。如果我使变量double,那么当单元格是一个字符串它不会工作。

这里是我运行的代码:

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

回答

4

使它成为一个对象,然后找出正确的类型,你已经得到的值出细胞后。

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

+1

串富=((范围)MyWorksheet.Cells [2,3])Value2.ToString(); – 2012-08-08 22:18:46

+1

尽管由于相同的问题,我没有得到这篇SO文章,但.Text问题解决了我在Value2中使用DateTime存储在单元格中的问题。相反,它向我返回了一个double值,并且使用.Text.ToString()向我返回了我想要的字段的文本值。我不知道.Text属性。谢谢。 – TravisWhidden 2013-01-31 17:23:49

0

你可以只调用对象的ToString(),然后就double.TryParse(),看看是否值是数字或文字

0

只需

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

,会得到双重价值或抛出一个异常(无需捕获它,如果没有捕获它,它将在Excel的对话框中正确显示)。

0

我更喜欢直接获取文本值,并且不希望大部分处理底层数据类型。我将文本值作为TravisWhidden注释提到,这里是我的VSTO C#代码,用于实现从单元格读取并返回文本值,而不考虑基础对象。

这是我的扩展方法,其工作原理关闭工作表页的:

public static string CellGetStringValue(this WorksheetBase 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; 
} 
0
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()); 
} 
相关问题