利用AutoHotkey實現Vim和Excel的數據傳遞


應用場景是Excel某N列數據想用Vim處理后再復制回Excel。

Vim提供了ole接口供其他語言調用,詳見:h ole.txt。

  一、Excel內容轉到Vim新緩沖區

首先獲取Excel選中區域的內容

rng := ComObjActive("Excel.application").selection

  下面是兩個函數:

  1. 激活Vim並保證當前是新緩沖區
  2. 把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

 

這是今天剛出爐寫的代碼,希望能幫到大家,謝謝。轉載請注明出處


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM