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 đó:
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).
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.
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");
Xóa tất cả dữ liệu vào tài liệu này.
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.
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);
}
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);
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 đó.
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
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 –
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