无法在F#的Excel Interop中看到一些属性

时间:2016-03-15 17:04:35

标签: f# c#-to-f# f#-3.0

我正在使用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)).

2 个答案:

答案 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的匹配版本。