我正在使用F#应用程序中的Microsoft.Office.Interop.Excel
库(版本14.0),我似乎无法引用Interop接口中定义的某些属性/类。
例如,如果我有一个Worksheet
对象,我就无法执行以下操作:
let sht = // Get the Worksheet
sht.PageSetup.CenterHeader <- // Set the header
它无法找到CenterHeader
作为PageSetup
界面的属性,即使它在对象浏览器中查看Interop dll也是如此。
仅供参考,我使用的Interop dll来自VS目录:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll
更新: 我实际上说得太快了。不幸的是,建议的演员解决方案也没有奏效。 VS认为它没问题,但它在运行时因以下错误而失败:
Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Excel.IPageSetup'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000208B4-0001-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
答案 0 :(得分:0)
正如我在评论中所说,F#不支持type equivalence for embedded interop types,因此如果C#项目启用了嵌入互操作类型,则F#编译器可能无法确定要使用哪个版本的互操作类型。由于嵌入在C#输出程序集中的类型已被拆分为仅使用的成员,因此可以使F#编译器无法从主互操作程序集中看到该类型版本中存在的成员。
解决方法是在C#项目上关闭Embed Interop Types。
答案 1 :(得分:-1)
这对我有用:
#if INTERACTIVE
#r "office"
#r "Microsoft.Office.Interop.Excel"
#endif
open Microsoft.Office.Interop.Excel
let setCenterHeader fileName worksheet header =
let file = System.IO.FileInfo(fileName)
let excel = ApplicationClass()
try
// Make sure to use full path since this will
// be interpreted as relative to Excel's process,
// not currently executing one
let workbook = excel.Workbooks.Open(file.FullName)
let sheet = workbook.Worksheets.[worksheet] :?> Worksheet
sheet.PageSetup.CenterHeader <- header
workbook.Save()
finally
excel.Application.Quit()
setCenterHeader "TestWorksheet.xlsx" "Sheet1" "My header 1"
setCenterHeader "TestWorksheet.xlsx" "Sheet2" "My header 2"
setCenterHeader "TestWorksheet.xlsx" "Sheet3" "My header 3"
您可能希望确保安装/使用了PIA和Office的匹配版本。