2010-08-10 8 views
13

Necesito algo como marcador de posición. Al principio miré al Control de contenido como una solución, pero estoy teniendo algunos problemas con él.Reemplazo de controles de contenido en OpenXML

Luego busqué agregar CustomXML al .docx pero me alejé de eso debido a la demanda i4i.

Luego decidí que simplemente cambiaría el texto del Control de contenido a través de OpenXML SDK 2.0, pero incluso si está marcado, el Control de contenido no desaparece. Supongo que no sabe que el texto cambió a menos que ocurra dentro de la palabra.

Quizás podría simplemente eliminar el CC y colocar texto en su lugar, pero tengo miedo de los problemas con el formato y los estilos que podría traer, y también desafiaría el propósito del Control de contenido.

Luego comencé a preguntarme si podría definir mis propios marcadores de posición que Word podría reconocer. A través de bloques de construcción tal vez. No tiene que hacer nada excepto ser fácil de encontrar usando OpenXML y de alguna manera etiquetable, así sé con qué reemplazarlo. No estoy seguro de qué se puede hacer con Building Blocks, pero espero que sea factible.

No está seguro de qué solución sería la mejor para mí, pero lo que necesito es:

a) Algo que es fácil de colocar en la plantilla, los marcadores de posición de control de contenido quizá predefinidas que se pueden colocar donde quieres probar y estilo como quieras.

b) Cuando los datos se han agregado, elimina todos los marcadores de posición, no se modificará de nuevo. Mantiene el estilo/formato definido en el marcador de posición.

En resumen, necesito respuesta a cualquiera

¿Cómo puedo editar controles de contenido en OpenXML SDK por lo que serán eliminados después de añadir texto.

-O-

¿Puedo definir mi propia etiqueta OpenXML personalizado para un documento de Word que entonces podría reemplazar?

Respuesta

7

Tal vez esto le puede ayudar,

private void DeleteSdtBlockAndKeepContent(MainDocumentPart mainDocumentPart, string sdtBlockTag) 
    { 
     List<SdtBlock> sdtList = mainDocumentPart.Document.Descendants<SdtBlock>().ToList(); 
     SdtBlock sdtA = null; 

     foreach (SdtBlock sdt in sdtList) 
     { 
      if (sdt.SdtProperties.GetFirstChild<Tag>().Val.Value == sdtBlockTag) 
      { 
       sdtA = sdt; 
       break; 
      } 
     } 


     OpenXmlElement sdtc = sdtA.GetFirstChild<SdtContentBlock>(); 
     OpenXmlElement parent = sdtA.Parent; 

     OpenXmlElementList elements = sdtc.ChildElements; 

     var mySdtc = new SdtContentBlock(sdtc.OuterXml); 

     foreach (OpenXmlElement elem in elements) 
     { 

      string text = parent.FirstChild.InnerText; 
      parent.Append((OpenXmlElement)elem.Clone()); 
     } 

     sdtA.Remove(); 
    } 
+1

Sí, gracias, ya hice algo similar y coloqué tablas dentro de bloques para texto iterado y otras dentro de sdtRun y ​​las reemplacé en base al XML de datos que tenía una ruta para establecer en la etiqueta de contenido –

1

Tome una mirada en el uso de un campo. Los campos de combinación de correspondencia están diseñados para exactamente este propósito.

+0

Lo comprobaré. Aunque logré que funcionara con stdRun y ​​stdBlock, y tal no siempre aparece como tal cuando se crea el Doc. –

+0

Hacemos esto en nuestro sistema de informes (Windward) y funciona bien.Compruebe la validez del archivo docx que está creando de cerca. –

1

No entiendo de su pregunta si solo está interesado en una solución que elimine automáticamente ContentControl/SDT cuando la modifique utilizando OpenXML SDK, o si desea que desaparezca después de que el contenido se modifique mediante programación o por un usuario.

Si el primero, creo que tendrá que eliminarlo usted mismo as Bilel suggested. En este último caso, debe consultar esta propiedad: ContentControl.Temporary ("ContentControl se elimina automáticamente cuando el usuario ingresa el control o cuando el texto del control se cambia programáticamente. Cuando ContentControl se elimina automáticamente del documento, el texto en el control permanece en el documento. ")

Cuestiones relacionadas