2017-03-10 45 views
1

我正在通過其標記從docx讀取內容控件。我想阻止對它的訪問(用戶將無法編輯內容)。我怎樣才能做到這一點? 這是我從DOCX文檔得到控制其標籤名稱代碼:如何阻止對內容控件的訪問 - 打開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) 
} 

回答

2

可以插入在SdtProperties - 元素一個Lock<w:lock>)元素 - 這將使內容爲只讀。例如這個定義包含文本「你好」出現編輯的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> 

在代碼中,你可以使用這樣的添加鎖:

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

我覺得它非常有用,首先使用Word文檔,然後使用OpenXML Productivity Tool查看Word生成的xml。

+0

謝謝!它工作的很棒:)我添加了sdtBlock.SdtProperties.RemoveAllChildren ();將取消阻止SdtBlock。 – daniell89