一年前通过微软的 Office 开发人员计划免费订阅了一年的 Office ,其中也包含了 免费的 OneDrive 。一年后收到了 Office Developer 的到期邮件提醒,大致内容就是:

我申请的 Office 没有用于开发,到期后将不再可用,同时我的数据在一个月后也会被删除。

因为我很少使用 Office ,所以 Office 到期对我的影响倒是不大,但是 我的 OneDrive 里存储了大量的文件,在短时间内无法完成搬运,所以只能续订。

从 2019 年 4 月 开始 Office 365 E3 的免费订阅期限从一年改为了三个月,只要在三个月内有开发活动就可以续订。这里所说的开发就是开发一些能和 Office 进行交互的应用。

Office 的加载项可以使用 JavaScript 来开发,在开发之前需要先安装 Node.js。

创建项目

这里开发一个 Word 的加载项,首先需要安装相关的外接程序,在命令行输入 :

npm install -g yo generator-office

为了方便管理文件,需要在空目录中创建项目,输入:

yo office

创建项目。

接下来是关于是否允许上传匿名统计信息的询问:

? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== (Y/n) 

输入 yn 然后回车。

如下界面时按回车继续:

     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Office  │
    |--(o)--|    │   Add-in generator, by   │
   `---------´   │ @OfficeDev! Let's create │
    ( _´U`_ )    │    a project together!   │
    /___A___\   /╰──────────────────────────╯
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? Office Add-in CLI tools collect anonymized usage data which is sent to Microsoft to help improve our product. Please read our privacy notice at
 https://aka.ms/OfficeAddInCLIPrivacy. ​To disable data collection, choose Exit and run “npx office-addin-usage-data off”.

 (Use arrow keys)
> Continue
  Exit

项目类型我这里就使用默认的 Office Add-in Task Pane project

 Choose a project type:
> Office Add-in Task Pane project
  Office Add-in Task Pane project using Angular framework
  Office Add-in Task Pane project using React framework
  Office Add-in Task Pane project supporting single sign-on
  Office Add-in project containing the manifest only
  Excel Custom Functions Add-in project 

直接按回车继续。

语言我这里选择 JavaScript

 Choose a script type:
  TypeScript
> JavaScript  

可以用上下光标键选择,回车继续。

输入项目名称,我这里输入的是 test

? What do you want to name your add-in? test

选择你要开发的 Office 程序,我这里选择的是 Word:

 Which Office client application would you like to support?
  Excel
  Onenote
  Outlook
  Powerpoint
  Project
> Word   

确认选择无误的话,按回车创建项目:

Continue
? Choose a project type: Office Add-in Task Pane project
? Choose a script type: JavaScript
? What do you want to name your add-in? test
? Which Office client application would you like to support? Word

----------------------------------------------------------------------------------

      Creating test add-in for Word using JavaScript and Taskpane at E:\office\test

----------------------------------------------------------------------------------

运行项目

创建完成后进入项目目录,输入:

npm start

启动本地服务器。

第一次启动服务的时候可能会出现一个安装证书的授权询问,选择 安装本地证书,同时 Office 程序也会自动启动。

在 Office 工具栏的右侧会多出一个 Show Taskpane ,如下:

Office Show Taskpane 按钮

点击 Show Taskpane,如果出现 无法加载 之类的提示的话,可以在命令行中输入:

CheckNetIsolation LoopbackExempt -a -n="microsoft.win32webviewhost_cw5n1h2txyewy"

如果看到如下界面:

Office Taskpane

说明服务运行成功,程序的 HTML 代码也会显示在这个区域。点击 Run 链接可以把 Hello World 添加到 Word 中。

如果正常登录了 Office 账号的话,已经可以被检测到开发活动了,Office 应该会自动续订。

如果续订成功的话会有邮件通知,也可以访问 https://developer.microsoft.com/zh-CN/office/profile 查看到期时间:

Office365E3查看到期时间

如果还是无法续订的话,可以简单学习一下 Office 相关的开发,可以用 HTML + CSS + JavaScript 开发,也不是太难。

简单开发

项目目录中的 src/taskpane/taskpane.html 中的内容就是 Office 任务窗格中显示的内容。

下面实现点击按钮在 Word 中添加一段文字。

用代码编辑器打开项目目录中的 src/taskpane/taskpane.html ,删除 main 标签中的内容,在 main 标签中添加一个按钮,如下:

<main id="app-body" class="ms-welcome__main" style="display: none;">
    <button class="ms-Button" id="insert-paragraph">插入一段文本</button>
</main>

打开项目目录下的 src/taskpane/taskpane.js ,删除 run 函数和 run 链接的点击事件。

增加一个 insertParagraph 函数,insertParagraph 函数内容如下:

function insertParagraph() {
    Word.run(function (context) {

        let docBody = context.document.body;
        //  在第一行插入文字
        docBody.insertParagraph("这段文字会被插入到 Word 中", "Start");
        return context.sync();
    }).catch(function (error) {
        console.log("Error: " + error);
        if (error instanceof OfficeExtension.Error) {
            console.log("Debug info: " + JSON.stringify(error.debugInfo));
        }
    });
}

idinsert-paragraph 的按钮添加一个点击事件,点击事件绑定 insertParagraph 函数,如下:

document.querySelector('#insert-paragraph').onclick = insertParagraph;

taskpane.js 的内容如下:

Office.onReady(info => {
    if (info.host === Office.HostType.Word) {
        document.getElementById("sideload-msg").style.display = "none";
        document.getElementById("app-body").style.display = "flex";
        document.querySelector('#insert-paragraph').onclick = insertParagraph;
    }
});

function insertParagraph() {
    Word.run(function (context) {

        let docBody = context.document.body;
        //  在第一行插入文字
        docBody.insertParagraph("这段文字会被插入到 Word 中", "Start");
        return context.sync();
    }).catch(function (error) {
        console.log("Error: " + error);
        if (error instanceof OfficeExtension.Error) {
            console.log("Debug info: " + JSON.stringify(error.debugInfo));
        }
    });
}

在服务器正常运行的情况下,保存文件后切换到 Word 即可看到效果,点击按钮就能在 Word 中插入一段文字。

这里主要是为了续订 Office ,所以开发相关的内容不多。如果您需要详细的 Office 开发教程,微软也提供了中文文档,您可以访问 Office 开发人员中心 来查看详细的开发教程。

如果您想保持 Office 的续订状态,至少每三个月就要开发一次。