F#动态地将行插入Excel

时间:2015-02-18 12:38:29

标签: excel f#

我需要动态插入excel中的行。我正在生成一张发票,该发票可以有不同数量的交易,并且每个交易需要一行。

我想从一行开始(第17行)并将其复制为n次交易。

任何人都可以在F#中明白这一点吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

我不一定会推荐这种方法,但是如果您通过F#动态运算符动态解释为就可以了。 >(可以找到here 的实现),然后您可以在不引用特定库的情况下执行Interop。

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

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

修改

事实证明,许多基于反射的动态算子定义并不适合互操作,包括上面链接的那个。提供我自己的:

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()