F#dynamic地将行插入到Excel中

我需要在Excel中dynamic地插入行。 我正在生成一个发票,可以有不同数量的交易,并为每个交易需要一个行。

我想从一行开始(第17行),并复制n个事务。

任何人都可以在F#中做到这一点吗?

在这里输入图像描述

我不一定会推荐这种方法,但是如果您可以通过F#的dynamic操作符可以在这里find它的实现)来 dynamic地解释,那么您可以在没有任何对特定库的引用的情况下执行Interop。

let xlApp = System.Runtime.InteropServices.Marshal.GetActiveObject "Excel.Application" let rng : obj = xlApp?ActiveWorkbook?ActiveSheet?Rows(17) rng?Copy() rng?Insert() 

即将一行复制到剪贴板,并将其插入到相同的位置。

编辑

事实certificate,dynamic操作符的许多基于reflection的定义不适合互操作,包括上面链接的定义。 提供我自己的:

 let (?) (o: obj) name : 'R = let bindingFlags = System.Reflection.BindingFlags.GetProperty let invocation args = o.GetType().InvokeMember(name, bindingFlags, null, o, args) let implementation args = let argType, resType = FSharpType.GetFunctionElements typeof<'R> if argType = typeof<unit> then [| |] elif FSharpType.IsTuple argType then FSharpValue.GetTupleFields args else [| args |] |> invocation |> fun res -> if resType = typeof<unit> then null else res if FSharpType.IsFunction typeof<'R> then FSharpValue.MakeFunction(typeof<'R>, implementation) else invocation null |> unbox<'R> 

现在我们可以定义一个函数来插入可变数量的复制行。

 let copyAndInsertRow17 n = if n > 0 then let xlApp = System.Runtime.InteropServices.Marshal.GetActiveObject "Excel.Application" let sheet = xlApp?ActiveWorkbook?ActiveSheet sheet?Rows(17)?Copy() sheet?Range(sheet?Rows(17 + 1), sheet?Rows(17 + n))?Insert()