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.)

Problemi correlati