天天看點

Script Lab 版,九九乘法表,Excel 基礎操作(2)

準備工作

女兒二年級了,開始學習乘法,天天回家背一篇九九乘法口決表。暫時還沒人投稿,是以就想到用九九乘法表來做一個執行個體吧,也算有點小小的用處。

實作這個口算法分三個步驟:

  1. 建立一張新的工作表,命名為"9X9";
  2. 從 A1 的位置開始列印剩法表;
  3. 乘法表之外的那個部分标上綠色(純為了示範用)。

Office附加元件是使用Web技術建構的,與 Excel 進行互動,這要還是靠 Javascript 語言。選擇 JavaScript 語言花了點時間,最後确認使用 TypeScript,更接近于 C# ,确實要好用多了。

Script Lab 版,九九乘法表,Excel 基礎操作(2)

九九乘法表

【建立工作表】

建立工作表,還是花了不少時間,畢境還是不太習慣。最後是在 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);      

【小技巧】無法執行:在編輯狀态時,無法執行代碼,按個回車退出下。

Script Lab 版,九九乘法表,Excel 基礎操作(2)

context.sync

在 OfficeJS 的 API 示例代碼中,總能看到這樣一句代碼:

await context.sync();      

從官網上查詢一番,得到的意思大概是這樣的,之前的代碼隻是添加到内部的執行隊列中,并未真正執行,直到并等待被“更新”,context.sync() 便是此意,暫且稱之為同步函數。而且文檔中還提到,應該盡量減少同步函數的調用次數。每個 sync 都會造成宿主應用程式(此處是 Excel)的額外開銷,尤期是在 Office Online 時,成本更是大大增加了。

今天的代碼,主要是解決一個程式設計習慣的問題,去找一些現成的 VBA 代碼去改造成 Web Add-ins 插件,或是個不錯的主意。

繼續閱讀