当前位置: 首页 > news >正文

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


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

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

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

需求描述

原始数据如下:

image-20220924141218734

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

最终生成效果如下:

image-20220924141910643

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

WPS JS宏入门

视频学习资料:

  • WPS JS宏入门视频教程:https://www.wps.cn/learning/course/detail/id/330734.html

API文档:

  • WPS JS宏API文档:https://open.wps.cn/docs/client/wpsLoad
  • Excel VBA 参考文档:https://learn.microsoft.com/zh-cn/office/vba/api/overview/excel

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

JavaScript文档教程推荐:

  • 廖雪峰:https://www.liaoxuefeng.com/wiki/1022910821149312
  • w3school:https://www.w3school.com.cn/js/index.asp
  • 菜鸟教程:https://www.runoob.com/js/

有宏录制功能,即使在不查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核心——面向对象编程(上)包-继承-多态
  • Ambari自动部署Hadoop集群实战
  • 33.0、C语言——C语言预处理(1) - 翻译环境详解
  • java-php-python-springboot网上订餐系统计算机毕业设计
  • 【VUE项目实战】66、上线-通过node创建Web服务器
  • About 9.25 This Week
  • 三、基本命令
  • MySQL中select ... for update会锁表还是锁行?
  • 计算机毕业设计选题 SSM大学生企业推荐系统(含源码+论文)
  • 【Java设计模式 思想原则重构】设计思想、设计原则、重构总结
  • js逆向-逆向基础
  • 【前端】【探究】HTML - input类型为file时如何实现自定义文本以更好的美化
  • 二叉树的dp问题和Morris遍历
  • 重新认识IO以及五种IO模型(理论认识)
  • leetcode: 647. 回文子串
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【个人向】《HTTP图解》阅后小结
  • angular2 简述
  • ComponentOne 2017 V2版本正式发布
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • leetcode386. Lexicographical Numbers
  • leetcode388. Longest Absolute File Path
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • PAT A1092
  • quasar-framework cnodejs社区
  • 阿里云Kubernetes容器服务上体验Knative
  • 规范化安全开发 KOA 手脚架
  • 两列自适应布局方案整理
  • 使用 @font-face
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 移动端解决方案学习记录
  • 赢得Docker挑战最佳实践
  • 阿里云ACE认证之理解CDN技术
  • ​Java并发新构件之Exchanger
  • #pragma预处理命令
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (4)Elastix图像配准:3D图像
  • (LeetCode) T14. Longest Common Prefix
  • (Note)C++中的继承方式
  • (一)基于IDEA的JAVA基础1
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net7 环境安装配置
  • /bin/rm: 参数列表过长"的解决办法
  • @ModelAttribute使用详解
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [Android]常见的数据传递方式
  • [Android]如何调试Native memory crash issue
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [IE编程] IE 是如何决定Accept-Language 属性的