无法在不更改下一段的样式的情况下使用Word互操作更改超链接样式

时间:2014-07-22 20:34:21

标签: c# ms-word office-interop

我的文档格式类似于

Section Heading 1
    Paragraph 1
    ...
    Paragraph N
    Sub Heading 1
    Paragraph 1
    ...
    Paragraph N

我要做的是添加从标题到参考文档的超链接。我可以添加超链接并将样式应用于链接,但样式将应用于部分的第1段以及超链接。

注意:WordApp是Microsoft.Office.Interop.Word.Application的单例包装器。 HyperlinkDestionation类只保存书签名称和包含书签的文件的路径。

private void LinkHeadings(string file)
{
     Document doc = WordApp.Open(file);

     for (int i = 1; i <= proposal.Paragraphs.Count; i++)
     {
        HyperlinkDestination dest = null;

        Paragraph paragraph = proposal.Paragraphs[i];
        paragraph.Range.Select();
        Style style = (Style)paragraph.get_Style();
        string styleString = ((Style)paragraph.get_Style()).NameLocal;
        string headingText = paragraph.Range.Text.Split(' ')[0];
        if (styleString.Contains("Heading"))
        {
           dest = _hyperlinkDestinations.Find(x => x.HyperlinkText == headingText);
        }

        if (dest != null)
        {
           Hyperlink link = WordApp.ActiveWindow.Document.Hyperlinks.Add(WordApp.Selection.Range, Address: dest.FilePath, SubAddress: dest.bookmarkName, TextToDisplay: WordApp.Selection.Text);
           link.Range.set_Style(style);
        }
     }

     WordApp.Close(true);
  }

我的猜测是它与超链接锚点有关。我还尝试先删除标题然后插入超链接,但它也有相同的结果。

1 个答案:

答案 0 :(得分:1)

基本问题是您在Word插入的超链接字段中包含段落标记。当显示超链接字段结果时,该段图标记将被隐藏,即章节标题1段。实际上将成为段落1的一部分。当您将样式应用于选择时,整个段落将受到影响。

我不打算在这里提供C#,但这里有一些建议  一个。作为一项规则,最好在Word中使用Range对象,而不是在可能的情况下使用,并且您应该能够在此处执行此操作。  湾如果您将超链接应用于没有段落标记的段落,段落样式将保持不变,因此您不需要重新应用它  C。因此,而不是以&#34; paragraph.Range.Select();&#34;开头的代码。你应该可以使用这样的东西(我让你的C#语法正确 - 也许你可以编辑这个消息)

Range r = Paragraph.Range();
string headingText = r.Text.Split(' ')[0];
if (styleString.Contains("Heading"))
// you shoul probably also tst for an empty paragraph here before inserting anything (I leave it to you)
{
    dest = _hyperlinkDestinations.Find(x => x.HyperlinkText == headingText);
}

if (dest != null)
{
    // Move the end of the range one character towards the beginning
    r.MoveEnd(Word.WdUnits.WdCharacter,-1)
    Hyperlink link = WordApp.ActiveWindow.Document.Hyperlinks.Add(r, Address: dest.FilePath, SubAddress: dest.bookmarkName, TextToDisplay: r.Text);
}

如果您的代码需要在国际范围内运行且需要使用内置样式类型Heading 1..Heading 9检查段落,那么比较Style.Type也会更好看它是否是这9种风格类型中的一种。如果你有其他的样式类型叫&#34; Heading something&#34;需要包含,然后你可能需要检查Style.Type和名称。