2012-03-19 34 views
6

Tôi đang tìm cách chèn một số văn bản sau dấu trang trong tài liệu từ bằng cách sử dụng openxml. Cho đến nay, tôi đã có thể xác định dấu trang bằng cách sử dụng các mục sau:Chèn văn bản sau dấu trang trong openxml

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

Dấu trang này trong tài liệu từ là lựa chọn hai dòng trong tài liệu. Tôi phải chèn một số văn bản ngay sau khi lựa chọn hai dòng. Tôi đã cố gắng chèn văn bản bằng cách sử dụng các mục sau:

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

mainPart.Document.Save(); 

Tuy nhiên, điều này không tạo ra kết quả mong muốn. Có ai biết đúng cách để chèn văn bản ngay sau khi một dấu trang trong một tài liệu từ bằng cách sử dụng openxml?

Trả lời

7

sử dụng

bookMarkToWriteAfter.Parent.InsertAfterSelf(run); 

bạn đang cố gắng để làm việc với XML trực tiếp mà không phải là luôn luôn khuyến khích với OpenXML.

Hãy thử này ..

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

Tôi có một yêu cầu như vậy mà tôi cần phải tìm tất cả các dấu trang trong toàn bộ tài liệu ngay lập tức. Điều này là bởi vì một cái gì đó chung chung đang được thực hiện cho tất cả chúng cùng một lúc trước khi tôi làm việc chèn văn bản. Vì vậy, có cách nào để làm việc với tất cả các dấu trang cùng một lúc và không chia nhỏ theo từng đoạn? –

+1

Bạn có thể nhận được một danh sách tất cả các dấu trang và làm việc với chúng (tùy thuộc vào những gì bạn đang cố gắng làm với chúng), nhưng để chèn văn bản, tốt hơn nên chèn bằng cách sử dụng các phần tử đoạn văn. – Flowerking

1

Bạn không thể giả định rằng một dấu bắt đầu và kết thúc bằng một đoạn. Dấu trang có thể bắt đầu và kết thúc bằng các yếu tố khác nhau và là con của:

bdo (§17.3.2.3); cơ thể (§17.2.2); bình luận (§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); endnote (§17.11.2); fldSimple (§17.16.19); fName (§22.1.2.37); chú thích (§17.11.10); ftr (§17.10.3); hdr (§17.10.4); siêu liên kết (§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); phụ (§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

này có nghĩa là bạn cần phải xem xét tất cả các yếu tố BookmarkEnd trong tài liệu khi kiểm tra các yếu tố BookmarkEnd yêu cầu.

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

Bạn có thể muốn kiểm tra xem Chạy có thể được thêm vào cha mẹ và thêm vào tổ tiên khác hoặc tạo Đoạn mới hay không.

(Tôi đã có thể thích để có thêm điều này như một bình luận cho câu trả lời Flowerking nhưng tôi không thể bình luận vì vậy tôi đã sửa đổi mã của họ trong câu trả lời này.)

Các vấn đề liên quan