Text document API ApiParagraph 对象 GetRange 方法 开始位置和结束位置计算问题

API 文档位置:

我们在使用过程中发现,使用 ApiParagraph.getRange(start,end) 这个API时文字计算的位置和实际位置有差异,也没有找到对文字索引计算的说明。

代码:

let doc = Api.GetDocument();
let paragraph = doc.GetElement(0);
paragraph.AddText("ONLYOFFICE Document Builder");
let range = paragraph.GetRange(0, 9);
range.Select();
paragraph = Api.CreateParagraph();
paragraph.AddText("The word 'ONLYOFFICE' was just selected.");
doc.Push(paragraph);

依据API 说明,应该是 ONLYOFFICE 被选中,实际是 ONLYOFFI 被选中。

1 Like

您好,
范围计数并不是基于字符,而是基于逻辑位置的。每次调用 paragraph.AddText 实际上都会创建一个新的 run,但原本段落中已经存在一个 run(这也会被计入段落中)。这种实现方式与 Microsoft 的程序是一致的,这种逻辑是无法更改的。建议在设置范围参数时,直接提供不同的数值

未进行paragraph.AddText操作,直接通过段落和文本起始位置和结束位置获取,依旧出现偏差,请问此方法9.x版本没有做兼容吗

您好,您那边解决这个问题了吗,我这边升级至9.x之后出现了这个问题,GetBookmarkRange和GetRange获取的range都有问题,期待您的回答

你好 @wangchen

该功能运行符合预期,与VBA的实现方式一致,以确保更好的兼容性。

例如,若文档包含示例内容“Document”,调用GetRange(0,7)将返回Documen。参考示例:以下两个宏返回相同结果:

VBA

Sub ExtractRange()
    Dim doc As Document
    Set doc = ActiveDocument

    Dim firstParagraph As Paragraph
    Set firstParagraph = doc.Paragraphs(1)

    Dim range As range
    Set range = firstParagraph.range

    range.SetRange Start:=0, End:=7
    range.Select
End Sub

JS

var oDocument = Api.GetDocument();
var oParagraph = oDocument.GetElement(0);
var oRange = oDocument.GetRange(0, 7);
oRange.Select();