簡體   English   中英

F#將行動態插入Excel

[英]F# insert row into Excel dynamically

我需要在Excel中動態插入行。 我正在生成一張發票,該發票可以具有不同數量的交易,並且每次交易都需要一行。

我想從一行開始(第17行)開始復制n次事務。

誰能在F#中做到這一點?

在此處輸入圖片說明

我不一定會推薦這種方法,但是如果您可以通過F#的dynamic運算符可以在此處找到其實現)來 動態解釋,那么您可以在不參考任何特定庫的情況下進行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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM