[英]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.