2012-03-18 29 views

Trả lời

8

Có một cái nhìn tại Fourth and Final Screen-Cast in Series on Adding/Updating the TOC in OpenXML WordprocessingML Documents bởi Eric Trắng.

Hy vọng điều đó sẽ hữu ích!

UPDATE:


According FAQ từ MSDN đàn tôi thấy rằng tính năng này không được hỗ trợ:

8) Làm thế nào để tạo TOC (bảng nội dung) trong tài liệu Word?

Mở XML SDK 2.0 không hỗ trợ tính năng này. Nhưng bạn có thể tạo một TOC nhỏ thông qua ứng dụng Word và phản ánh các bộ phận TOC bằng tài liệu Thành phần phản xạ trong Công cụ năng suất SDK XML mở để xem cách tạo TOC theo chương trình. Để biết thông tin chi tiết hơn, xin vui lòng tham khảo:


CẬP NHẬT 2


Dựa trên ý kiến ​​của chúng tôi dưới đây tôi có thể đề xuất sử dụng kịch bản này:

  1. Bạn tự tạo một tập tin DOCX trống và chèn TOC bên trong nó.
  2. Sau đó, bạn lưu tệp này và mở tệp trong Công cụ OpenXML SDK 2.0, cung cấp cho bạn mã C# để tạo tệp rỗng với trình giữ chỗ TOC bên trong.
  3. Sau đó, bạn lập trình xóa tất cả dữ liệu bạn cần đối với tệp DOCX này và lưu nó.
  4. Ngoài ra, bạn sẽ cần cung cấp cơ chế tự động cập nhật TOC sau khi dữ liệu bị xóa (hoặc khi tài liệu được mở). Có một vài tùy chọn để làm điều đó - xem màn hình phôi 3-5 từ liên kết tới bài đăng Eric White mà tôi đã cung cấp ở trên. Đặc biệt, tôi nghĩ bạn nên chú ý đến 5th one - "Cho biết cách sử dụng macro AutoOpen để cập nhật TOC bất kỳ khi nào bất kỳ tài liệu nào chứa TOC được mở".

Tất cả điều này trông hơi phức tạp, nhưng tôi hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn, nhưng liên kết bị hỏng. Đã [this] (http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2011/08/22/exploring-tables-of-contents-in-openxml-wordprocessingml-documents-part-4.aspx) nó ? – Yeseanul

+0

Tôi có liên kết cố định. Và - vâng - điều đó giống như được đăng trên openxmldeveloper.org ...Sau một số nghiên cứu, tôi đã điều chỉnh câu trả lời của mình với một số chi tiết mới –

+0

Cảm ơn bạn đã trả lời. Tôi cũng đã đọc hầu hết các nội dung liên quan đến MSDN, nhưng tôi không có ý tưởng làm thế nào để thực hiện giải pháp này. Hơn nữa, không ai có vẻ đã cung cấp một ví dụ. Sau khi tất cả, một TOC là một phần quan trọng của một tài liệu ... Tôi nghĩ nó được bao phủ bởi OpenXML SDK theo cách này hay cách khác (hoặc ít nhất ai đó đã tìm ra giải pháp dễ sử dụng). – Yeseanul

3

Nhờ Dmitri Pavlov (@DmitryPavlov) để được trợ giúp.

Tôi không muốn trả lời câu hỏi của riêng mình, nhưng đây chỉ là minh họa các bước tôi đã thực hiện.

Lời khuyên dành cho bất kỳ ai quan tâm là xem màn hình 5 phần của Eric White - Exploring Tables-of-Contents in Open XML WordprocessingML Documents. Điều này có tất cả các thông tin liên quan đến việc thêm và cập nhật một TOC (nhiều hơn nữa).

Giải pháp của tôi là sử dụng Mẫu (chỉ là tài liệu trống thông thường có kiểu cho mọi thứ tôi cần: Tiêu đề 1-5, Kiểu TOC, v.v.). Điều này đặc biệt hữu ích khi sửa chữa nhanh chóng cho vấn đề kiểu (tài liệu mới, có TOC, sẽ tạo tệp style.xml mới; tệp này có một số dữ liệu bổ sung; kết quả là hệ thống phân cấp trong TOC không phải là dự kiến ​​- tức là, tiêu đề 2 là con của tiêu đề 1, tiêu đề 3 là con của tiêu đề 2, v.v.).

Do đó:

  1. Tạo một tài liệu Word và thêm tất cả các yếu tố mà bạn mong đợi để được thêm vào sau đó lập trình (ví dụ, Header 1-5, Table of Contents, vv). Xóa tất cả nội dung và lưu tài liệu (lý do cho việc này là tạo kiểu cho tất cả các phần tử cần thiết).

  2. Cá nhân tôi đã thêm mẫu (tệp được tạo ở bướC# 1) làm tài nguyên trong dự án của tôi.

  3. Trong mã của bạn, tạo bản sao mẫu mới (đây sẽ là tệp thực tế mà bạn sẽ làm việc). Tôi đã sử dụng:

    byte[] stream = Properties.Resources.Template; 
    File.WriteAllBytes(@"D:\Template.docx", stream); 
    File.Copy(@"D:\Template.docx", @"D:\New.docx"); 
    
  4. Xóa tất cả dữ liệu vào tài liệu này.

  5. Thêm tệp nguồn từ diễn viên 2, 3 hoặc 4 vào dự án của bạn (cho điều này, hãy xem screen-cast 3) - ở cuối những bài đăng đó, bạn sẽ tìm thấy liên kết để tải xuống TocAdder.zip . Hoặc chỉ cần thêm một tham chiếu đến TocAdder.dll.

  6. Chèn TOC. Chỉ cần ví dụ:

    using (WordprocessingDocument wdoc = WordprocessingDocument.Open(@"D:\New.docx", true)) 
    { 
        XElement firstPara = wdoc 
         .MainDocumentPart 
         .GetXDocument() 
         .Descendants(W.p) 
         .FirstOrDefault(); 
        TocAdder.AddToc(wdoc, firstPara, 
         @"TOC \o '1-3' \h \z \u", null, null); 
    } 
    
  7. Thay thế kiểu trong tài liệu mới được tạo bằng tài liệu từ mẫu. Bạn có thể sử dụng tài nguyên này từ MSDN: Replacing the Styles Parts in Word 2010 Documents by Using the Open XML SDK 2.0. Một lần nữa, một ví dụ:

    string fromDoc = @"D:\Template.docx"; 
    string toDoc = @"D:\New.docx"; 
    var node = WDExtractStyles(fromDoc, false); 
    if (node != null) 
        WDReplaceStyles(toDoc, node, false); 
    node = WDExtractStyles(fromDoc); 
    if (node != null) 
        WDReplaceStyles(toDoc, node); 
    
  8. Tùy chọn sử dụng một trong những phương pháp được mô tả trong màn hình đúc 3, 4 hoặc 5 để có được xung quanh vấn đề với hộp thoại modal mà Word đặt lên.

Hy vọng điều này sẽ hữu ích cho ai đó.

+0

Bạn cũng có thể xóa hộp thoại phương thức khi đang làm việc với các luồng thay vì tệp không? Bởi vì tôi đang tạo một tài liệu bằng cách sử dụng bộ nhớ, và sau đó cung cấp cho người dùng để tải xuống. Bây giờ họ phải bấm có để cập nhật Mục Lục, bởi vì tôi không thể tìm cách tránh hộp thoại phương thức này. –

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