2008-10-09 19 views
7

Sử dụng SDK OpenXML, tôi muốn chèn đoạn mã HTML cơ bản vào tài liệu Word.Chèn HTML vào Tài liệu Word OpenXML (.Net)

Làm thế nào bạn sẽ làm điều này:

  • Thao tác XML trực tiếp?
  • Sử dụng XSLT?
  • bằng AltChunk?

Hơn nữa, C# hoặc VB ví dụ là chào đón nhiều hơn :)

Trả lời

2

Tôi không chắc chắn, những gì bạn thực sự muốn đạt được. Các tài liệu OpenXML có ký hiệu giống như html (WordprocessingML) cho các phần tử định dạng (như đoạn văn, văn bản in đậm, vv). Nếu bạn muốn thêm một số văn bản vào một tài liệu, với định dạng cơ bản, hơn là tôi đề xuất sử dụng cú pháp OpenXML và định dạng văn bản được chèn với văn bản đó.

Nếu bạn có đoạn mã html, bạn phải đưa vào tài liệu như vậy, bạn có thể sử dụng tính năng "nội dung bên ngoài" của OpenXML. Với nội dung bên ngoài, bạn có thể đưa tài liệu HTML vào gói và tạo tham chiếu (altChunk) trong tài liệu ở vị trí mà bạn muốn đưa vào tài liệu này. Những bất lợi của giải pháp này, rằng không phải tất cả các công cụ sẽ hỗ trợ (hoặc hỗ trợ đúng) các tài liệu được tạo ra, do đó tôi không khuyên bạn nên giải pháp này, trừ khi bạn thực sự không thể thay đổi nguồn HTML.

Cách bao gồm bất kỳ nội dung nào (từ wordml) vào tài liệu từ openxml là câu hỏi độc lập IMHO và câu trả lời phụ thuộc rất nhiều vào cách sửa đổi phức tạp mà bạn muốn áp dụng và tài liệu lớn như thế nào. Đối với một tài liệu đơn giản, tôi chỉ cần đọc phần tài liệu từ gói, lấy luồng của nó và tải nó vào một XmlDocument. Bạn có thể chèn thêm nội dung vào XmlDocument khá dễ dàng, và sau đó lưu nó trở lại gói. Nếu tài liệu lớn, hoặc bạn cần sửa đổi phức tạp ở nhiều nơi, XSLT là một lựa chọn tốt.

+2

Bạn nói đúng, nhưng tôi đang tìm kiếm trở lại của kinh nghiệm. Cho đến nay, tôi đã thực hiện altChunk nhưng nó chỉ hoạt động nếu bạn có Word2007, không phải là gói tương thích. – Nico

4

Rất khó để đưa ra lời khuyên chung, bởi vì nó phụ thuộc rất nhiều vào đầu vào của bạn những gì là tốt nhất.

Dưới đây là một ví dụ đơn giản chèn một đoạn văn vào một tài liệu DOCX cho mỗi đoạn trong một (X) tài liệu HTML sử dụng v2.0 OpenXML SDK và một XPathDocument:

void ConvertHTML(string htmlFileName, string docFileName) 
    { 
     // Create a Wordprocessing document. 
     using (WordprocessingDocument package = WordprocessingDocument.Create(docFileName, WordprocessingDocumentType.Document)) 
     { 
      // Add a new main document part. 
      package.AddMainDocumentPart(); 

      // Create the Document DOM. 
      package.MainDocumentPart.Document = new Document(new Body()); 
      Body body = package.MainDocumentPart.Document.Body; 

      XPathDocument htmlDoc = new XPathDocument(htmlFileName); 

      XPathNavigator navigator = htmlDoc.CreateNavigator(); 
      XmlNamespaceManager mngr = new XmlNamespaceManager(navigator.NameTable); 
      mngr.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml"); 

      XPathNodeIterator ni = navigator.Select("//xhtml:p", mngr); 
      while (ni.MoveNext()) 
      { 
       body.AppendChild<Paragraph>(new Paragraph(new Run(new Text(ni.Current.Value)))); 
      } 

      // Save changes to the main document part. 
      package.MainDocumentPart.Document.Save(); 
     } 
    } 

Ví dụ đòi hỏi đầu vào của bạn có giá trị XML, nếu không bạn sẽ nhận được một ngoại lệ khi tạo XPathDocument.

Xin lưu ý rằng đây là một ví dụ rất cơ bản không tính đến bất kỳ định dạng, tiêu đề, danh sách, v.v.