2012-03-19 65 views
6

Estoy buscando una manera de insertar texto después de un marcador en un documento de Word usando openxml. Hasta ahora, he sido capaz de localizar el marcador mediante lo siguiente:Insertar texto después de un marcador en openxml

var bookmarks = mainPart.Document.Descendants<BookmarkStart>().ToList(); 
var bookMarkToWriteAfter = bookmarks.FirstOrDefault(bm => bm.Name == insertAfterBoomark.Name); 

Este marcador en el documento de Word es una selección de dos líneas en el doc. Tengo que insertar algo de texto justo después de la selección de dos líneas. He tratado de insertar texto utilizando la siguiente:

var run = new Run(); 
run.Append(new Text("Hello World")); 
bookMarkToWriteAfter .Parent.InsertAfterSelf(run); 

mainPart.Document.Save(); 

Sin embargo, esto no produce el resultado deseado. ¿Alguien sabe de la forma correcta de insertar texto justo después de un marcador en un documento de Word usando openxml?

Respuesta

7

usando

bookMarkToWriteAfter.Parent.InsertAfterSelf(run); 

usted está tratando de trabajar con XML directamente que no siempre es aconsejable con OpenXML.

intenta esto ..

Body body = mainPart.Document.GetFirstChild<Body>(); 
    var paras = body.Elements<Paragraph>(); 

    //Iterate through the paragraphs to find the bookmarks inside 
    foreach (var para in paras) 
    { 
     var bookMarkStarts = para.Elements<BookmarkStart>(); 
     var bookMarkEnds = para.Elements<BookmarkEnd>(); 


     foreach (BookmarkStart bookMarkStart in bookMarkStarts) 
     { 
      if (bookMarkStart.Name == bookmarkName) 
      { 
       //Get the id of the bookmark start to find the bookmark end 
       var id = bookMarkStart.Id.Value; 
       var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First(); 

       var runElement = new Run(new Text("Hello World!!!")); 

       para.InsertAfter(runElement, bookmarkEnd); 

      } 
     } 
    } 
    mainPart.Document.Save(); 
+0

que tienen tal requisito que necesito para encontrar todos los marcadores en todo el documento de inmediato. Esto se debe a que se está haciendo algo genérico para todos a la vez antes de insertar el texto. Entonces, ¿hay alguna manera de trabajar con todos los marcadores a la vez y no dividirlos por párrafos? –

+1

Puede obtener una lista de todos los marcadores y trabajar con ellos (dependiendo de lo que intente hacer con ellos), pero para insertar textos, es mejor insertarlos usando elementos de párrafo. – Flowerking

1

Usted no puede asumir que un marcador comienza y termina en un párrafo. Los marcadores pueden comenzar y terminar en diferentes elementos y ser hijos de:

bdo (§17.3.2.3); cuerpo (§17.2.2); comentario (§17.13.4.2); customXml (§17.5.1.6); customXml (§17.5.1.4); customXml (§17.5.1.5); customXml (§17.5.1.3); deg (§22.1.2.26); del (§17.13.5.14); den (§22.1.2.28); dir (§17.3.2.8); docPartBody (§17.12.6); e (§22.1.2.32); nota al final (§17.11.2); fldSimple (§17.16.19); fName (§22.1.2.37); nota al pie (§17.11.10); ftr (§17.10.3); hdr (§17.10.4); hipervínculo (§17.16.22); ins (§17.13.5.18); lim (§22.1.2.52); moveFrom (§17.13.5.22); moveTo (§17.13.5.25); num (§22.1.2.75); oMath (§22.1.2.77); p (§17.3.1.22); rt (§17.3.3.24); rubyBase (§17.3.3.27); sdtContent (§17.5.2.34); sdtContent (§17.5.2.33); sdtContent (§17.5.2.35); sdtContent (§17.5.2.36); smartTag (§17.5.1.9); sub (§22.1.2.112); sup (§22.1.2.114); tbl (§17.4.38); tc (§17.4.66); tr (§17.4.79)

https://msdn.microsoft.com/en-gb/library/documentformat.openxml.wordprocessing.bookmarkstart(v=office.15).aspx

Esto significa que hay que buscar en todos los elementos bookmarkend en el documento cuando se verifica el elemento bookmarkend requerido.

Body body = mainPart.Document.GetFirstChild<Body>(); 
var bookMarkStarts = body.Descendants<BookmarkStart>(); 
var bookMarkEnds = body.Descendants<BookmarkEnd>(); 

foreach (BookmarkStart bookMarkStart in bookMarkStarts) 
{ 
    if (bookMarkStart.Name == bookmarkName) 
    { 
     //Get the id of the bookmark start to find the bookmark end 
     var id = bookMarkStart.Id.Value; 
     var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First(); 

     var runElement = new Run(new Text("Hello World!!!")); 

     bookmarkEnd.Parent.InsertAfter(runElement, bookmarkEnd); 
    } 
} 
mainPart.Document.Save(); 

Es posible que desee comprobar que un Run se puede añadir a los padres y añadir a un antepasado diferente o crear un nuevo párrafo.

(me hubiera gustado haber añadido esto como un comentario a la respuesta de Flowerking pero no puedo comentar lo que han modificado su código en esta respuesta.)

Cuestiones relacionadas