Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invalid Hyperlink: Malformed URI is embedded as a hyperlink in the document

I'm using the OpenXml namespace in my application. I'm using this to read the XML within an Excel file. This works fine with certain excel files but on others I get a run time error saying

Invalid Hyperlink: Malformed URI is embedded as a hyperlink in the document.

I get the run time on the following line

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

I'm not sure why it works for some Excel files and doesn't work on others.

like image 397
Craig Gallagher Avatar asked Dec 05 '16 17:12

Craig Gallagher


1 Answers

Solution is from Eric White's blog post


  1. Import OpenXmlPowerTools from Nuget and use it.

    using OpenXmlPowerTools;
    

    The method needed is OpenXmlPowerTools.UriFixer.FixInvalidUri, or you could copy the UriFixer class from the link.


  1. Add the FixUri() Function to handle the broken URI's with a new defined URI.

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

  1. Add code to open the document, if the exception occurs it fixes the URI's and re-opens the fixed document.

    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
            }
        }
    }
    
like image 161
Nick4814 Avatar answered Oct 05 '22 00:10

Nick4814