準備工作
女兒二年級了,開始學習乘法,天天回家背一篇九九乘法口決表。暫時還沒人投稿,是以就想到用九九乘法表來做一個執行個體吧,也算有點小小的用處。
實作這個口算法分三個步驟:
- 建立一張新的工作表,命名為"9X9";
- 從 A1 的位置開始列印剩法表;
- 乘法表之外的那個部分标上綠色(純為了示範用)。
Office附加元件是使用Web技術建構的,與 Excel 進行互動,這要還是靠 Javascript 語言。選擇 JavaScript 語言花了點時間,最後确認使用 TypeScript,更接近于 C# ,确實要好用多了。

九九乘法表
【建立工作表】
建立工作表,還是花了不少時間,畢境還是不太習慣。最後是在 OfficeHelpers 空間中找到了,這點是跟 VBA/VSTO 不一樣的地方,但是一通百通,明白了就 OK 了,下回專門為這個空間作個介紹吧,代碼如下:
OfficeHelpers.
ExcelUtilities.
forceCreateSheet(context.workbook, "9X9");
【列印乘法表】上一課也講了如何為單元格指派,有了上課的基礎,這裡的代碼就不是問題了。再加上一個循環就能 OK 了,而且循環的文法與 TypeScript 基本一緻,關鍵代碼如下:sheet.getCell(i, j).values = [[fmlTxt]];
【标注顔色】同樣是一個循環,加上了一點格式處理的代碼:.format.fill.color = "green";selectionRange.format.autofitColumns();
Excel.run(async function (context) {
//建立工作表
const sheet = await
OfficeHelpers.
ExcelUtilities.
forceCreateSheet(context.workbook, "9X9");
sheet.activate();
//列印剩法表
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
var fmlTxt =
(i + 1).toString() +
" * " +
(j + 1).toString() +
" = " +
((i + 1) * (j + 1)).toString();
sheet.getCell(i, j).values = [[fmlTxt]];
}
}
//标注顔色
var selectionRange = sheet.getRange("a1:i9");
selectionRange.format.fill.clear();
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
if (i < j) {
selectionRange.getCell(i, j)
.format.fill.color = "green";
}
}
}
selectionRange.format.autofitColumns();
await context.sync();
}).catch(OfficeHelpers.Utilities.log);
【小技巧】無法執行:在編輯狀态時,無法執行代碼,按個回車退出下。
context.sync
在 OfficeJS 的 API 示例代碼中,總能看到這樣一句代碼:
await context.sync();
從官網上查詢一番,得到的意思大概是這樣的,之前的代碼隻是添加到内部的執行隊列中,并未真正執行,直到并等待被“更新”,context.sync() 便是此意,暫且稱之為同步函數。而且文檔中還提到,應該盡量減少同步函數的調用次數。每個 sync 都會造成宿主應用程式(此處是 Excel)的額外開銷,尤期是在 Office Online 時,成本更是大大增加了。
今天的代碼,主要是解決一個程式設計習慣的問題,去找一些現成的 VBA 代碼去改造成 Web Add-ins 插件,或是個不錯的主意。