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