Pregunta

necesito algo como un marcador de posición. Me miré en un primer momento para controlar el contenido como una solución pero estoy teniendo algunos problemas con él.

Entonces miré a añadir a la CustomXML .docx, pero aparté de que debido a la demanda de i4i.

Entonces decidí que acaba de cambiar el texto sin formato del control de contenido a través de OpenXML SDK 2.0, pero incluso si es tan marcado el contenido de control no desaparece. Supongo que no sabe que el texto cambia a menos que suceda dentro de la palabra.

Podría tal vez sólo eliminar el texto CC y el lugar en lugar, pero tengo miedo de problemas con formato y estilos que podría traer, y también sería clase de desafiar a los fines del control de contenido.

Luego comenzó a preguntarse si podría definir mis propios marcadores de posición que Word podría reconocer. A través de los bloques de construcción tal vez. Que no tiene que hacer nada más que ser fácil de encontrar usando OpenXML y de alguna manera taggable así que sé lo que se debe sustituir. No estoy realmente seguro de lo que puede hacerse con bloques de construcción pero estoy esperando que es factible.

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

a) Algo que es fácil de colocar en la plantilla, tal vez predefinido marcadores de posición de control de contenido que se puede colocar donde quieres probar y estilo que te gusta.

b) Cuando los datos ha sido añadido que elimina todos los marcadores de posición, que no se modificará de nuevo. Se mantiene el estilo / el formato definido en el marcador de posición.

En resumen, necesito respuesta a cualquiera

¿Cómo puedo editar el contenido de los controles OpenXML SDK para que se retiran después se añade el texto.

-O -

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

¿Fue útil?

Solución

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

Otros consejos

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

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

En el primer caso, creo que tendrá que quitar usted mismo como Bilel sugirió . En este último caso, usted debe buscar en esta propiedad: ContentControl.Temporary (" el ContentControl se elimina automáticamente cuando el usuario escribe en el control, o cuando el texto en el control se cambia mediante programación. cuando el ContentControl se elimina automáticamente del documento, el texto en el de control permanece en el documento. ")

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top