應用場景是Excel某N列數據想用Vim處理后再復制回Excel。
Vim提供了ole接口供其他語言調用,詳見:h ole.txt。
一、Excel內容轉到Vim新緩沖區
首先獲取Excel選中區域的內容
rng := ComObjActive("Excel.application").selection
下面是兩個函數:
- 激活Vim並保證當前是新緩沖區
- 把Excel的arrV寫到Vim新緩沖區
GVim_newBuffer() ;打開新緩沖區 { if ProcessExist("gvim.exe") { WinShow("ahk_class Vim") WinActivate("ahk_class Vim") oVim := ComObjActive("Vim.application") if oVim.eval('strlen(join(getline(1,"$"),"\r\n"))') ;如果是兩個空行也認為不是空緩沖區 oVim.eval('execute("$tabnew")') } else run("d:\soft\Vim\gvim.exe") ;替換成自己的gvim.exe路徑 } ;arrV可以是字符串 GVim_setBuffer(arrV) { oVim := ComObjActive("Vim.application") if IsObject(arrV) { loop(arrV.MaxIndex(1)) { r := A_Index sRow := "" loop(arrV.MaxIndex(2)) sRow .= arrV[r,A_Index].delete0() . A_Tab oVim.eval(format('setline({1},iconv("{2}","cp936","utf-8"))',r,RTrim(sRow,A_Tab))) } } else ;字符串 oVim.eval(format('setline(1,iconv("{1}","cp936","utf-8"))',arrV))
oVim.SendKeys('gg') ;順便刷新Vim }
然后整體的調用代碼:
rng := ComObjActive("Excel.application").selection
GVim_newBuffer() if (rng.cells.count = 1) GVim_setBuffer(rng.value) else GVim_setBuffer(rng.value) WinActivate("ahk_class Vim")
二、從Vim緩沖區內容轉到Excel
用如下命令就能獲取Vim當前緩沖區的內容(字符串格式),需要用iconv來轉換編碼供ahk使用。
oVim := ComObjActive("Vim.application") rs := oVim.eval('line("$")') ;行數 str := oVim.eval('iconv(join(getline(1,"$"),"\r\n"),"utf-8","cp936")')
對str的第一行內容用tab分割就知道有幾列數據了(如果后面列數比第1行多就會報錯了,可以多設置列數)
loop parse, str, "`n", "`r" { cs := StrSplit(A_LoopField, A_Tab).length() break }
然后就可以用ComObjArray把字符串轉成數組,再寫入Excel的selection即可
arrA := ComObjArray(12, rs, cs) loop parse, str, "`n", "`r" { r := A_Index-1 for k, v in StrSplit(A_LoopField, A_Tab) arrA[r,k-1] := v }
ComObjActive("Excel.application").selection.cells(1).value := arrA
這是今天剛出爐寫的代碼,希望能幫到大家,謝謝。轉載請注明出處