wps发布JS宏编辑器的功能已经很久了,今天尝试写了个非常简单的Excel表格合并的工具,发现真的是吊打VBA语言!就是有个小小的缺点:不支持外接程序和ActiveX控件,有点可惜,不过终于可以摆脱VBA傻傻的数组、和字典操作了。
核心功能可以通过选择需要的表格来进行合并,并将数据写入到一个新建的工作簿中,可以指定合并后的文件名称,先看动画效果:


实现思路:
-
通过Application.GetOpenFilename方法获取选中文件的完整路径
-
js数组迭代遍历文件路径,利用Workbooks.Open方法打开每一个Excel文件
-
然后用Range.CurrentRegion方法把有数据的区域转化为js可操作的数组
-
将合并的数据写入到新建的Excel文件中
步骤
一、在wps新建一个Excel文件,切换到开发工具,点击切换到JS环境,然后创建两个按钮,在设计模式下双击创建好的按钮,wps宏编辑器即可生成对应按钮的点击事件处理函数

二、代码其实非常简单,会js都没问题,看注释应该就能理解,这里就直接上代码
源码下载(不需要积分):https://download.csdn.net/download/huaermeier/87415538
function CommandButton1_Click() {
//文件筛选条件, 标题, 可选多个文件
let file = Application.GetOpenFilename({
FileFilter: 'Excel File(*.xls;*.xlsx;*.csv), *.xls;*.xlsx;*.csv',
Title: '请选择文件',
MultiSelect: true
})
//js三元表达式
Range('B3').Value2 = file ? file.join('\n') : ''
if (!file) MsgBox('你没选中文件!')
}
function CommandButton2_Click() {
let file = Range('B3').Value2.split('\n')
let data = []
file.forEach((path, i) => {
let wb = Workbooks.Open(path, 0)
let arr = wb.ActiveSheet.Range('A1').CurrentRegion.Value2
wb.Close() //关闭工作簿
//因为只要保留1行表头,其他都要去掉表头才行,所以循环到第二个工作簿开始就要去掉表头
if (i > 0) arr.shift();
data.push(...arr) //合并数组
})
let wb = Workbooks.Add() //新建工作簿
let path = ThisWorkbook.Path //读取当前文件路径
//js短路求值, js字符串模板
let filename = ThisWorkbook.ActiveSheet.Range('B2').Value2 || `newfile-${Date.now()}`
//把合并的数据全部写入到刚刚新建的工作簿里
wb.ActiveSheet.Range('A1').Resize(data.length, data[0].length).Value2 = data
wb.SaveAs(`${path}/${filename}`) //保存文件
}