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

Cra*_*her 11 c# openxml excel-addins

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

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

我在下一行得到运行时间

using (var spreadsheet = 
      DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(filePathCopy, true))
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*814 11

解决方案来自 Eric White 的博客文章


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

    using OpenXmlPowerTools;
    
    Run Code Online (Sandbox Code Playgroud)

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


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

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

  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
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 我会使用“catch (OpenXmlPackageException e) when (e.InnerException is UriFormatException)”,而不是依赖可能更改的异常消息(用于本地化等)。 (2认同)