• WPS JS宏示例-批量添加链接



    📢作者: 小小明-代码实体

    📢博客主页:https://blog.csdn.net/as604049322

    📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!

    需求描述

    原始数据如下:

    image-20220924141218734

    共1.2万多条数据,现在我们需要给来源网址添加可以点击到目标网址的链接,并通过HS编码生成详情页链接。

    最终生成效果如下:

    image-20220924141910643

    这个案例用Python实现会很简单,但是我们可以通过这个简单的例子练习js宏的使用,由易到难。

    WPS JS宏入门

    视频学习资料:

    API文档

    另外是必须懂JavaScript语言的语法,本人对JavaScript语言的熟练程度远高于VB,所以WPS宏的js宏也相对写的非常顺手舒服。

    JavaScript文档教程推荐:

    有宏录制功能,即使在不查API文档的情况下,也能清楚知道一些操作代码。比如我们不知道如何添加链接,可以先点击开发工具的录制新宏功能:

    image-20220924144128695

    此时我们打开WPS宏编辑器,对照WPS主窗口,可以看到WPS的任何操作都会在对应的方法中生成代码:

    image-20220924144501779

    此时我们可以点击停止录制,之后我们的操作将不会在Macro1方法中自动生成代码。

    通过生成的代码可以很清楚的知道,js宏向一个单元格添加超链接的示例代码就是:

    Range("H2").Select();
    Selection.Hyperlinks.Add(Selection, "https://www.i5a6.com/hstree/01", "", "", "/hstree/01");
    

    下面我们根据以前编写VBA的经验,测试一下对应的JS宏代码。首先测试通过JS宏获取表格的行数:

    function test()
    {
    	Console.log(Range("A2").End(xlDown).Row);
    }
    

    结果在立即窗口中显示:

    12624
    

    可以看到顺利获取了最后一行的行号。

    注意:菜单中的插入->过程 可以创建函数。

    VB宏的调试方法是Debug.Print,但是JS宏也可以使用JavaScript语言的调试方法Console.log

    其他常用调试方法:

    alert("调试信息3") // 弹出警告框
    Console.clear() //清空所有日志
    

    WPS JS宏批量添加链接

    有了前面的测试,我们可以很轻松的编写添加链接的代码:

    function 添加来源链接()
    {
    	let max_row=Range("H2").End(xlDown).Row;
    	for(let i=2;i<=max_row;i++) {
    		let rng = Range("H"+i),v=rng.Value();
    		rng.Select();
    		Selection.Hyperlinks.Add(rng, "https://www.i5a6.com"+v, undefined, undefined, v);
    	}
    }
    

    然后再编写批量生成详情页链接的代码:

    function 生成详情页代码()
    {
    	let max_row=Range("A2").End(xlDown).Row;
    //	Application.ScreenUpdating=false;
    	for(let i=2;i<=max_row;i++){
    		let v = "/hscode/detail/"+Range("A"+i).Value().replace(".","");
    		let rng=Range("I"+i);
    		rng.Select();
    		Selection.Hyperlinks.Add(rng, "https://www.i5a6.com"+v, undefined, undefined, v);
    	}
    //	Application.ScreenUpdating=true;
    }
    

    上面代码执行耗时还是比较长的,可以通过Application.ScreenUpdating不进行屏幕刷新进行加速,即解除注释即可,但这样也会导致无法看到当前的执行进度。

    经过上述代码,就顺利解决了需求。

    Python批量添加链接

    我们试试直接用Python实现,完整代码:

    import openpyxl as oxl
    from openpyxl.styles import Side, Border, Alignment
    
    side = Side(style="thin", color="000000")
    border = Border(left=side, right=side, top=side, bottom=side)
    alignment = Alignment(horizontal="left", vertical="center")
    
    wb = oxl.load_workbook("海关进出口编码_带链接.xlsx")
    sht = wb.active
    for i in range(2, sht.max_row+1):
        # 添加来源链接
        cell = sht[f"H{i}"]
        cell.hyperlink = "https://www.i5a6.com"+cell.value
        cell.style = "Hyperlink"
        cell.border = border
        cell.alignment = alignment
        # 生成详情页代码
        v = "/hscode/detail/"+sht[f"A{i}"].value.replace(".", "")
        cell = sht[f"I{i}"]
        cell.value = v
        cell.hyperlink = "https://www.i5a6.com"+v
        cell.style = "Hyperlink"
        cell.border = border
        cell.alignment = alignment
    wb.save("text.xlsx")
    

    image-20220925131238460

    可惜速度有点不尽人意,保存时耗时居然达到一分钟。看来用Python还是js宏解决这种问题,效率上Python和宏 都差不多,Python并没有体现出明显的快的优势。

    Python控制WPS调用COM组件实现

    既然使用跨平台的Python库没那么快,试试调用COM组件来实现吧。

    完整代码:

    import xlwings as xw
    
    app = xw.App(add_book=False)
    wb = app.books.open("海关进出口编码_带链接.xlsx")
    sht = wb.sheets.active
    max_row = sht.range("A2").end('down').row
    app.screen_updating = False
    for i in range(2, max_row+1):
        cell = sht.range(f"H{i}")
        sht.api.Hyperlinks.Add(cell.api, "https://www.i5a6.com"+cell.value)
    
        v = "/hscode/detail/"+sht.range(f"A{i}").value.replace(".", "")
        cell = sht.range(f"I{i}")
        sht.api.Hyperlinks.Add(cell.api, "https://www.i5a6.com"+v, None, None, v)
    app.screen_updating = True
    

    运行近7分钟依然没运行完,我已经无法忍受,直接强制中断了程序:

    image-20220925141901477

    此时我再执行app.screen_updating = True后查看wps后发现,才跑9千多条数据:

    image-20220925141813897

    所以对于这种大批量的改样式的需求,直接使用宏,或完全跨平台的Python库更佳。

    for循环补充

    对于批量添加链接,遍历单元格的另外一种写法是:

    for cell in sht.range(sht.range("H2"), sht.range("H2").end('down')):
        sht.api.Hyperlinks.Add(cell.api, "https://www.i5a6.com"+cell.value)
    

    对于JS宏则需要这样写:

    function 添加来源链接()
    {
    	for(cell of Range(Range("H2"),Range("H2").End(xlDown))){
    		cell.Select();
    		Selection.Hyperlinks.Add(cell, "https://www.i5a6.com"+cell.Value());
    	}
    }
    

    经测试,通过宏,假如不选择单元格,直接添加链接,经常报错中断。这也是JS宏使用Selection添加超链接的原因。

    报错示例:

    for(cell of Range(Range("H2"),Range("H2").End(xlDown))){
    	ActiveSheet.Hyperlinks.Add(cell, "https://www.i5a6.com"+cell.Value());
    }
    
  • 相关阅读:
    Java Stream 的使用
    GOM登录器配置免费版生成图文教程
    什么是Verilog?
    智慧茶园:茶厂茶园监管可视化视频管理系统解决方案
    绿色校园
    linux手动安装scapy2.5
    5G vs 4G
    季铵盐离子液体4-(苯甲酸)三乙胺溴(QAIL)固载金属-有机骨架材料MIL-101(科研)
    上周热点回顾(5.8-5.14)
    ASP.NET Core 产生连续 Guid
  • 原文地址:https://blog.csdn.net/as604049322/article/details/127037824