当前位置: 首页 > 知识库问答 >
问题:

单词范围:在与纯文本对应的格式化文本中移动范围索引

宫俊才
2023-03-14

我需要分析Word文档的文本,并在分析器检测到的文本范围内创建书签(几乎像语法检查器)。

我不想使用查找()实用程序,因为我的需求太具体了。

为此,,

1/检索纯文本文档

我检索文档主要故事的纯文本:

字符串明文=活动文档。范围().文本;

2/分析纯文本并得到结果

我将其发送到analyzer工具,该工具返回一个带位置的标记集合:例如,如果我想在文档文本中检测到模式“my pattern”,analyzer可以将标记返回为{pattern:“my marker”,start:5,end:14},其中“start”和“end”是发送的纯文本中模式的字符索引。

3/在文档中显示结果

我从这些标记创建书签。例如,它可能是:

// init a new range and collapse it 
Word.Range range = activeDocument.Range(); range.Collapse(WdCollapseStart); 

// move character-by-character in the "formatted" text
range.MoveStart(WdUnits.Character, Marker.start ); # Marker.start=5

//set length (end)
range.setRange(range.Start,range.Start+(Marker.End-Marker.Start)); #Marker.end=14

4/结果

4.1全球成果

当文档主故事包含文本、链接、列表、标题时,一切正常:范围定位良好,纯文本索引与格式化文本索引关联。

4.2阵列问题

当一个文档包含一个数组时,范围被错误地定位为几个字符:纯文本索引与格式化文本索引不完全相关。

我发现了这个问题的原因(在其他论坛中解释过):这是由于非打印字符(7),它是纯文本中添加的单元格分隔符。我们可以处理这些字符来计算位置范围,一切正常!

4.3发布内容控件、目录、章节和其他

当文档包含这些元素时,范围也会被错误地定位为几个字符。其他非打印显示为纯文本,但我不明白它的含义以及如何计算位置范围。

通过使用“开发人员”功能区显示单词元素标记

4.4带尾纸的问题

我不知道英语怎么说“page de garde”(法语),我想是“endpaper”:这是第一个有特定页眉、页脚和内容控件的页面:)

当一个文档包含一个尾页时,范围也被错误地定位为几个字符。但是这一次,在纯文本中没有非打印标记。

其他信息,当我用“开发者功能区”显示单词元素标记时

  • 如何在Word文档范围内检测尾纸

我发现了类似的问题:

  • 关联范围。文本到范围。开始和范围。完
  • http://www.vbaexpress.com/forum/showthread.php?36710-表格范围文本上的奇怪字符

我希望我的解释很清楚,你能帮助我理解什么是错误的,或者告诉我一个最好的方法来做到这一点?

谢谢,真的。

共有1个答案

袁增
2023-03-14

它不是真的漂亮,但你可以尝试删除不需要的字符由Regex。例如删除\a字母(它有代码7):

string j = new string(new char[] { (char)7 });
plainText = Regex.Replace(plainText,string.Format("[{0}]", j), "");

现在,您必须识别其他“邪恶”字符,并将它们添加到字符数组中。如果它有效,您将得到一个字符串,其长度与文档中的Characters的数量相对应。也许你必须通过实验来修改这段代码。(我不知道你用的是哪种语言-我想是C#。)

更新另一个想法(如果适用于您的analyzer工具):

将问题分解为单个段落:

foreach(Word.Paragraph pg in activeDocument.Paragraphs)
{
    Word.Range range = pg.Range();
    string text = range.Text;
    // your stuff here
}

对于此段落范围对象和包含的文本字符串,您可以执行与处理整个文档对象及其文本相同的操作—只是逐段执行。所有这些段落都可以通过范围和移动操作“寻址”,就像您已经做的那样。我假设有问题的字符在段落的外部或末尾,因此它们不会影响这些段落内部的字符计数。

因为我不能复制你所说的终稿,所以我不能验证它。此外,我不知道页面标题和目录等特殊文本范围是否被段落覆盖。但至少你可以把你的问题缩小到更小的范围。我觉得值得一试。

 类似资料:
  • 嗨,我需要移动每行(扫描)中的一个单元格范围,这些单元格包含特定列(在我的情况下可以是任何列,但在我的代码中是coln“e”)中的一个单元格,该值以文本字符串L开始。以下是我所尝试的(我是VBA新手)。在本例中,我希望将移动到,其中是行号。

  • 问题内容: 我在iPhone上的UIWebView中将一些简单样式的文本显示为html。它基本上是一系列段落,偶尔带有强或强调的短语。在运行时,我需要将样式应用于文本范围。 有几种类似的情况,其中一种是突出显示搜索结果。如果用户搜索了“某物”,我想更改单词出现后的背景颜色,然后再恢复原始背景。 是否可以使用javascript将样式应用于文本范围?其中一个关键部分是能够取消设置样式。 似乎有两种可

  • 我正在将Office Interop与MS Word(Microsoft.Office.Interop.Word)和Microsoft一起使用。办公室工具。Word可在Word加载项中修改Word文档。我有一个包含我要编辑的特定文本的范围。 当我更新Text对象时,Range的段落格式将被重置,特别是对齐和左键。我可以在临时变量中保存对齐和左缩进并重置它们,但这并不理想。是否有一种方法来阻止段落格

  • 问题内容: 为什么花括号没有在Java中定义单独的本地范围?我期望这是主要花括号语言(C,C ++,Java,C#)所共有的功能。 问题答案: 它们确实定义了单独的局部作用域,但是您仍然不能从父作用域中屏蔽局部变量(但是您当然可以屏蔽实例变量)。 但是您可以定义新变量(使用不同的名称),并且它们的范围将限于括号内。

  • 问题内容: 为什么使用lambda函数来获取值列表i = 4。在调用lambda期间,不存在封闭范围。函数f已经完成工作并返回了控制(变量i不存在)。 问题答案: Python使用闭包捕获对原始变量的引用。这些对象保留对名称的引用,可以通过该引用访问值。这意味着变量在完成后将继续存在。 您可以在lambda对象的元组中内省此闭包;函数具有相同的属性: 这也是列表中 所有 lambda 都引用val

  • 问题内容: 我最近开始学习python3。 在 python 2 中,可以使用函数来分配列表元素。 如使用功能时在 python 3 中一样 为什么会这样呢? python为什么要进行此更改? 是恩赐还是祸根? 问题答案: Python 3 在很多地方使用了 迭代器 ,而 python 2 使用了 列表 。文档给出了详细的解释,包括对的更改。 优点是,如果您使用大范围的迭代器或映射, Python