外观
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结构见参考 · 类型。