2013-05-13 30 views
0

我正在嘗試從使用Excel互操作的電子表格單元格值,但下面的代碼我使用的是產生一個編譯器錯誤:與檢索的單元格值的Excel互操作

One or more types required to compile a dynamic expression cannot be found. Are you missing a reference?

Range currentFind = sheet.Cells.Find("some string", Type.Missing, 
        XlFindLookIn.xlValues, XlLookAt.xlPart, 
        XlSearchOrder.xlByRows, XlSearchDirection.xlNext, 
        false, Type.Missing, Type.Missing); 

if (currentFind[1,1].Value != null) 
{ 
    string CellValue = currentFind[1,1].Value.ToString(); 
} 

有什麼想法這裏發生了什麼?我猜猜可能需要施放什麼東西,但我不確定是什麼。我試過鑄造currentFind[1,1].Value,但這似乎並不奏效。

編輯:

我找到了一個解決辦法,設置Embed Interop TypesFalse上的參考,但我還是想知道是怎麼回事,如何處理這種情況。

+0

你倆所提供的答案回答你的問題還是你去它的底部以不同的方式? – 2013-06-13 10:26:19

+0

@ Andy-對不起,我從來沒有意識到有人回答了這個,因爲我已經知道了。感謝您提供的有用信息! – 2013-06-24 18:55:21

回答

4

您已經添加到Microsoft.CSharp以及Microsoft.Office.Interop.Excel參考?這個問題在過去解決了這個問題 - 例外情況是說缺少解決dynamic類型Value屬性所需的類型信息。異常通常會嘗試建議缺少的參考。

嵌入互操作類型發生了什麼?

.NET(C#)4.0引入了dynamic並且能夠處理COM host return object values as the dynamic type。這可以讓我們的代碼在編寫代碼的時候更輕鬆,因爲我們不必在編寫代碼時將返回對象顯式地轉換爲我們想要的類型。如果您的程序集中的「嵌入互操作類型」設置爲true,則會發生這種情況;這也是您在VS中添加的引用的默認值。

本質VS被嵌入PIA的子集您在集中使用,在編譯時的類型(見答案"what is the advantage of .net4's new no pia feature [deploying PIA's]"爲什麼這是件好事)。但是,它需要訪問參考樹中的所有PIA來執行此操作。

dynamic允許後期綁定。所以我猜你的情況Value已成爲一種動態類型,將在運行時解決,這是錯誤的,因爲它不能得到正確的大會和PIA參考。如果您將「嵌入互操作類型」設爲false,則Value將變爲object類型,這可以防止此問題(但您現在需要在某個時刻轉換爲正確的類型)。

爲什麼嵌入PIA信息?

它可以更容易地部署和支持Office的多個版本(只要您在早期/後期版本中不使用不受支持的功能)。雖然這並不容易,很多可能會出錯。

MSDN - Walkthrough: Office Programming (C# and Visual Basic)提到這一點,但除了說這是件好事之外,沒有什麼大不了的。

舉個例子:如果我火了VS2010中的項目,並引用VSTO Excel 2010的互操作位於

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll

然後我不明白這個問題,嵌入互操作類型設置爲true,因爲它會自動添加

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\Microsoft.CSharp.dll

也作爲參考。如果我然後取出Microsoft.CSharp參考,我得到的編譯器錯誤,但它指出了下面的錯誤,這是怎麼發現我的解決方案最初是:

One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll?

0

看來你需要添加一些對你的項目的參考。不知道你有什麼其他代碼,但如果是這樣,你需要添加互操作程序集到你的項目中。檢查編輯器是否標記有錯誤的行,並檢查在該行中使用的對象的類型。

在一個側面說明我看到一個潛在的問題,下面一行:

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

如果未找到該值,則currentFind爲空,並且您試圖訪問無效像數組。嘗試檢查currentFind不爲空:

if (currentFind != null) 
+0

是的,我已經在項目中的互操作程序集。你對這個潛在的問題是正確的,但這不是我正在運行的實際代碼,只是一個更簡單的測試用例。 – 2013-05-14 20:12:39

相關問題