C# 如何最好地使用VSTO从excel中获取单元格值?
我正在尝试将excel中的单元格输入csharp,但不确定读取它的最佳变量类型 如果我将变量设为字符串,而单元格值为双精度,则会出现解析错误。如果我使变量加倍,那么当单元格是字符串时,它就不能工作 以下是我正在运行的代码: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
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());
}