嵌入式图片转浮动式图片-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直接按格式名称取内容。比较方便。
Lv.2潜力创作者