嵌入式图片转浮动式图片-JSA方法

32位wps 正常运行.

function copyPic(){
    Range("B2").Select() //嵌入式图片单元格
    Selection.Copy();
}

function pic2(){
    copyPic()
    
    const {GlobalAlloc,GlobalLock,GlobalUnlock,RtlMoveMemory} = ffi.LoadLibrary('kernel32.dll', {

            GlobalAlloc: { returnType: "pointer", parameters: ["uint32", "uint32"] },            
            GlobalLock: { returnType: "pointer", parameters: ["uint32"] },            
            GlobalUnlock: { returnType: "bool", parameters: ["uint32"] },            
            RtlMoveMemory: { returnType: "void", parameters: ["pointer", "pointer", "uint32"] }
            
    });

    const {GetClipboardFormatNameA,CountClipboardFormats,EnumClipboardFormats,OpenClipboard,CloseClipboard,GetClipboardData,
            EmptyClipboard,SetClipboardData,IsClipboardFormatAvailable} = ffi.LoadLibrary("user32.dll",{
            
            GetClipboardFormatNameA:{ returnType: "uint32", parameters: ["uint32","pointer","int32"]},
            CountClipboardFormats: { returnType: "uint32", parameters: []},
            EnumClipboardFormats:{ returnType: "uint32", parameters: ["uint32"]},
            OpenClipboard:{ returnType: "bool", parameters: ["pointer"]},
            CloseClipboard:{ returnType: "bool", parameters: []},
            GetClipboardData:{ returnType: "uint32", parameters: ["uint32"]},
            EmptyClipboard: { returnType: "bool", parameters: [] },
            SetClipboardData: { returnType: "pointer", parameters: ["uint32", "pointer"] },
             IsClipboardFormatAvailable : { returnType: "bool", parameters: ["uint32"] }
                 
    })
    OpenClipboard(null);    
            let count = CountClipboardFormats();

        let nextFormat = 0;
        
        for(let i=0;i<count;i++){
            nextFormat = EnumClipboardFormats(nextFormat);            
            try{
                let buf = new Uint8Array(56);
                let result = GetClipboardFormatNameA(nextFormat,buf.buffer,54)                
                let str = Uint8ArrayToString(buf)               
                if(str === "HTML Format"){                    
                    break
                }
                 
            }
            catch{
                CloseClipboard();
            }
            
        }
    
    
    let hClipboard = GetClipboardData(nextFormat);
        
        
        if(!hClipboard){CloseClipboard();return;}
        let mdib = GlobalLock(hClipboard);
    
    //console.log("数据句柄:" +hClipboard )
    try{
        let htmltext = mdib.DerefString();
        Console.log(htmltext.length)
        const regex = /C:\\.*\.png/g;
        const match = htmltext.match(regex);
        
        if(match[0].length > 20){
            Range("B2").Value2 = '';
            let shapes = Application.Worksheets.Item(2).Shapes
            shapes.AddPicture(match[0], msoTrue, msoTrue, Range("B2").Left, Range("B2").Top, Range("B2").Width, Range("B2").Rows.RowHeight)
            
        }        
    
    }catch{
        
    }
    
    GlobalUnlock(hClipboard);
    CloseClipboard();
    
    return;
    
}


function Uint8ArrayToString(fileData){
  let dataString = "";  
  for (var i = 0; i < fileData.length; i++) {
      if(fileData[i] == 0) break;
    dataString += String.fromCharCode(fileData[i]);   
  }
 
  return dataString

}

32/64位下,用powershell代码能少点

function copyPic(){
    Range("B2").Select() //嵌入式图片单元格
    Selection.Copy();
}


function test4(){
    copyPic()
    
    Shell(`powershell -command "Add-Type -AssemblyName System.Windows.Forms
[Windows.Forms.Clipboard]::GetData("HTML Format") >> d:/testt.txt"`,jsNormalNoFocus)
    let str = FileSystem.readFileString("d:/testt.txt")
    //console.log(str)
    const regex = /C:\\.*\.png/g;
        const match = str.match(regex);
        
        if(match[0].length > 20){
            Range("B2").Value2 = '';
            let shapes = Application.Worksheets.Item(2).Shapes
            shapes.AddPicture(match[0], msoTrue, msoTrue, Range("B2").Left, Range("B2").Top, Range("B2").Width, Range("B2").Rows.RowHeight)
            
        }        
}

每次重启电脑,wps可能都重新注册剪切板格式,导致格式代码每次可能都不同,这样用winAPI就需要有个遍历的过程。powershell直接按格式名称取内容。比较方便。

浏览 125
2
5
分享
5 +1
9
2 +1
全部评论 9
 
wils
wils Lv.2 潜力创作者

Lv.2潜力创作者

厉害,真是重大发现
· 海南省
回复
恰同学少年
64位,还需要完善。应该是A函数和W函数的区别
· 黑龙江省
回复