我的文档格式类似于
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);
}
我的猜测是它与超链接锚点有关。我还尝试先删除标题然后插入超链接,但它也有相同的结果。
答案 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和名称。