F# Can';从F中看不到Excel互操作中的某些属性#

F# Can';从F中看不到Excel互操作中的某些属性#,f#,c#-to-f#,f#-3.0,F#,C# To F#,F# 3.0,我正在使用F#应用程序中的Microsoft.Office.Interop.Excel库(14.0版),似乎无法引用Interop的接口/类中定义的某些属性 例如,如果我有一个工作表对象,我无法执行以下操作: let sht = // Get the Worksheet sht.PageSetup.CenterHeader <- // Set the header let sht=//获取工作表 sht.PageSetup.CenterHeader正如我在评论中所说,F#不支持,因此如果

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

例如,如果我有一个
工作表
对象,我无法执行以下操作:

let sht = // Get the Worksheet
sht.PageSetup.CenterHeader <- // Set the header
let sht=//获取工作表

sht.PageSetup.CenterHeader正如我在评论中所说,F#不支持,因此如果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"
#如果是交互式的
#r“办公室”
#r“Microsoft.Office.Interop.Excel”
#恩迪夫
打开Microsoft.Office.Interop.Excel
让setCenterHeader文件名工作表标题=
让file=System.IO.FileInfo(文件名)
让excel=ApplicationClass()
尝试
//确保使用完整路径,因为这将
//被解释为相对于Excel的流程,
//当前未执行一个
让工作簿=excel.Workbooks.Open(file.FullName)
工作表=工作簿。工作表。[工作表]:?>工作表

sheet.PageSetup.CenterHeader我对这些互操作库不太了解,但
CenterHeader
可能是在某些界面中定义的,您必须先转换
sht.PageSetup
(如
(sht.PageSetup:>ISomeInterface)。CenterHeader我想它在这里:-所以它是
(sht.PageSetup:>IPageSetup).CenterHeader谢谢您,先生!这就成功了…但是您必须使用
:?>
而不是
:>
。如果您把它作为答案,我会接受它。@siki-如果C#项目使用
工作表
,并且如果项目设置为嵌入互操作类型,则只嵌入其成员子集的
工作表的副本如果是这样的话,那么您可能想看看将“嵌入互操作类型”设置为false是否能解决您的问题。@siki-我不这么认为;据我所知,当NoPIA支持在.NET 4.0时间框架内添加到CLR时,没有对F#编译器进行任何更改以处理类型等价性(很遗憾),这可能是问题的根本原因。当将“嵌入互操作类型”设置为false时,您会看到哪些错误?