c# - 如何将 WordOpenXML 属性转换为 System.IO.Packaging.Package?

标签 c# visual-studio outlook ms-word add-in

我一直在尝试使用 Visual Studio 2008 在 C# 中构建 Outlook 2010 插件。我能够从 获取 Microsoft.Office.Interop.Word.DocumentClass 对象Microsoft.Office.Interop.Outlook.Inspector 对象,表示当前正在编辑的电子邮件。我知道这个 DocumentClass 也用在其他各种上下文中(通常用于 Microsoft Word 扩展,这不足为奇)。

该类有一个名为 WordOpenXML 的属性很有用,它似乎是构成 .docx 包的所有文件的 XML 表示,当将此 Word 文档保存为 .docx

此属性非常有用的一种方式是,如果它可以转换为内存中的 System.IO.Packaging.Package 对象; IE。反序列化它。有谁知道是否有一种简单的方法可以做到这一点,或者我是否需要编写一些 XML 解析代码来手动完成?

最佳答案

我最终修改了我在网上找到的一些代码,以创建一个将 WordOpenXML 转换为一个包的方法,并将其保存到磁盘:

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

关于c# - 如何将 WordOpenXML 属性转换为 System.IO.Packaging.Package?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7608426/

相关文章:

c++ - Visual Studio 2019 "C1001 internal compiler error"仅在发行版中

.net - VS.NET : Project Refs vs. 程序集引用

visual-studio - 是否有用于 Visual Studio 的 session 管理器加载项,可让您保存已打开的文件列表?

c# - 在这个无限 while 循环中应该有 2 个 break 语句

c# - Unity3d 点击并拖动 Gizmos

c# - .NET API 更新包括 ID

html - Outlook 在 HTML 电子邮件中添加空间

c# - JavaScript 函数在 C# 中返回 bool 值

javascript - Node Webkit-通过 outlook 打开和发送电子邮件

vba - 以五秒为间隔发送电子邮件