1

我正在尝试处理从 C# 类传递到 F# 类库的 Excel 工作表中的数据。C# 项目是一个 Excel AddIn 项目,F# 类是这个。

namespace DataLib
open System
open System.Reflection
open System.Collections.Generic
open FSharpx.TypeProviders.Excel
open Microsoft.FSharp.Core.CompilerServices
open System.IO
open System.Linq
open System.Text
open System.Windows.Forms
open Microsoft.Office.Core
open Microsoft.Office.Interop.Excel
open Microsoft.Office.Tools.Excel
type sheet = Microsoft.Office.Interop.Excel.Worksheet
type Class1() = 
    member this.X = "F#"
    member this.Readsheet (sh:obj)=
        let sht = sh:?>Worksheet// exception here
        let v=sh.Cells.[1,1] // Exception COM object does not have Cells property etc...
        sh.Range.Item(1,1).ToString() //error here ca

所以如果我像这样从 C# 调用类

using DataLib;

public void useExcel(sh as Excel.Worksheet) //Excel.Worksheet is Excel Interop object
{
      Class1 one = new Class1()
      one.Readsheet(sh) //Exception thrown here in F# class
}
4

2 回答 2

2

F# 和 C# 之间的互操作不是问题。您的 F# 类中有各种错误:

  1. 您将 Objectsh转换为 Worksheet sht,但错误地使用sh而不是sht稍后使用。

  2. Range没有Item财产。

  3. 您几乎可以将与 Excel 编程相关的所有内容添加到项目中。你只需要Microsoft.Office.Interop.Excel在这个例子中。最好删除不必要的open命令,尤其Microsoft.Office.Tools.Excel是在Interop.Excel可能具有相同名称的对象但具有不兼容的字段/接口之后打开的命令。

  4. 您应该通过 aWorksheet而不是 aobj以避免向下转换。

一个有效的最小 F# 示例:

namespace DataLib

open Microsoft.Office.Interop.Excel

type Class1() = 
    member this.X = "F#"
    member this.Readsheet (sh: Worksheet) =
        let v = sh.Cells.[1, 1]
        sh.Range(1, 1).ToString()

此外,您的 C# 语法有点偏离,您需要类似以下内容:

// Add "using Microsoft.Office.Interop.Excel;" 
// and "using DataLib;" to namespace declarations
public void useExcel(Worksheet sh) // Worksheet is Excel Interop object
{
    Class1 one = new Class1();
    one.Readsheet(sh);
}
于 2012-12-20T20:16:23.533 回答
0

我想这个问题有点复杂。我在 F# Library 项目中添加了对 Microsoft.Office.Tools.Excel 框架的引用。那是不行!它会给出编译器错误。在 F# 中,如果您正在编写作为 VSTO C# 项目一部分的 F# 库,请避免在 F# 库中引用 Microsoft.Tools.Office.Excel 命名空间。否则你会有问题!因此,只需将 Microsoft.Office.Interop.Excel 程序集的引用添加到您的项目并在 F# 文件中打开 Microsoft.Office.Interop.Excel。

于 2012-12-20T21:39:19.427 回答