【问题标题】:Invalid Hyperlink: Malformed URI is embedded as a hyperlink in the document无效的超链接:格式错误的 URI 作为超链接嵌入到文档中
【发布时间】:2021-05-05 03:24:55
【问题描述】:

我在我的应用程序中使用 OpenXml 命名空间。我正在使用它来读取 Excel 文件中的 XML。这适用于某些 excel 文件,但在其他文件上我得到一个运行时错误,说

无效的超链接:格式错误的 URI 作为超链接嵌入到文档中。

我在下一行得到运行时间

using (var spreadsheet = 
      DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(filePathCopy, true))

我不确定为什么它适用于某些 Excel 文件而不适用于其他文件。

【问题讨论】:

标签: c# openxml excel-addins


【解决方案1】:

解决方案来自 Eric White 的blog post


  1. 从 Nuget 导入 OpenXmlPowerTools 并使用它。

    using OpenXmlPowerTools;
    

    需要的方法是OpenXmlPowerTools.UriFixer.FixInvalidUri,或者你可以从链接中复制UriFixer类。


  1. 添加 FixUri() 函数以使用新定义的 URI 处理损坏的 URI。

    private static Uri FixUri(string brokenUri)
    {
        return new Uri("http://broken-link/");
    }
    

  1. 添加代码以打开文档,如果发生异常,它会修复 URI 并重新打开已修复的文档。

    WordprocessingDocument wDoc;
    try
    {
        using (wDoc = WordprocessingDocument.Open(newFileName, true))
        {
            //Try do something
        }
    }
    catch (OpenXmlPackageException e)
    {
        if (e.ToString().Contains("Invalid Hyperlink"))
        {
            using (FileStream fs = new FileStream(newFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                //Fix problematic URI's
                UriFixer.FixInvalidUri(fs, brokenUri => FixUri(brokenUri));
            }
            using (wDoc = WordprocessingDocument.Open(newFileName, true))
            {
                //Do something without error
            }
        }
    }
    

【讨论】:

  • 感谢您发布解决方案。您的回答对我来说非常有效!
  • 我会使用catch (OpenXmlPackageException e) when (e.InnerException is UriFormatException),而不是依赖可能改变的异常消息(用于本地化等)。
【解决方案2】:

您还可以使用快速 VB 脚本在 Excel 中修复 Excel 工作表:

从 Excel 表中删除超链接的简单方法:

  • 打开工作表。

  • 按 Alt + F11 打开 VB 宏编辑器。

  • 在下方添加 VB 子程序,然后保存。如果您不想保存宏 - 因为您可能只这样做了一次 - 如果出现提示,请忽略无宏工作表错误。

  • 关闭,然后转到宏并运行宏。

    Sub RemoveHyperlinks()

    ' 从活动工作表中删除所有超链接。 ActiveSheet.Hyperlinks.Delete

    结束子

基于:https://www.youtube.com/watch?time_continue=4&v=w8LyIJWIGj0&feature=emb_title

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多