当前位置:   article > 正文

wps js宏获取工作簿、工作表、单元格的值、链接转图片、单元格区域数据转二维数组、保存工作簿的常用Excel操作_wps js工作表表示方法

wps js工作表表示方法

        JS宏 / JSA的全称是JavaScript for Application & WPS,是内置在WPS Office的应用程序对象,通过JavaScript语言进行访问操作,支持部分ES6语法,因此需要一定的 JavaScript 基础,对于前端程序员的你来说非常简单

        本篇介绍 JavaScript 操作 Excel Application 对象的常用方法,助你从VBA切换至JS,WPS Office建议更新到最新版本

向单元格写入二维数组数据、另存为xlsx工作簿文件、另存为txt文本文件

Range.Resize(行数,列数),以某个单元格为起点扩展区域

user为二维数组,其中user.length表示一维长度,user[0].length表示二维长度

Env对象主要用于取系统环境基本信息,这个对象目前提供了取用户目录、临时目录等相关信息,此对象需要WPS 2024版本,老版本不支持

Env.GetDesktopPath(),获取用户桌面目录

  1. function writeData() {
  2. const user = [
  3. ['name', 'sex', 'age'],
  4. ['清风', '男', 25],
  5. ['若雨', '男', 22],
  6. ['猫猫', '女', 18],
  7. ['童颜', '女', 22],
  8. ['茶季', '女', 21]
  9. ]
  10. //A1:B6区域写入数据 Range('A1').Resize(6, 3).Value2 = user
  11. Range('A1').Resize(user.length, user[0].length).Value2 = user
  12. //let path = Env.GetDesktopPath() + '\\user' //获取桌面目录,Env对象仅支持WPS2024
  13. let path = Application.DefaultFilePath + '\\user'
  14. ActiveSheet.Copy() //复制工作表,如果Copy方法没有参数则默认新建一个工作簿
  15. ActiveWorkbook.SaveAs(path, 20) //另存为txt文件,XlFileFormat枚举文件格式:xlTextWindows
  16. ActiveWorkbook.SaveAs(path, 51) //另存为xlsx文件,XlFileFormat枚举文件格式:xlWorkbookDefault
  17. //js字符串模板
  18. MsgBox(`文件路径在: \n${path}.txt \n${path}.xlsx`)
  19. }

 

读写单元格

获取A1:C6单元格区域的值,并将数据写入E1:G6单元格区域

  1. //读取A1、A2单元格的值,两种方法
  2. let str1 = Range('A1').Value()
  3. let str2 = Range('A2').Value2
  4. console.log(str1) //输出name
  5. console.log(str2) //输出清风
  6. //写入A1单元格
  7. Range('A1').Value2 = '姓名'
  8. //读取A1:B6单元格区域的值,获取的数据类型为二维数组
  9. let arr = Range('A1:C6').Value2
  10. //写入D1:E6单元格区域
  11. Range('E1:G6').Value2 = arr

 

选中以A1单元格为起点的连续非空白区域,复制到A8单元格

Range.CurrentRegion属性返回一个Range对象,该对象表示当前区域。当前区域是空白行和空白列的任何组合所限定的区域。此为只读属性。效果相当于快捷键 Ctrl + A 选定有效的数据区域。

  1. let user = Range('A1').CurrentRegion.Select()
  2. Selection.Copy(Range('A8'))

 

 

将选定的单元格区域复制为图片,粘贴到A15单元格
  1. let user = Range('A1').CurrentRegion.Select()
  2. Selection.CopyPicture()
  3. Range('A15').PasteSpecial()

打开指定路径的工作簿、导入txt文本文件

注意直接在代码写文件路径,要转义反斜杠\

例 D:\test.xlsx 要写成 D:\\test.xlsx 或者 D:/test.xlsx

  1. //打开工作簿,需要完整路径,返回一个代表打开的工作簿的Workbook对象
  2. let wb1 = Workbooks.Open('D:\\user.xlsx')
  3. //获取已经打开的工作簿对象,工作簿名称或全路径都可以
  4. let wb2 = Workbooks('user.xlsx')
  5. let wb3 = Workbooks('D:\\user.xlsx')
  6. //导入txt文本文件,如何分列数据请参考官方文档的Workbooks.OpenText方法
  7. Workbooks.OpenText('D:\\user.txt')

遍历指定文件夹下的文件
  1. function traverse_files() {
  2. let folder = 'D:\\*.xlsx' //遍历D盘下的xlsx文件
  3. let files = Dir(folder)
  4. while (files) {
  5. console.log(files)
  6. files = Dir()
  7. }
  8. }

获取工作簿对象、工作表对象
  1. let wb = ThisWorkbook //获取当前代码所在的工作簿对象
  2. let sht1 = wb.ActiveSheet //获取当前显示的工作表(活动工作表)
  3. let sht2 = wb.Sheets('Sheet1') //获取当前名为Sheet1的工作表

JavaScript Fetch API 网络请求,抓取网页数据

Fetch方法仅支持WPS2024,2023以前的版本不可用,需要了解 JavaScript 回调函数、异步、Promise、Async

  1. function sendhttp() {
  2. let wb = Workbooks.Add()
  3. wb.SaveAs(`${Application.DefaultFilePath}/video-${Date.now()}`)
  4. let url = "https://api.bilibili.com/x/v3/fav/resource/list?media_id=2809168080&pn=1&ps=20&order=mtime&type=0&tid=0&platform=web"
  5. fetch(url)
  6. .then(res => res.json()) //res.json()是一个Promise对象
  7. .then(d => { //拿到数据
  8. //获取视频列表总数量
  9. let cot = d.data.info.media_count
  10. let page = []
  11. if (cot > 20) {
  12. //获取页数
  13. let limit = Math.ceil(cot / 20)
  14. //获取当前页码
  15. let pn = Number(url.match(/(?<=pn=)\d+/)[0])
  16. for (let i = 1; i <= limit; i++) {
  17. if (i != pn) {
  18. //拼接每页的url
  19. page.push(url.replace(/(?<=pn=)\d+/, i))
  20. }
  21. }
  22. }
  23. //设置行高列宽
  24. Rows("1:" + cot).RowHeight = 60
  25. Columns('A:B').ColumnWidth = 15;
  26. Columns('C:E').ColumnWidth = 32;
  27. //写入数据
  28. writedata(d.data.medias, 0)
  29. //获取剩下的页
  30. page.forEach((url, i) => {
  31. fetch(url)
  32. .then(req => req.json())
  33. .then(d => writedata(d.data.medias, i + 1))
  34. })
  35. })
  36. }
  37. function writedata(list, index) {
  38. //处理需要的数据
  39. let arr = []
  40. list.forEach(i => arr.push([
  41. i.cover + "@320w_200h_1c_!web-space-favlist-video.webp",
  42. i.upper.name,
  43. i.title,
  44. i.intro,
  45. "https://www.bilibili.com/video/" + i.bvid
  46. ]))
  47. //写入数据
  48. index = index * 20 + 1
  49. Range('A' + index).Resize(arr.length, 5).Value2 = arr
  50. Range(`A${index}:A${index + arr.length - 1}`).Value2 = ""
  51. //插入视频封面图片
  52. arr.forEach((i, o) => {
  53. let link = i[0]
  54. let top = (index + o - 1) * 60 + 3
  55. ActiveSheet.Shapes.AddPicture(link, true, true, 4, top, 86, 54)
  56. })
  57. }

链接转图片方法、生成条形码图片

Shapes.AddPicture(链接或路径, 是否链接文件, 是否与文档保存, Left, Top, 图片宽度, 图片高度)

以生成条形码图片为例,这里用bwip-js在线api演示效果

  1. let sht = ThisWorkbook.ActiveSheet
  2. let link = 'https://bwipjs-api.metafloor.com/?bcid=code128&text=200534231&includetext=true&textsize=12&height=9'
  3. sht.Shapes.AddPicture(link, true, true, 150, 20, 120, 50)

InputBox对象获取用户输入的信息、行号、列号、用户选择的单元格区域数据
  1. function inputbox_test() {
  2. let tip = ['请输入名字', '请选择行', '请选择列', '请选择数据区域']
  3. let myName = InputBox(tip[0])
  4. alert('你输入的名字是 ' + myName)
  5. let ros = Application.InputBox(tip[1], undefined, undefined, undefined, undefined, undefined, undefined, 8).Row
  6. alert('你选择的行号是 ' + ros)
  7. //Application.InputBox参数用对象的方式传入,代码就不用写这么长了
  8. let col = Application.InputBox({Prompt: tip[2], Type: 8}).Column
  9. alert('你选择的列号是 ' + col)
  10. let arr = Application.InputBox({Prompt: tip[3], Type: 8}).Value2
  11. if (!arr) return alert('未能识别数据区域') //!逻辑非
  12. const data = arr.map(i => i.join(',')) //map方法数组迭代
  13. alert('你选择的数据是\n' + data.join('\n'))
  14. }

弹出YesNo选择窗口
  1. let yesno = MsgBox('Yes or No?', jsYesNo) //用户选择是,返回的值是6

将以A1单元格为起点的连续非空白区域转二维数组(类似VBA的CurrentRegion属性)
  1. let sht = ThisWorkbook.ActiveSheet
  2. let ron = sht.Range('A1').CurrentRegion.Value2

创建一个新的工作簿
  1. let wb = Workbooks.Add()

将A列名字数据批量另存工作簿
  1. function save_workbook() {
  2. let sht = ThisWorkbook.ActiveSheet
  3. , data = sht.Range('A1').CurrentRegion.Value2
  4. , th = data[0] //获取表头
  5. , path = (ThisWorkbook.Path || Application.DefaultFilePath) + '\\'
  6. //forEach数组迭代方法
  7. data.forEach((item, i) => {
  8. if (i == 0) return //忽略第一行数据
  9. let wb = Workbooks.Add()
  10. , sht = wb.ActiveSheet
  11. , filePath = path + item[0].replace(/[\\/:*?\"<>|]/g, '-') //文件名称不得有\/:*?"<>|字符,用正则将特殊字符替换成-
  12. sht.Range('A1:B2').Value2 = [th, item]
  13. wb.SaveAs(filePath, 51)
  14. wb.Close() //关闭工作簿
  15. })
  16. alert('完成,文件路径在\n' + path)
  17. }

或者可以把代码复制到模块里逐句执行查看效果

  1. function testJS() {
  2. const arr = [['名字', '年龄'], ['清风', 18], ['若雨', 22], ['猫的树', 27], ['童颜', 25], ['茶季', 19]]
  3. //获取当前代码工作簿的活动工作表名称
  4. let sht = ThisWorkbook.ActiveSheet
  5. console.log(sht.Name)
  6. //向A1:B6单元格区域写入二维数组数据
  7. sht.Range('A1').Resize(6, 2).Value2 = arr
  8. //获取A1单元格的值
  9. let rng = sht.Range('A1').Value2
  10. console.log(rng)
  11. //获取A1:B6单元格区域的值,并将数据写入D1:E6区域
  12. let arrData = sht.Range('A1:B6').Value2
  13. sht.Range('D1:E6').Value2 = arrData
  14. //选中以空行与空列的组合为边界的单元格区域,选中A1:B6区域的值复制到G1单元格
  15. sht.Range('A1').CurrentRegion.Select()
  16. Selection.Copy(sht.Range('G1'))
  17. //链接转图片,以生成条形码图片为例
  18. let link = 'https://bwipjs-api.metafloor.com/?bcid=code128&text=200534231&includetext=true&textsize=12&height=9'
  19. sht.Shapes.AddPicture(link, true, true, 20, 100, 120, 50)
  20. //InputBox对象
  21. let tip = ['请输入名字', '请选择行', '请选择列', '请选择数据区域']
  22. let myName = InputBox(tip[0])
  23. console.log('你输入的名字是 ' + myName)
  24. let ros = Application.InputBox({Prompt: tip[1], Type: 8}).Row
  25. console.log('你选择的行号是 ' + ros)
  26. let col = Application.InputBox({Prompt: tip[2], Type: 8}).Column
  27. console.log('你选择的列号是 ' + col)
  28. let selectData = Application.InputBox({Prompt: tip[3], Type: 8}).Value2
  29. if (selectData) {
  30. const mydata = selectData.map(i => i.join(','))
  31. console.log('你选择的数据是\n' + mydata.join('\n'))
  32. } else {
  33. console.log('未能识别数据区域')
  34. }
  35. //弹出让用户选择:‘是’或‘否’的窗口
  36. let yesno = MsgBox('Yes or No?', jsYesNo) //用户选择是,返回的值是6
  37. console.log(yesno)
  38. //获取以空行与空列的组合为边界的区域并转化为数组
  39. let data = sht.Range('A1').CurrentRegion.Value2
  40. console.log(data.join())
  41. //获取表头
  42. let th = data[0]
  43. console.log(th.join())
  44. //设置文件保存路径
  45. //console.log(Env.GetDesktopPath()) //打印用户桌面目录,Env对象要更新WPS版本,版本太低用不了
  46. let path = (ThisWorkbook.Path || Application.DefaultFilePath) + '\\'
  47. console.log(path)
  48. //forEach数组迭代
  49. data.forEach((item, i) => {
  50. if (i == 0) return //忽略第一行数据
  51. let wb = Workbooks.Add()
  52. , sht = wb.ActiveSheet
  53. , filePath = path + item[0].replace(/[\\/:*?\"<>|]/g, '-') //文件名称不得有\/:*?"<>|字符,用正则将特殊字符替换成-
  54. console.log(filePath)
  55. sht.Range('A1:B2').Value2 = [th, item]
  56. wb.SaveAs(filePath, 51)
  57. wb.Close() //关闭工作簿
  58. })
  59. console.log('完成,文件路径在\n' + path)
  60. //遍历文件
  61. let folder = path + '*.xlsx'
  62. let files = Dir(folder)
  63. while (files) {
  64. console.log(files)
  65. files = Dir()
  66. }
  67. }

最后学习JavaScript 语言推荐用w3school,打好基础才能更好利用JS宏摸鱼

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/742177
推荐阅读
相关标签
  

闽ICP备14008679号