文字场景

本文将介绍如何配置文字场景中常见的几种情况。

如何限制用户只能修改指定位置内容

在文字组件(Word)中,如何限制用户只能修改指定位置内容?

  • 创建.docx格式文件,目前仅有该格式支持开启内容控件。

  • 编写文档正文。

  • 在需要的位置插入内容控件

  • 点击按钮「审阅」-「限制编辑」进行限制。

如何查询文本位置和进行文本替换

查询指定文本的位置

  • 通过Range获取全文文本。注意这个方法可以使用(0, 10000)之类的,看具体查询范围。

  • 通过 JavaScript 查找到对应的模板内容,获取开始位置之类的(例如 JavaScript 字符串的find方法)。

替换文本

通过修改文本替换文本。

如何移动光标到指定文本

  • 定位文字:const info = await app.ActiveDocument.Find.Execute('WebOffice'); // 返回 [{ pos: 16, len: 2 }]

  • 获取pos位置信息:const pos = info[0].pos;

  • 移动光标:await app.ActiveDocument.Range.SetRange(pos, pos);

 async function example() { 
 await instance.ready();
  const app = instance.Application;
  // 1. 搜索并高亮文本
  const findResult = await app.ActiveDocument.Find.Execute('WebOffice');
  // 2. 获取位置信息
  const { pos } = findResult[0];
  // 3. 获取区域对象
  const range = await app.ActiveDocument.Range.SetRange(pos, pos);
}
async function example() {
  // 前面步骤同上,代码省略
  // 4. 滚动文档窗口, 显示指定的区域
  await app.ActiveDocument.ActiveWindow.ScrollIntoView(range);
} 

如何将 A 文档内容同步到 B 文档

在日常的业务中,我们可能接到需求,需要将 A 文档与 B 文档合并,或者将 A 文档内容同步到 B 文档中。

我们可以通过ActiveDocument.Range(Start, End).GetHtmlData()获取 A 文档中的 HTML 数据:

async function example() {
await instance.ready();

const app = instance.Application;
 
// 获取选中区域
 const range = await app.ActiveDocument.Range(10, 20);

 // 获取指定区域的带格式 HTML 数据
 const htmlInfo = await range.GetHtmlData();
 console.log(htmlInfo);
}

htmlInfo 的返回值如下:{ HTML, Text }

属性

数据类型

说明

HTML

String

HTML 数据

Text

String

文本数据

然后,根据获取的 HTML 数据,我们可以通过ActiveDocument.Range(Start, End).PasteHtml({ HTML })将它粘贴到 B 文档中:

async function example() {
await instance.ready();
const app = instance.Application;
  // 获取选中区域
const range = await app.ActiveDocument.Range(10, 20);
// 获取指定区域的带格式 HTML 数据
  const htmlInfo = await range.GetHtmlData();
  
  // 粘贴带格式的 HTML 数据到指定区域
  await app.ActiveDocument.Range(110, 110).PasteHtml({
    HTML: htmlInfo.HTML,
  });
}

最后,如果我们需要确定文档的末尾,可以通过ActiveDocument.GetDocumentRange()来获取全文 Range,并通过Range.SetRange()将位置定位过去:

说明

GetHtmlData接口依赖剪切板能力,需要文档开启复制权限。开启方式:后端file/info回调接口user_acl.copy置为1

async function example() {
 await instance.ready();
 const app = instance.Application;
 // 获取选中区域
 const DocumentRange = await app.ActiveDocument.GetDocumentRange();
// 获取末尾
  const End = await DocumentRange.End;
 // 定位到末尾
  await app.ActiveDocument.Range(0, 1).SetRange({
   Start: End,
    End: End,
 });
}

这样,可以将A文档的内容完整地追加到B文档的末尾,或者通过这种方法,以前端方式实现A、B文档的合并。