2012-05-23 20 views
6

Estoy manipular un documento de Word 2010 en el lado del servidor y algunos de los controles de contenido en el documento tienen las siguientes propiedades de bloqueo comprobado¿Cómo desbloqueo un control de contenido utilizando OpenXML SDK en un documento de Word 2010?

  • control de contenido no se puede eliminar
  • contenido no se pueden editar

¿Alguien puede aconsejar establecer estas opciones de bloqueo en falso o eliminarlas en su totalidad usando el SDK de OpenXML?

Respuesta

5

El SDK OpenXML ofrece la clase Lock y la LockingValues enumeración para establecer mediante programación las opciones:

  • control de contenido no puede ser eliminado y
  • contenido no se pueden editar

Por lo tanto, a establezca esas dos opciones en "falso" (LockingValues.Unlocked), busque todos los SdtElement elementos en el documento y configure el Val propiedad a LockingValues.Unlocked.

El código siguiente ilustra un ejemplo:

static void UnlockAllSdtContentElements() 
{ 
    using (WordprocessingDocument wordDoc = 
    WordprocessingDocument.Open(@"c:\temp\myword.docx", true)) 
    {   
    IEnumerable<SdtElement> elements = 
     wordDoc.MainDocumentPart.Document.Descendants<SdtElement>(); 

    foreach (SdtElement elem in elements) 
    { 
     if (elem.SdtProperties != null) 
     { 
     Lock l = elem.SdtProperties.ChildElements.First<Lock>(); 

     if (l == null) 
     {    
      continue; 
     } 

     if (l.Val == LockingValues.SdtContentLocked) 
     { 
      Console.Out.WriteLine("Unlock content element..."); 
      l.Val = LockingValues.Unlocked; 
     } 
     } 
    } 
    } 
} 

static void Main(string[] args) 
{ 
    UnlockAllSdtContentElements(); 
} 
1

Sólo para los que copiar este código, tenga en cuenta que si no hay cerraduras asociadas al control de contenido, entonces no será un bloqueo propiedad asociada a él, por lo que cuando el código ejecuta las siguientes instrucciones, devolverá una excepción ya que no se encontró ningún elemento:

Bloquear l = elem.SdtProperties.ChildElements.First();

La forma de arreglar esto es hacer FirstOrDefault en vez de First.

+0

Debe agregarse como comentario a la solución relevante –

+0

Hola @OriPrice, no puedo comentar la solución ya que mi reputación está por debajo de 50. Atentamente. –

Cuestiones relacionadas