2012-03-19 19 views
6

Sto cercando un modo per inserire del testo dopo un segnalibro in un documento di parola utilizzando OpenXML. Finora, sono stato in grado di individuare il segnalibro utilizzando il seguente:testo Inserimento dopo un segnalibro in OpenXML

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

Questo segnalibro nel documento di parola è una selezione di due righe nel documento. Devo inserire del testo subito dopo la selezione di due righe. Ho provato a inserire il testo utilizzando il seguente:

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

mainPart.Document.Save(); 

Ciò tuttavia non produce il risultato desiderato. Qualcuno sa del modo corretto per inserire il testo a destra dopo un segnalibro in un documento Word utilizzando OpenXML?

risposta

7

utilizzando

bookMarkToWriteAfter.Parent.InsertAfterSelf(run); 

si sta cercando di lavorare con XML direttamente, che non è sempre consigliabile con OpenXML.

Try This ..

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

Ho un requisito del genere che ho bisogno di trovare tutte i segnalibri nell'intero documento a prima vista. Questo perché qualcosa di generico viene fatto a tutti in una volta prima di fare l'inserimento del testo. Quindi c'è un modo per lavorare con tutti i segnalibri contemporaneamente e non divisi per paragrafi? –

+1

È possibile ottenere un elenco di tutti i segnalibri e lavorare con loro (a seconda di cosa si sta cercando di fare con loro), ma per l'inserimento di testi, è meglio inserire utilizzando elementi di paragrafo. – Flowerking

1

Non si può presumere che un segnalibro inizia e finisce in un paragrafo. I segnalibri possono iniziano e finiscono in elementi diversi ed essere figli di:

BDO (§17.3.2.3); corpo (§17.2.2); commento (§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 di chiusura (§17.11.2); fldSimple (§ 17.16.19); fName (§22.1.2.37); nota in calce (§ 17.11.10); ftr (§17.10.3); hdr (§17.10.4); collegamento ipertestuale (§ 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

Questo significa che è necessario guardare tutti gli elementi bookmarkend del documento durante il controllo per l'elemento bookmarkend richiesto.

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

Si consiglia di verificare che una corsa può essere aggiunto al genitore e aggiungere ad un antenato diverso o creare un nuovo paragrafo.

(mi sarebbe piaciuto aver aggiunto questo come un commento alla risposta di Flowerking ma non posso commentare quindi ho modificato il proprio codice in questa risposta.)