在 F# 的 Excel Interop 中看不到某些属性

Can't see some properties in Excel Interop from F#

我正在使用 F# 应用程序中的 Microsoft.Office.Interop.Excel 库(版本 14.0),我似乎无法引用 Interop interfaces/classes 中定义的某些属性。

例如,如果我有一个 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)).

正如我在评论中所说,F# 不支持 type equivalence for embedded interop types,因此如果 C# 项目启用了嵌入互操作类型,则 F# 编译器可能无法确定要使用哪个版本的互操作类型.由于嵌入在 C# 输出程序集中的类型已被简化为仅使用的成员,这使得 F# 编译器无法看到来自主互操作程序集的类型版本中存在的成员。

解决方法是关闭 C# 项目上的嵌入互操作类型。

这对我有用:

#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 的版本匹配 installed/used。