【问题标题】:How can I replace a plain URL string in a Paragraph.Text by a Hyperlink?如何用超链接替换 ​​Paragraph.Text 中的纯 URL 字符串?
【发布时间】:2020-07-21 20:42:12
【问题描述】:

我有一个包含多个 Paragraphs 的 Microsoft Word 文档,我必须将其中一个段落中的纯 URL 替换为实际上可以单击的 Hyperlink

整个链接以前是已知的,我只需要找到包含它的段落,然后用真实链接替换该文本(HTML 不起作用)。

// this is how I determine the positions in the text of the paragraph
var urlStartIndex = paragraphRange.Text.IndexOf(linkUrl);
var urlEndIndex = urlStartIndex + linkUrl.Length;

但我无法用链接仅替换 Paragraph.Text 的一部分。

段落中的示例文本是这样的

Click the following link: https://www.somewhereinthe.net/something/somethingmore

仅以https 开头的部分应完全替换为真实链接以使其成为现实

Click the following link: somewhere

一开始我尝试直接插入而不是url,但是简单的去掉url并粘贴链接显然不是很容易做到的。

以下尝试将整个段落替换为可单击但未突出显示的链接(蓝色和带下划线的字体),但其TextToDisplay 也与Address 一样,因此在网络上无处可寻:

private static void ReplacePaypalLinkIn(Word.Paragraph paragraph, Word.Document docx, string linkUrl)
{
    var paragraphRange = paragraph.Range;
    // find the start index of the url
    var urlStartIndex = paragraphRange.Text.IndexOf(linkUrl);
    // calculate the last index of the url
    var urlEndIndex = urlStartIndex + linkUrl.Length;
    // and add it to the hyperlinks of the document at this very paragraph (Anchor)
    var link = docx.Hyperlinks.Add(Anchor: paragraphRange, Address: linkUrl, TextToDisplay: "somewhere");
}

如何替换该 URL 以实际生成 Paragraph,其中包含 URL 之前的文本,而不是 URL,而是由给定的 TextToDisplay 替换的可点击且格式正确的链接?

【问题讨论】:

    标签: c# url hyperlink ms-word office-interop


    【解决方案1】:

    Word 通过 HYPERLINK 字段 管理超链接。字段是 Word 用于处理动态内容的内容。除了超链接之外,还有一些示例是页码、日期、交叉引用 - 任何可以更改或触发操作的内容。

    所以这里需要做的是 1) 找到 URL 并 2) 用超链接替换它。

    通常,使用 Word 的 Find 功能来定位文本中的特定字符串是方便的。 (问题中的代码说明的技术依赖于文档中字符串的 索引位置。不幸的是,这种方法根本不可靠,因为 Word 文档往往包含“隐藏字符”:不可见的控制字符,但会更改文档内容的索引位置值。)

    以下代码sn-p演示了如何使用Find在文档中定位URL字符串,并在其位置插入超链接(字段),使用方法Hyperlinks.Add

    string targetUrl = @"https://www.somewhereinthe.net/something/somethingmore";
    string displayText = "somewhere";
    Word.Range rngUrl = doc.Content;
    
    Word.Find fd = rngUrl.Find;
    fd.Text = targetUrl;
    bool success = fd.Execute();
    if (success)
    {
        doc.Hyperlinks.Add(rngUrl, targetUrl, Type.Missing, Type.Missing, displayText, Type.Missing);
    }
    

    可以在 Word 语言参考中找到 Find 可用的各种属性。了解Execute 运行时可能涉及的所有内容是一个好主意。此处显示的内容已简化为演示基本原理所需的内容。

    重要的是立即知道,正在运行搜索的Range 将切换到“找到”字词。所以rngUrl 首先包含文档的正文,但在定位 URL 时,它会缩减为 URL。因此,超链接将替换 URL。

    【讨论】:

    • 非常感谢这个 sn-p 和解释。这非常有效......现在我知道我必须了解更多关于 Find 的信息。
    • 我可以使用Find 来删除由任何分节符(奇数或偶数)引起的空页吗?我的最终目标是用链接替换 ​​URL(这个问题,再次感谢您的回答),删除空白页面(可能是未来的问题)并将其转换为 pdf (older question)。
    • @deHaar 请将此作为一个新问题提出,并提供完整信息以重现相关情况。根据我从评论中了解到的情况,我倾向于说不,但提供的信息可能不完整。而且无论如何,问题和答案不属于 cmets...
    • 你说得对,它们不属于 cmets... 但是,我按照现在的方式管理它(使用 Find 替换分节符 "^b" 由分页符 "^m") .如果事实证明这不可靠,我肯定会问一个新问题。
    • @deHaar 好吧,是的,删除分节符。但是您询问删除由中断生成的页面 - 这是完全不同的事情。这就是为什么我没有尝试回答任何类型的答案 - 太少的具体信息。
    猜你喜欢
    • 2014-02-21
    • 2010-09-07
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多