JS宏实例:隐藏窗口读取数据与简单的数据处理
前面,我们做过打开工作簿获取数据的案例。只需要使用工作簿对象中的Open方法即可。但是当需要处理的工作簿较多时,窗口会一直跳来跳去,不太友好,特别是对于有强迫症的人来说,简直是噩梦级别的操作,比如说UP。所以,当我们读取工作簿数据时,能不能隐藏窗口进行获取呢?答案当然是可以的,JS宏中也提供了对应的API。接下来,我们通过实际案例来理解这个API。
一、明确任务目的
任务目标:获取并分析数据源工作簿中的数据
任务要求:
1、计算每年、每月、每种商品类型的销售额数据
2、获取数据时要求隐藏工作表窗口
3、将计算动作绑定在一个新生成的按钮上
4、使用ES6类,或构造函数来完成该案例
二、查看数据源结构
本次案例数据源中共有三个sheet表
1、商品类型表
2、商品销售情况表
3、商品类型名称
显然,要计算每年、每月、每种商品类型的销售额数据,我们需要将三个表整合在一起,然后再进行求和汇总。
三、逻辑整理与代码编写
1、定义一个构造函数
function MyClass() {
if(!(this instanceof MyClass)) throw new Error("只能通过new来实例化");
}
2、数据获取
注意,在获取数据时我们需要隐藏工作簿窗口。这里,我们可以利用OLE对象来完成这一操作,示例代码如下:
function MyClass() {
if(!(this instanceof MyClass)) throw new Error("只能通过new来实例化");
//使用OLE对象获取工作簿中的数据,并隐藏对象
MyClass.prototype.getDataWithHideWorkbookWindow = function(path) {
//创建OLE对象
let obj = ActiveSheet.Shapes.AddOLEObject("Excel.Sheet.8", path);
obj.Visible=false; //形状不可见
let res = {}, n;
let wb = obj.DrawingObject.Object; //获取工作簿对象
n = wb.Sheets.Count; //获取工作表对象
for(let i=1; i<=n; i++){
let sht = wb.Sheets(i);
res[sht.Name] = sht.Range("A1").CurrentRegion.Value2; //获取数据
}
wb.Close(); //关闭,可以不写
obj.Delete(); //删除OLE对象
return res;
}
}
getDataWithHideWorkbookWindow 实例方法中,使用了一个新的API:Shapes.AddOLEObject,官方解释如下图所示:
语法如下
express.AddOLEObject(ClassType, Filename, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)
可见,向其中传输的参数Excel.Sheet.8,就是在声明存储的类型是一个excel表格,所以我们调用时,就把path路径上的excel文件保存到了这个对象中。接下来,只需要通过其中的属性,就能获取到该工作表对象。找到工作表对象,我们按照工作表对象提供的API就能获取到数据了。
注:其中最关键的就是隐藏该对象的窗口(在excel中相当于是一个图片)
随后我们应立即对该