2017-03-10 4 views
1

Ich lese Inhaltssteuerung von docx durch sein Tag. Und ich möchte Zugang zu ihm blockieren (Benutzer wird Inhalt nicht bearbeiten können). Wie kann ich das machen? Hier ist mein Code Kontrolle durch seine Tag-Namen von docx-Dokument für das Erhalten:So blockieren Sie den Zugriff auf Inhaltssteuerelemente - Öffnen Sie xml

using (WordprocessingDocument wordDocTarget = WordprocessingDocument.Open(targetFilePath, true)) 
{ 
     MainDocumentPart mainPartSource = wordDocSource.MainDocumentPart; 
     SdtBlock sdtBlock = mainPartSource.Document.Body.Descendants<SdtBlock>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "myTagName").SingleOrDefault(); 

     // rest of my code (editing inner text) 
} 

Antwort

2

Sie einfügen können ein Lock (<w:lock>) Element in dem SdtProperties -elementigen -, die den Inhalt schreibgeschützt machen. Zum Beispiel definiert dies eine Steuerklartextinhalt den Text ‚Hallo‘ enthält, die nur gelesen wird angezeigt, wenn der Bearbeitung des Dokuments in Word:

<w:document> 
    <w:body> 
     <w:sdt> 
      <w:sdtPr> 
       <w:lock w:val="contentLocked" /> 
       <w:text /> 
      </w:sdtPr> 
      <w:sdtContent> 
       <w:p> 
        <w:r> 
         <w:t>hello</w:t> 
        </w:r> 
       </w:p> 
      </w:sdtContent> 
     </w:sdt> 
    ... 
    </w:body> 
</w:document> 

In Code können Sie so etwas wie dieses verwenden, um die Sperre hinzuzufügen:

using (var document = WordprocessingDocument.Open(@"c:\temp\test.docx", true)) 
{ 
    SdtBlock sdtBlock = 
     document 
     .MainDocumentPart 
     .Document 
     .Body 
     .Descendants<SdtBlock>() 
     .Where(b => b.SdtProperties.GetFirstChild<Tag>().Val == "myTagName") 
     .SingleOrDefault(); 

    var contentLock = new Lock { Val = LockingValues.SdtContentLocked }; 
    sdtBlock.SdtProperties.AppendChild(contentLock); 
} 

Ich finde es nützlich, mit einem Word-Dokument zu beginnen und dann OpenXML Productivity Tool zu verwenden, um die von Word erzeugte XML zu sehen.

+0

Danke! es funktioniert großartig :) Und ich füge hinzu, dass sdtBlock.SdtProperties.RemoveAllChildren (); wird SdtBlock freigeben. – daniell89

Verwandte Themen