共计 3082 个字符,预计需要花费 8 分钟才能阅读完成。
Excel 当初可利用 js 依据单元格数据生成图表、表格,或通过 js 拓展自定义函数拓展内置 Excel 表达式。
咱们来学习一下 Excel js API 凋谢是如何设计的,从中学习到一些凋谢 API 设计教训。
API 文档:Excel JavaScript API overview
精读
Excel 将利用 JS API 凋谢了大量能力,包含用户能通过界面轻松做到的,也包含无奈通过界面操作做到的。
为什么须要凋谢 JS API
Excel 曾经具备了良好的易用性,以及 formula 这个弱小的公式。在之前 精读《Microsoft Power Fx》提到过,formula 就是 Excel 里的 Power FX,属于画布低代码语言,不过在 Excel 里叫做“公式”更适合。
曾经具备这么多能力,为何还须要 JS API 呢?一句话概括就是,在 JS API 内能够应用 formula,即 JS API 是公式能力的超集,它蕴含了对 Excel 工作簿的增删改查、数据的限度、RangeAreas 操作、图表、透视表,甚至能够自定义 formula 函数。
也就是说,JS API 让 Excel“可编程化”,即以开发者视角对 Excel 进行二次拓展,包含对公式进行二次拓展,使 Excel 笼罩更多场景。
JS API 能够用在哪些地方
从 Excel 流程中最开始的工作薄、工作表环节,到最细节的单元格数据校验都可通过 JS API 反对,目前看来 Excel JS API 并没有设置能力边界,而且还会不断完善,将 Excel 全生命周期中所有可编程的中央凋谢进去。
首先是对工作薄、工作表的操作,以及对工作表用户操作的监听,或者对工作表进行只读设置。这一类 API 的目标是对 Excel 这个整体进行编程操作。
第二步就是对单元格级别进行操作,比方对单元格进行区域选中,获取选中区域,或者设置单元格属性、色彩,或者对单元格数据进行校验。自定义公式也在这个环节,因为单元格的值能够是公式,而公式能够利用 JS API 拓展。
最初一步是拓展行为,即在单元格根底上引入图表、透视表拓展。尽管这些性能在 UI 按钮上也能够操作进去,但 JS API 能够实现 UI 界面配置不进去的逻辑,对于非常复杂的逻辑行为,即使 UI 能够配置进去,可读性也远没有代码高。除了表格透视表外、还能够创立一些自定义形态,根本的几何图形、图片和 SVG 都反对。
JS API 设计
比拟乏味的是,Excel 并没有形象“单元格”对象,即使咱们所有人都认为单元格就是 Excel 的代表。
这么做是出于 API 设计的合理性,因为 Excel 应用 Range 概念示意间断单元格。比方:
Excel.run(function (context) {var sheet = context.workbook.worksheets.getActiveWorksheet();
var headers = [["Product", "Quantity", "Unit Price", "Totals"]
];
var headerRange = sheet.getRange("B2:E2");
headerRange.values = headers;
headerRange.format.fill.color = "#4472C4";
headerRange.format.font.color = "white";
return context.sync();});
能够发现,Range 让 Excel 聚焦在批量单元格 API,即把单元格看做一个范畴,整体 API 都能够围绕一个范畴去设计。这种设计理念的益处是,把范畴局限在单格单元格,就能够笼罩 Cell 概念,而聚焦在多个单元格时,能够很不便的基于二维数据结构创建表格、折线图等剖析图形,因为二维构造的数据才是结构化数据。
或者能够说,结构化数据是 Excel 最外围的概念,而单元格无奈体现结构化。结构化数据的益处是,一张工作表就是一个能够用来剖析的数据集,在其之上无论是基于单元格的条件格局,还是创立剖析图表,都是一种数据二次剖析行为,这都得益于结构化数据,所以 Excel JS API 必然围绕结构化数据进行形象。
再从 API 语法来看,除了工作薄这个级别的 API 采纳了 Excel.createWorkbook();
之外,其余大部分 API 都是以下模式:
Excel.run(function (context) {// var sheet = context.workbook.worksheets.getItem("Sample");
// 对 sheet 操作 ..
return context.sync();});
最外层的函数 Excel.run
是注入 context
用的,而且也能够保障执行的时候 Excel context 曾经筹备好了。而 context.sync()
是同步操作,即便以后对 context 的操作失效。所以 Excel JS API 是命令式的,也不会做相似 MVVM 的双向绑定,所以在操作过程中数据和 Excel 状态不会发生变化,直到执行 context.sync()
。
留神到这点后,就能够了解为什么要把某些代码写在 context.sync().then
里了,比方:
Excel.run(function (ctx) {var pivotTable = context.workbook.worksheets.getActiveWorksheet().pivotTables.getItem("Farm Sales");
// Get the totals for each data hierarchy from the layout.
var range = pivotTable.layout.getDataBodyRange();
var grandTotalRange = range.getLastRow();
grandTotalRange.load("address");
return context.sync().then(function () {
// Sum the totals from the PivotTable data hierarchies and place them in a new range, outside of the PivotTable.
var masterTotalRange = context.workbook.worksheets.getActiveWorksheet().getRange("E30");
masterTotalRange.formulas = [["=SUM(" + grandTotalRange.address + ")"]];
});
}).catch(errorHandlerFunction);
这个从透视表获取数据的例子,只有执行 context.sync()
后能力拿到 grandTotalRange.address
。
总结
微软还在 Office 套件 Excel、Outlook、Word 中推出了 ScriptLab 性能,就能够在 Excel 的 ScriptLab 里编写 Excel JS API。
在 Excel JS API 之上,还有一个 通用 API,定义为跨利用的通用 API,这样 Excel JS API 就能够把精力聚焦在 Excel 产品自身能力上。
探讨地址是:精读《Excel JS API》· Issue #387 · dt-fe/weekly
如果你想参加探讨,请 点击这里,每周都有新的主题,周末或周一公布。前端精读 – 帮你筛选靠谱的内容。
关注 前端精读微信公众号
<img width=200 src=”https://img.alicdn.com/tfs/TB165W0MCzqK1RjSZFLXXcn2XXa-258-258.jpg”>
版权申明:自在转载 - 非商用 - 非衍生 - 放弃署名(创意共享 3.0 许可证)