Изменение гиперссылки с помощью openxml

Я пытаюсь изменить гиперссылку в текстовом документе. Гиперссылка изначально указывает на закладку во внешнем документе. То, что я хочу сделать, это изменить его, чтобы указать на внутреннюю закладку, что и тот же Anchor.

Вот код, который я использую... Кажется, что работает, когда я, что переменные, но когда я смотрю на сохраненный документ, это точно так же, как оригинал.

По какой причине мои шансы не сохраняются?

// read file specified in stream 
MemoryStream stream = new MemoryStream(File.ReadAllBytes("C:\\TEMPO\\smartbook\\text1.docx"));
WordprocessingDocument doc = WordprocessingDocument.Open(stream, true);

MainDocumentPart mainPart = doc.MainDocumentPart;

// The first hyperlink -- it happens to be the one I want to modify 
Hyperlink hLink = mainPart.Document.Body.Descendants<Hyperlink>().FirstOrDefault();
if (hLink != null)
{
    // get hyperlink's relation Id (where path stores)
    string relationId = hLink.Id;
    if (relationId != string.Empty)
    {
        // get current relation
        HyperlinkRelationship hr = mainPart.HyperlinkRelationships.Where(a => a.Id == relationId).FirstOrDefault();
        if (hr != null)
        {
            // remove current relation
            mainPart.DeleteReferenceRelationship(hr);
            // add new relation with relation 
            // mainPart.AddHyperlinkRelationship(new Uri("C:\\TEMPO\\smartbook\\test.docx"), false, relationId);
        }
    }

    // change hyperlink attributes
    hLink.DocLocation = "#";
    hLink.Id = "";
    hLink.Anchor = "TEST";
}
// save stream to a new file
File.WriteAllBytes("C:\\TEMPO\\smartbook\\test.docx", stream.ToArray());
doc.Close();

1 ответ

Решение

Вы еще не сохранили свой OpenXmlPackage при записи потока...

// types that implement IDisposable are better wrapped in a using statement
using(var stream = new MemoryStream(File.ReadAllBytes(@"C:\TEMPO\smartbook\text1.docx")))
{
   using(var doc = WordprocessingDocument.Open(stream, true))
   {
      // do all your changes
      // call doc.Close because that SAVES your changes to the stream
      doc.Close(); 
   }
   // save stream to a new file
   File.WriteAllBytes(@"C:\TEMPO\smartbook\test.docx", stream.ToArray());
} 

Close метод заявляет явно:

Сохраняет и закрывает пакет OpenXml плюс все основные потоки компонентов.

Вы также можете установить AutoSave свойство true, и в этом случае OpenXMLPackage будет сохранен, когда Dispose называется. using Заявление, которое я использовал выше, будет гарантировать, что это произойдет.

Другие вопросы по тегам