2011-09-30 29 views
6

Tôi đã thử nghiệm với việc xây dựng một addin Outlook 2010 trong C#, bằng cách sử dụng Visual Studio 2008. Tôi có thể có được một đối tượng Microsoft.Office.Interop.Word.DocumentClass từ một đối tượng Microsoft.Office.Interop.Outlook.Inspector, đại diện cho e-mail đang được chỉnh sửa. Tôi hiểu rằng điều này DocumentClass được sử dụng trong nhiều ngữ cảnh khác nhau (thường là cho các phần mở rộng của Microsoft Word, không ngạc nhiên).Làm thế nào để chuyển đổi các tài sản WordOpenXML thành một System.IO.Packaging.Package?

Lớp đó có tài sản được gọi là WordOpenXML, có vẻ như là biểu diễn XML của tất cả các tệp cấu thành gói .docx sẽ được lưu vào đĩa khi lưu tài liệu Word này dưới dạng .docx.

Một cách mà thuộc tính này sẽ rất hữu ích là nếu nó có thể được chuyển đổi thành một đối tượng System.IO.Packaging.Package trong bộ nhớ; I E. deserialize nó. Có ai biết liệu có một cách dễ dàng để làm điều này, hoặc tôi cần phải viết một số mã phân tích cú pháp XML để làm điều đó bằng tay?

+0

Jez, tại sao tiền thưởng nếu bạn đã trả lời câu hỏi của riêng bạn? –

+0

Tôi đã tìm ra sau khi tôi đặt tiền thưởng. :-) – Jez

+0

ah, hiểu rồi. yeah, tôi sẽ đề nghị nhìn vào trang web cũ của eric trắng trên msdn, tôi nghĩ rằng tôi nhớ nhìn thấy một giải pháp ở đó. tốt để xem nó được tìm ra mặc dù và tài liệu để tham khảo trong tương lai. –

Trả lời

5

tôi đã kết thúc sửa đổi một số mã tôi tìm thấy trực tuyến để tạo ra một phương pháp mà chuyển đổi WordOpenXML để một gói, mà sẽ được lưu vào đĩa:

using System; 
using System.Xml; 
using System.Xml.XPath; 
using System.Text; 
using System.IO; 
using System.IO.Packaging; 

// [...] 
// Call like this: createPackageFromWordOpenXML(wordEditor.WordOpenXML, @"C:\outputFiles\testOut.docx"); 

/// <summary> 
/// Creates a ZIP package (ie. Word's .docx format) from a WordOpenXML string, which is saved to the file at the path specified. 
/// </summary> 
/// <param name="wordOpenXML">The WordOpenXML string to get the ZIP package data from.</param> 
/// <param name="filePath">The path of the file to save the ZIP package to.</param> 
private void createPackageFromWordOpenXML(string wordOpenXML, string filePath) 
{ 
    string packageXmlns = "http://schemas.microsoft.com/office/2006/xmlPackage"; 
    Package newPkg = System.IO.Packaging.ZipPackage.Open(filePath, FileMode.Create); 

    try 
    { 
     XPathDocument xpDocument = new XPathDocument(new StringReader(wordOpenXML)); 
     XPathNavigator xpNavigator = xpDocument.CreateNavigator(); 

     XmlNamespaceManager nsManager = new XmlNamespaceManager(xpNavigator.NameTable); 
     nsManager.AddNamespace("pkg", packageXmlns); 
     XPathNodeIterator xpIterator = xpNavigator.Select("//pkg:part", nsManager); 

     while (xpIterator.MoveNext()) 
     { 
      Uri partUri = new Uri(xpIterator.Current.GetAttribute("name", packageXmlns), UriKind.Relative); 

      PackagePart pkgPart = newPkg.CreatePart(partUri, xpIterator.Current.GetAttribute("contentType", packageXmlns)); 

      // Set this package part's contents to this XML node's inner XML, sans its surrounding xmlData element. 
      string strInnerXml = xpIterator.Current.InnerXml 
       .Replace("<pkg:xmlData xmlns:pkg=\"" + packageXmlns + "\">", "") 
       .Replace("</pkg:xmlData>", ""); 
      byte[] buffer = Encoding.UTF8.GetBytes(strInnerXml); 
      pkgPart.GetStream().Write(buffer, 0, buffer.Length); 
     } 

     newPkg.Flush(); 
    } 
    finally 
    { 
     newPkg.Close(); 
    } 
} 
2

tôi chuyển đổi này để VB.Net và thêm vào một mảnh để đối phó với tệp đính kèm nhị phân. Cảm ơn các tác phẩm xuất sắc!

Public Sub createDocXFromWordOpenXML(ByRef sWordOpenXML As String, ByVal sfilePath As String) 
    Dim sPackageXMLNS As String = "http://schemas.microsoft.com/office/2006/xmlPackage" 
    Dim docxPkg As Package 
    Dim xPathDoc As XPathDocument 
    Dim xpNav As XPathNavigator 
    Dim xNSMgnr As XmlNamespaceManager 
    Dim xpPntr As XPathNodeIterator 
    Dim partURI As Uri 
    Dim pkgPart As PackagePart 
    Dim sInnerXML As String 
    Dim bytBuffer As Byte() 

    docxPkg = System.IO.Packaging.ZipPackage.Open(sfilePath, FileMode.Create) 

    Try 

    xPathDoc = New XPathDocument(New StringReader(sWordOpenXML)) 
    xpNav = xPathDoc.CreateNavigator() 

    xNSMgnr = New XmlNamespaceManager(xpNav.NameTable) 
    xNSMgnr.AddNamespace("pkg", sPackageXMLNS) 
    xpPntr = xpNav.Select("//pkg:part", xNSMgnr) 

    While xpPntr.MoveNext() 
     partURI = New Uri(xpPntr.Current.GetAttribute("name", sPackageXMLNS), UriKind.Relative) 

     pkgPart = docxPkg.CreatePart(partURI, xpPntr.Current.GetAttribute("contentType", sPackageXMLNS)) 

     sInnerXML = xpPntr.Current.InnerXml 

     Select Case True 
     Case sInnerXML.Contains("xmlData") 
      sInnerXML = sInnerXML.Replace("<pkg:xmlData xmlns:pkg=""" & sPackageXMLNS & """>", String.Empty) 
      sInnerXML = sInnerXML.Replace("</pkg:xmlData>", String.Empty) 

      bytBuffer = Encoding.UTF8.GetBytes(sInnerXML) 
      pkgPart.GetStream().Write(bytBuffer, 0, bytBuffer.Length) 
     Case sInnerXML.Contains("binaryData") 
      sInnerXML = sInnerXML.Replace("<pkg:binaryData xmlns:pkg=""" & sPackageXMLNS & """>", String.Empty) 
      sInnerXML = sInnerXML.Replace("</pkg:binaryData>", String.Empty) 

      bytBuffer = Convert.FromBase64String(sInnerXML) 
      pkgPart.GetStream().Write(bytBuffer, 0, bytBuffer.Length) 
     End Select 


    End While 

    docxPkg.Flush() 

    Catch ex As Exception 
    Throw 
    Finally 
    docxPkg.Close() 
    End Try 
End Sub 
Các vấn đề liên quan