2016-12-22 5 views
1

Ich versuche, einen Hyperlink in einem Word-Dokument zu ändern. Der Hyperlink verweist ursprünglich auf ein Lesezeichen in einem externen Dokument. Ich möchte es so ändern, dass es auf ein internes Lesezeichen verweist, das als derselbe Anker fungiert.Ändern von Hyperlink mit openxml

Hier ist der Code, den ich benutze ... Es scheint zu funktionieren, wenn ich was die Variablen, aber wenn ich auf das gespeicherte Dokument schaue es ist genau wie das Original.

Was ist der Grund, warum meine Chancen nicht bestehen?

// 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(); 

Antwort

1

Sie haben noch nicht Ihre OpenXmlPackage gespeichert, wenn Sie den Stream zu schreiben ...

// 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()); 
} 

Die Close Methode heißt es ausdrücklich:

Speichert und schließt das OpenXml Paket sowie alle zugrunde liegenden Teilströme.

könnten Sie setzen auch die AutoSave Eigenschaft auf true in welchem ​​Fall die OpenXMLPackage gespeichert werden, wenn Dispose genannt wird. Die using Anweisung, die ich oben verwendet habe, würde garantieren, dass das passieren wird.

+0

Vielen Dank, es hat funktioniert! Jetzt, in Word, wenn ich einen Hyperlink zu einem internen Lesezeichen hinzufügen, gibt es keine URL, nur ein "#" vor dem Text ex. "#Lesezeichen". Würdest du zufällig wissen, wie ich eine URL auf self erstellen könnte anstatt "C: \ TEMPO \ smartbook \ test.docx" anzugeben? –