2016-12-22 30 views
1

私は、ワードドキュメント内のハイパーリンクを修正しようとしています。ハイパーリンクは、もともと外部の文書内のブックマークを指しています。私がしたいのは、同じアンカーとしての内部ブックマークを指すように変更することです。openxmlでハイパーリンクを変更する

私が使用しているコードは次のとおりです。変数は何時に表示されますが、保存されたドキュメントを見ると元のようになります。

私のチャンスが持続しない理由は何ですか?明示的

// 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パッケージをプラス、すべての基礎となります部分ストリーム。

またDisposeが呼び出されたときOpenXMLPackageが保存される場合にはtrueにAutoSaveプロパティを設定することができます。私が上記で使用したusingの記述は、それが起こることを保証するでしょう。

+0

ありがとうございました! Wordでは、内部ブックマークにハイパーリンクを追加すると、URLはなく、テキストの前に「#」だけが表示されます。 "#Bookmark" "C:\ TEMPO \ smartbook \ test.docx"を指定する代わりに、自分自身でURLを作成する方法を知っていますか? –

関連する問題