Skip to content

Word 特有功能

Word 是能力最完整的一类:除通用控制里的编辑 / 只读 / 新建 / 保存 / 多产物保存(含导出 PDF)/ 界面定制外,还独有修订、批注两种受控模式数据区域(锁定填充位)文档比对


打开模式

Word 支持四种打开模式,均由后端 webOpen 的第二个参数裁决:

模式常量用途
普通编辑AtkonofficeOpenMode.NormalEdit常规读写
只读查看AtkonofficeOpenMode.ReadOnly审阅、留痕、防误改
仅修订AtkonofficeOpenMode.RevisionOnly只能以「修订(track changes)」方式改,留痕
仅批注AtkonofficeOpenMode.CommentOnly只能加批注,不改正文
java
// 例:审阅人只能修订
return new AtkonofficeCtrl(request)
        .webOpen(docId, AtkonofficeOpenMode.RevisionOnly, "李四")
        .setSaveFilePage(savePath)
        .getHostPage();

数据区域(锁定填充位)

数据区域是 Word 文档里一处命名的、锁定的填充位:终端用户在编辑器里无法手动改动它的内容、也无法删除它,而文档其余部分照常正常编辑;区域的值只能由业务代码维护。适合合同金额、公文文号、抬头单位等「希望预填、且不希望被手误改动」的关键字段——既能实现「一开即见已填充的草稿」,又保证这些字段在编辑全程不被终端用户破坏。

维护数据区域有三个接续的角色:

后端:开打时填值(WordDocumentWriter)

在带命名数据区域的 Word 模板上,打开前把业务数据灌进对应区域,实现「一开即见已填充的草稿」——典型如合同、公文起草。既有带命名标记的 Word 模板可继续直接用。

java
WordDocumentWriter writer = new WordDocumentWriter();
writer.openDataRegion("FaWenDanWei").setValue("某某办公室");
writer.openDataRegion("FaWenRiQi").setValue("2026-06-22");

return new AtkonofficeCtrl(request)
        .webOpen(templateDocId, AtkonofficeOpenMode.NormalEdit, user)
        .setWriter(writer)                 // 打开前把值灌进同名区域
        .setSaveFilePage(savePath)
        .getHostPage();
  • 区域名为空 → 该条 no-op;值为 null → 写空串;
  • 承载的是业务数据值(非文档字节),经集成方服务端 → 客户端流转,不改变「文档字节不出域」

前端:编辑中改值(session.word.fillDataRegion)

编辑过程中,业务页可经代码即时更新某个锁定区域的值——例如在编辑器里点一个业务按钮,把某个区域刷成最新数据。终端用户手动改动该区域仍被拦(仅代码可改)。异步返 Promise,仅 Word;命中并改值成功 → true,文档无此名字 / 客户端外 / 只读态 / 失败 → false(无害降级,不抛异常)。

js
// 编辑器内业务按钮 → 把「发文日期」区域刷成今天
await atkonoffice.session.word.fillDataRegion('FaWenRiQi', '2026-07-25')

前端:布置数据区域(session.word.*)

在编辑页内制作模板 / 布置数据区域时用——插入 / 删除 / 定位 / 列举命名数据区域,与上面「开打时填值 / 编辑中改值」接续成「作者布置区域 → 填值」闭环。异步返 Promise,仅 Word;客户端外 / 只读 / 失败 → 无害降级。

js
await atkonoffice.session.word.addDataRegion('FaWenDanWei', '【发文单位】')  // 光标处插占位并建锁定区域
await atkonoffice.session.word.locateDataRegion('FaWenDanWei')             // 定位 / 选中
const names = await atkonoffice.session.word.listDataRegions()             // 列已插入的数据区域名
await atkonoffice.session.word.deleteDataRegion('FaWenDanWei')             // 删除

listDataRegions(prefix?):省略 prefix 默认按 AO_ 前缀过滤;显式空串 '' 返全部数据区域名。 新插入的数据区域即为锁定态——终端用户不能手动改动或删除,只能经上面的代码维护。


文档比对

把两份 Word 文档并排打开、自动高亮差异,用于合同定稿前对照、公文修订审阅、留痕比对。比对页是只读 viewer,两栏并排、自动高亮,不保存。

后端:出比对页

webOpen 设左栏 A、setCompareDocument 设右栏 B,调 getComparePage()(而非 getHostPage()):

java
@GetMapping(value = "/atkonoffice/compare-page", produces = MediaType.TEXT_HTML_VALUE)
public String comparePage(@RequestParam String docId,
                          @RequestParam String compareDocId, HttpServletRequest request) {
    return new AtkonofficeCtrl(request)
            .webOpen(docId, AtkonofficeOpenMode.ReadOnly, "张三")   // 左栏 A
            .setCompareDocument(compareDocId)                       // 右栏 B
            .getComparePage();
}

前端:拉起比对

compareDocId(非空即进比对模式),pageApi 指到比对页路由:

js
atkonoffice.open({
  pageApi: '/atkonoffice/compare-page',
  params: { docId: 'v2.docx', compareDocId: 'v1.docx' },
})

差异结果回流(可选)

结构化 diff 可回流到业务系统做审计 / 留痕 / 自定义展示,与文档内容一样不出域(含原文,仅编辑页内可订阅):

js
atkonoffice.session.on('compareDiff', (diff) => {
  // diff.summary: { inserts, deletes, formatChanges, moves } 计数
  // diff.revisions: 逐条修订(类型、落在哪侧、坐标区间、原文文本)
  fetch('/your-app/compare-report', { method: 'POST', body: JSON.stringify(diff) })
})
  • 差异列表的呈现样式由集成方按业务渲染(SDK 只给数据);
  • diff 只在编辑页内可拿,不回流到外层浏览器页
  • AtkonofficeCompareDiff 结构见参考 · 类型

下一步

面向集成方的产品技术文档 · 不含实现细节