Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 使用Excel互操作检索单元格值_C# 4.0_Vsto_Excel Interop - Fatal编程技术网

C# 4.0 使用Excel互操作检索单元格值

C# 4.0 使用Excel互操作检索单元格值,c#-4.0,vsto,excel-interop,C# 4.0,Vsto,Excel Interop,我试图使用Excel互操作从电子表格中检索单元格值,但我使用的以下代码正在生成编译器错误: 找不到编译动态表达式所需的一个或多个类型。你错过了推荐人吗 知道这是怎么回事吗?我猜可能需要一些演员,但我不确定是什么。我尝试过转换currentFind[1,1]。Value,但似乎不起作用 编辑: 我已经找到了一个解决方法,在引用中将嵌入互操作类型设置为False,但我仍然想知道这里发生了什么以及如何处理这种情况。似乎您需要为您的项目添加一些引用。不确定您还有哪些其他代码,但如果是,则需要将互操作程序

我试图使用Excel互操作从电子表格中检索单元格值,但我使用的以下代码正在生成编译器错误:

找不到编译动态表达式所需的一个或多个类型。你错过了推荐人吗

知道这是怎么回事吗?我猜可能需要一些演员,但我不确定是什么。我尝试过转换
currentFind[1,1]。Value
,但似乎不起作用

编辑:


我已经找到了一个解决方法,在引用中将
嵌入互操作类型设置为
False
,但我仍然想知道这里发生了什么以及如何处理这种情况。

似乎您需要为您的项目添加一些引用。不确定您还有哪些其他代码,但如果是,则需要将互操作程序集添加到项目中。检查编辑器是否标记有错误的行,并检查该行中使用的对象的类型

在旁注中,我看到以下行存在潜在问题:

if(currentFind[1,1].Value!=null)

如果未找到该值,则currentFind为null,并且您试图像数组一样访问null。尝试检查currentFind是否不为null:

if (currentFind != null)

似乎您需要为您的项目添加一些参考。不确定您还有哪些其他代码,但如果是,则需要将互操作程序集添加到项目中。检查编辑器是否标记有错误的行,并检查该行中使用的对象的类型

在旁注中,我看到以下行存在潜在问题:

if(currentFind[1,1].Value!=null)

如果未找到该值,则currentFind为null,并且您试图像数组一样访问null。尝试检查currentFind是否不为null:

if (currentFind != null)

您是否添加了对
Microsoft.CSharp
以及
Microsoft.Office.Interop.Excel
的引用?这在过去为我解决了这个问题-例外是缺少解析
属性的
动态
类型所需的类型信息。异常通常也尝试建议缺少的引用

嵌入互操作类型发生了什么变化?

.NET(C#)4.0的引入和处理。这应该会使我们在编写代码时的生活更轻松,因为我们不必在编写代码时显式地将返回对象强制转换为我们想要的类型。如果程序集上的“嵌入互操作类型”设置为
true
,则会发生这种情况;这也是您在VS中添加的引用的默认值

本质上,VS是在编译时为您在程序集中使用的类型嵌入PIA的子集(请参阅的答案以了解为什么这样做是好的)。但是,要做到这一点,它需要访问引用树中的所有PIA

动态
允许后期绑定。所以我猜在你的例子中,
Value
已经成为一个动态类型,它将在运行时被解析,这是错误的,因为它无法获得正确的程序集和PIA引用。如果将“嵌入互操作类型”设置为
false
,则
Value
将成为
对象
类型,这将防止出现问题(但现在需要在某个时候转换为正确的类型)

为什么要嵌入PIA信息?

它可以使部署和支持多个版本的Office变得更容易(只要在测试之前/之后的版本中不使用不受支持的功能)。但这并不容易;很多事情都会出错

提到这一点,但除了说这是一件好事之外,没有什么大不了的

例如:如果我在VS2010中启动一个项目,并引用位于

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll 作为参考。如果随后删除
Microsoft.CSharp
引用,我会得到编译器错误,但它指出以下错误,这就是我最初找到解决方案的原因:

找不到编译动态表达式所需的一个或多个类型。是否缺少对Microsoft.CSharp.dll和System.Core.dll的引用


您是否添加了对
Microsoft.CSharp
以及
Microsoft.Office.Interop.Excel
的引用?这在过去为我解决了这个问题-例外是缺少解析
属性的
动态
类型所需的类型信息。异常通常也尝试建议缺少的引用

嵌入互操作类型发生了什么变化?

.NET(C#)4.0的引入和处理。这应该会使我们在编写代码时的生活更轻松,因为我们不必在编写代码时显式地将返回对象强制转换为我们想要的类型。如果程序集上的“嵌入互操作类型”设置为
true
,则会发生这种情况;这也是您在VS中添加的引用的默认值

本质上,VS是在编译时为您在程序集中使用的类型嵌入PIA的子集(请参阅的答案以了解为什么这样做是好的)。但是,要做到这一点,它需要访问引用树中的所有PIA

动态
允许后期绑定。所以我猜在你的例子中,
Value
已经成为一个动态类型,它将在运行时被解析,这是错误的,因为它无法获得正确的程序集和PIA引用。如果将“嵌入互操作类型”设置为
false
,则
Value
将成为
对象
类型,这将防止出现问题(但现在需要在某个时候转换为正确的类型)

为什么要嵌入PIA信息?

它可以使部署和支持多个版本的Office变得更容易(只要在测试之前/之后的版本中不使用不受支持的功能)。但这并不容易;很多事情都会出错

提到这一点,但除了说这是一件好事之外,没有什么大不了的